アプリをバックグラウンド状態で実行し続けるために使用しているテスト コードがいくつかあります。これは、iOS 5.1 シミュレーターでは非常にうまく機能しますが、実際のデバイスではそのように動作しません。
これで、従わなければならない要件がすでにわかっているので、「バックグラウンドモード」をvoipと場所に設定しました。
私のデリゲートのapplicationDidEnterBackgroundメソッドでは、アプリケーションがバックグラウンドで長時間実行されるタスクを完了する時間を要求するために、「doBackgroundActivity()」を呼び出す次の関数を呼び出しています。
-(void) threadedMethod{
while(true){
NSLog(@"looping");
[self showLocalNotification:@"This notification will come every 2 min. if the app is running in background. Close it!"];
[NSThread sleepForTimeInterval: (5)]; // 60 sec = 1 min
}
}
-(void) doBackgroundActivity{
self->_backgroundTask = [ [UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask: self->_backgroundTask];
self->_backgroundTask = UIBackgroundTaskInvalid;
}
];
[self threadedMethod];
[[UIApplication sharedApplication] endBackgroundTask:self->_backgroundTask];
self->_backgroundTask = UIBackgroundTaskInvalid;
}
ご覧のとおり、doBackgroundAcitivity() は threadedMethod() を呼び出すだけで、5 秒ごとにローカル通知を送信する無限ループを実行するだけです。
シミュレーターでこれを実行し、アプリを最小化すると、5 秒ごとに通知が表示されます。他のアプリケーションを実行しているときでも、アプリケーションはバックグラウンドで実行され続け、アプリが通知を送信しているのが見えます。
しかし、これはデバイスでは発生していません。最初の通知が送信された直後に OS がアプリを強制終了したように見えますが、後で表示されるはずの後続の通知が表示されませんか?
アプリケーションをバックグラウンドで実行し続けるために他に何かしなければならないことはありますか?