ユーザーがホーム画面にアクセスするたびに、私の iOS アプリが自動再起動する可能性はありますか? これはジェイルブレイクされたデバイス用です。アプリは App Store 向けではありません。
一般に、アプリ外での特定のユーザー アクションを考慮して、アプリを再起動するにはどうすればよいですか?
ユーザーがホーム画面にアクセスするたびに、私の iOS アプリが自動再起動する可能性はありますか? これはジェイルブレイクされたデバイス用です。アプリは App Store 向けではありません。
一般に、アプリ外での特定のユーザー アクションを考慮して、アプリを再起動するにはどうすればよいですか?
特定の加速度計の条件に遭遇したときにアプリを実行することだけが必要な場合は、それを使用できますActivator
。Activator はRyan Petrichによる素晴らしいアプリで、Cydia で無料で入手できます。特定のユーザー アクションが実行されるたびに任意のアプリ (またはトグル) を実行するようにデバイスを構成できます。それは、ホームボタンを押す、電源/ロックボタンを押す、または加速度計の揺れである可能性があります.
基本的なシェイクが必要ない場合、または多くのユーザーに提供するアプリを作成していて、Activator を自分でセットアップする必要がない場合は、おそらく自分でコードを記述する必要があります。
たとえば、メインの UI アプリに加えてLaunch Daemonを作成し、起動デーモンに加速度計を監視させることができます。
関心のある特定の種類のモーションを検出したら、コマンドで UI アプリを起動できますopen
。自分で使用する場合は、open
Cydia からパッケージをダウンロードしてください。open
これが他の人へのリリース用である場合は、アプリがインストールされていることを確認するためにアプリが依存していることを確認してください。たとえば、Debian .deb パッケージでパッケージ化する場合、DEBIAN/control ファイルは次のようになります。
Depends: open
アプリをインストールするユーザーがopen
、アプリに必要な も自動的に取得できるようにします。
他の問題は、ユーザーが電話のロックを解除したときにアプリを起動することに関するものです。繰り返しますが、Launch Daemon を使用してこの状態をリッスンします。iOS 5 で、電話のロックを解除すると、次の通知が表示されます。
傍受された通知: com.apple.springboard.lockstate
(これnotificationWatcher
は、コマンド ラインからユーティリティを実行し、電話に SSH 接続することで検出されました。NotificationWatcher は、Erica Sadun のErica Utilitiesパッケージの一部として、Cydia からも入手できます)
だから、私はあなたの起動デーモンが のダーウィン通知に登録するようにします"com.apple.springboard.lockstate"
。このようなもの:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
self, // observer: can be NULL if callback doesn't need self
onLockStateChanged, // callback
CFSTR("com.apple.springboard.lockstate"), // name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
コールバック関数は次のとおりです。
static void onLockStateChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
// if you need access to member data (ivars):
MyLaunchDaemon* this = (MyLaunchDaemon*)observer;
//if (userInfo != nil) {
// CFShow(userInfo);
//}
NSDictionary* info = (NSDictionary*)userInfo;
// I'm not sure if the userInfo object has any useful
// description for the lock state event
if (/* unlocked */) {
// force app to open, or resume from the background
system("/usr/bin/open com.mycompany.MyAppName");
}
}
画面がロックまたはロック解除されたときにこの同じ通知が表示されるため、起動デーモンでロック/ロック解除状態を追跡するか、userInfo
オブジェクトを検査して、これがロックまたはロック解除イベントであるかどうかを確認する必要がある場合があります. きっと他の方法もあると思います。
更新:画面がロックされているかロック解除されているときに通知が発生するかを整理するのに役立ちたい場合は、この他のSO回答で私の更新2 を見ることができます。 イベントがオン イベントかオフ イベントかを判断するために使用できます。notify_get_state()
UIApplicationExitsOnSuspend
アプリの Info.plist ファイルで の値を YES に設定します。
UIApplicationExitsOnSuspend (Boolean - iOS) は、終了時にアプリをバックグラウンドに移動するのではなく、終了する必要があることを指定します。iOS SDK 4.0 以降にリンクされたアプリには、このキーを含め、その値を YES に設定して、バックグラウンド実行とアプリの一時停止に自動的にオプトインされるのを防ぐことができます。