0

これは、アプリケーションがバックグラウンドになったときにバックグラウンド タスクを開始する方法です。

   void applicationDidEnterBackground:(UIApplication *)application
{
    btId = UIBackgroundTaskInvalid;
    UIApplication* cuiApplication = [UIApplication sharedApplication];

    void (^backgroundTimeRemainingExtenderHandler)() = ^() {

        NSTimeInterval timeRemaining1 = [cuiApplication backgroundTimeRemaining];

        if(btId != UIBackgroundTaskInvalid){
            [proximityEngine StopEngine];
            [cuiApplication endBackgroundTask:btId];
            btId = UIBackgroundTaskInvalid;
        }
    };

    btId= [cuiApplication beginBackgroundTaskWithExpirationHandler:backgroundTimeRemainingExtenderHandler];

    if(bgmanager != nil){
        [bgmanager BeginBackgroundTaskMainLoop];
    } 
}

私の問題は、バックグラウンドタスクが呼び出すときです:

NSURLConnection sendSynchronousRequest

残り時間が残っているにもかかわらず、期限切れブロックが呼び出されています。これを防ぐにはどうすればよいですか?

よろしく ,

ジェームズ

編集 :

以下の回答を読んだ後: 残り時間を照会すると、まだ 596 秒残っていますが、IOS は有効期限ブロック ハンドラを呼び出します。

4

2 に答える 2

1

私の特定のケースでは、なぜそのように振る舞ったのかよくわかりませんが、beginbackgroundtask スレッドとは別のスレッドでタスクを実行しました。そのスレッドで sendsync が返された後、backgroundtask は OS によって中断されました。beginbackground のオリジナルスレッドで sendsync を呼び出すと、発生しません。それが論理的なものなのか、私が何か間違ったことをしたのか、OSのバグなのかはわかりません。

于 2012-07-21T00:38:42.530 に答える
1

beginBackgroundTaskWithExpirationHandler:これは、アプリがバックグラウンドに移行した結果、後片付けを行うために少し余分なバックグラウンド時間を要求する手段です。ただし、iOS は提供する時間を決定する権利を留保し、必要な時間内に終了できなかった場合はプロセスを強制終了します。

バックグラウンドで無期限に実行することはできず、独自の時間制限を選択することもできません。割り当てられたものを照会できますbackgroundTimeRemainingが、それはほぼ完全です。

ドキュメントによる、ハンドラーは「アプリケーションの残りのバックグラウンド時間が 0 になる少し前」に呼び出されます。したがって、完全にゼロではないことを期待する必要がbackgroundTimeRemainingあります。

そうは言っても、URL 接続がまだ完了していない場合は、どこかに完了していないことを書き留めておき、次にバックグラウンドから戻ったときに、通常は再試行してエラーに対処することを意図しています。それが有効期限ハンドラーが行うべきことであり、迅速に行う必要があります。

ただし、アプリに割り当てられた余分な時間は交渉の余地がありません。

于 2012-07-06T01:27:20.593 に答える