0

アプリをバックグラウンド状態で実行し続けるために使用しているテスト コードがいくつかあります。これは、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 がアプリを強制終了したように見えますが、後で表示されるはずの後続の通知が表示されませんか?

アプリケーションをバックグラウンドで実行し続けるために他に何かしなければならないことはありますか?

4

1 に答える 1

0

アプリを閉じている間にユーザーに通知を表示するだけの場合は、UILocalNotificationsを使用する必要があります。

通知が発生するタイミング、繰り返すかどうか、および繰り返す間隔を設定できます。

補足として、コードがそのように実行されるタイミングを制御するためにループで sleep() を使用することはお勧めしません。これは、スレッドが何も実行するのをまったく停止し、そのスレッドを使用したい他のタスクにとって悪いためです。 . 代わりに、NSTimers、およびコードが実行される時間を制御する他の方法を使用する必要があります。

于 2012-06-15T04:27:38.997 に答える