0

特定の間隔でアプリをフォアグラウンドで実行し続ける方法があるかどうかを知りたいです。

正確に 3 分間実行されているスレッドがあり、ユーザーがアプリを離れられないようにする必要があります。そのようなことが不可能な場合は、別の質問をするつもりです。

メソッドを使用して必要なデータを保存するため、ユーザーがアプリをバックグラウンド モードに設定できるようにすることはできapplicationDidEnterBackground:(UIApplication *)applicationますが、ユーザーが電源ボタンをクリックした場合、どのようにデータを保存できますか?

と呼ばれるapplicationWillTerminate:(UIApplication *)applicationでしょうか?解決策はありますか?

4

2 に答える 2

2

を調べるとbeginBackgroundTaskWithExpirationHandler、アプリがバックグラウンドでタスクを完了するために追加の処理時間を要求できるようになります。

つまり、あなたがしようとしていることはお勧めできません。予期しない終了や障害が発生した場合に、アプリが 3 分間のタスクから回復できることを確認する必要があります。たとえば、アプリが予期せずクラッシュしたり、メモリ不足が原因で終了したりする可能性があります。このような場合、applicationWillTerminateまたはへのコールバックは取得されませんapplicationDidEnterBackground

したがって、私の推奨事項は、iOS のバックグラウンド タスク サポートを使用して、ユーザーがアプリを離れた場合にバックグラウンドで保存を続行することを検討することですが、システムによってアプリが終了された場合でも、タスクが回復可能であることを警告せずに/できることを確認することです。安全に巻き戻します。

于 2013-03-11T09:54:37.613 に答える
0

beginBackgroundTaskWithExpirationHandlerプロセスを生きたまま処理するために使用する必要があります。このコードを使用してください。

ここで、applicationDidEnterBackground:(UIApplication *)application からこのメソッドを呼び出して、アプリケーションがバックグラウンドまたは UIApplicationStateInactive (電源ボタンを押す) に入ってもデータを SQlite に保存します。application.backgroundTimeRemaining が 0 になると、IOS 標準に従って保存プロセスが 10 分間続行されます。ローカル通知を 1 つ投稿して、プロセスを維持するためにアプリケーションをフォアグラウンドに表示します。このコードを使用して、プロセスをカスタマイズしてください。

-(void)handleBackgroundSavingingProcess:(UIApplication *)application
    {
        NSLog(@"background task remaining time before background %f",application.backgroundTimeRemaining);

        if ((([application applicationState] == UIApplicationStateBackground) || ([application applicationState] == UIApplicationStateInactive)) && [application respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)])
  {


     self.bgTaskId = [application beginBackgroundTaskWithExpirationHandler:^{
     // Synchronize the cleanup call on the main thread in case
     // the task actually finishes at around the same time.
                NSLog(@"background task remaining time in expiration handler %f",application.backgroundTimeRemaining);

                dispatch_queue_t concurrentQueue;
                if([[[UIDevice currentDevice] systemVersion] doubleValue] >= 5.0)
                    concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL);
                else
                    concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0UL);

                if (concurrentQueue == nil)
                    return;

                dispatch_async(concurrentQueue, ^{

                    if (self.bgTaskId != UIBackgroundTaskInvalid){
                        NSLog(@"background task remaining time in dispatch queue %f",application.backgroundTimeRemaining);
                        NSLog(@" Downloading status %d",self.isDownloadingInComplete);
                        if(self.isDownloadingInComplete)
                        {
                            [application presentLocalNotificationNow:localNotification];
                            NSLog(@"Local notification fired.");
                        }
                        [DataManager managedObjectContext] save:nil];
                        [application endBackgroundTask:self.bgTaskId];
                        self.bgTaskId = UIBackgroundTaskInvalid;
                        NSLog(@"Initialization invalid.");
                    }
                });
            }];
        }

    }
于 2013-03-11T10:21:44.747 に答える