プッシュ通知を使用してアプリをトリガーし、一定の間隔でコードを実行する (特に、サーバーから新しいメッセージをプルする) 代わりに、Apple が承認した優れた代替手段はありますか?
- VoIP アプリに偽装することは適切なオプションではありません (承認されません。iPhone: バックグラウンド タスクの繰り返しを参照してください) 。
- 位置情報の更新を使用できません。ユーザーが移動しなければ機能するはずです
シミュレーターではbeginBackgroundTaskWithExpirationHandler
withdispatch_async
を使用すると 10 分のバックグラウンド時間が得られ、バックグラウンドが「自動的に再起動」すると、backgroundTimeRemaining
プロパティは常に 10 分にリセットされるように見えることがわかりました。これがコードです。
- (void) work
{
UIApplication *application = [UIApplication sharedApplication];
NSLog(@"bg %@ (T-%.1f seconds)",
[NSDate date],
[application backgroundTimeRemaining]);
sleep(10);
[application endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
[self startTask];
}
- (void)startTask
{
UIApplication *application = [UIApplication sharedApplication];
_bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"expired at %@", [NSDate date]);
[application endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,
0),
^{ [self work]; });
}
- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
/* ... */
[self startTask];
/* ... */
}
バックグラウンドで何かを実行することは、受け入れられる慣行でしょうか? つまり、ほとんどの場合sleep(...)
、ネットワーク リクエストを繰り返したり、何か役に立つことをしたりするまではそうしますが、アプリが実際に完全なバックグラウンド モードになることは決してありません。誰もこのアプローチの経験がありますか? ヒント: 他のアプリが実行されていないシミュレーターでのみテストされています。