4

Apple の「アプリの状態とマルチタスキング」のドキュメント(セクション「バックグラウンドに移動するときに行うこと」) には、アプリがバックグラウンドに移行したときの保存について次のように記載されています。

ユーザー データとアプリの状態情報を保存します。バックグラウンドに入るときに、保存されていないすべての変更をディスクに書き込む必要があります。この手順が必要なのは、さまざまな理由でバックグラウンドにある間にアプリが静かに強制終了される可能性があるためです。この操作は、必要に応じてバックグラウンド スレッドから実行できます。

たとえば、次のように時間がかかる保存などのディスパッチ操作を開始するとapplicationDidEnterBackground:、ホームボタンを押したときに NSLog 出力が得られません。アプリに戻ると、NSLog 出力が表示されます。

- (void)applicationDidEnterBackground:(UIApplication *)application {
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         [self performOperation];
         NSLog(@"Operation finished");
      });
}

performOperationメソッドが完全に実行されたか、アプリがスリープ モードに入ったときに中断されたかを確認できますか?

4

2 に答える 2

6

が確実に呼び出されるように、plistキー設定UIApplicationExitsOnSuspendが no に設定されていることを確認してください。applicationDidEnterBackground

次に、実行時間の長いタスクを開始してください。あなたの場合、次のようになります。

- (void)applicationDidEnterBackground:(UIApplication *)application {
   UIBackgroundTaskIdentifier __block bgTask = nil;
   UIApplication  *app = [UIApplication sharedApplication];
   bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
         [app endBackgroundTask:bgTask]; 
         bgTask = UIBackgroundTaskInvalid;
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         [self performOperation];
         NSLog(@"Operation finished");
     });
 }

こうすることで、終了するまで 10 分間ハングアップするようにアプリに指示したことになります。10 分が経過すると、有効期限ハンドラーが呼び出されます。

さらに、必要なバックグラウンド モード キーを設定して、より多くの時間を取得できます。これには、上で述べたものを使用する時間を増やすことができる多くのハックとバリエーションがあります.

于 2013-03-04T23:02:11.530 に答える
0

念のため、別の種類のログを使用します。

柔軟な iOS ロギング

このログをプロジェクトに追加すると、デバッグ中かどうかに関係なく、[オーガナイザー] -> [デバイス] -> [デバイス] -> コンソールに移動して、プロジェクトのログを確認できます。

これが最善の方法だと思います。何かをデバッグできるかどうかわからないときは、大いに役立ちました。

于 2013-03-04T23:06:39.783 に答える