5


アプリがバックグラウンド状態になったときに何らかの処理を行っています。beginBackgroundTaskWithExpirationHandler()の下に配置したため、同じために 10 分を割り当てる必要があります。ただし、その前にアプリが停止されていると思います。私が実行しているタスクはメモリと CPU を集中的に使用するため、OS がアプリをサスペンド状態にしている可能性はありますか?
もしそうなら、これらの制限を回避する方法はありますか。(私はプライベート API を使用することにオープンです)。

バックグラウンド タスクを開始するためのコードは次のとおりです。

   if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]){

        if([[UIDevice currentDevice] isMultitaskingSupported]){
            __block UIBackgroundTaskIdentifier bgTask;
            UIApplication *application = [UIApplication sharedApplication];
            bgTask = [application beginBackgroundTaskWithExpirationHandler:^{

                    [application endBackgroundTask:bgTask];
                    bgTask = UIBackgroundTaskInvalid;
            }];

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                [self captureImage];
                [application endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            });
        }
    }
4

2 に答える 2

2

Daij-Danが完全に正しいかどうかはわかりません。

この部分は私が彼に同意します:

the os may kill you at any time when its pressured.

しかし、「プレッシャー」という言葉はかなり曖昧です。そして、合法的にもっと時間を要求したアプリを一時停止することには、多くのプレッシャー(例としてメモリが少ない)があるはずだと思います。一方では、それは実際のシナリオの場合です。一方、それはそれほど頻繁には起こりません(iOSデバイスは最近かなり多くのメモリを持っています)。

ドキュメント(http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html)から:

このメソッドへの各呼び出しは、endBackgroundTask:メソッドへの一致する呼び出しによってバランスを取る必要があります。バックグラウンドタスクを実行しているアプリケーションには、それらを実行するための有限の時間があります。(backgroundTimeRemainingプロパティを使用して、使用可能な時間を確認できます。)endBackgroundTaskを呼び出さない場合:時間が経過する前にタスクごとに、システムはアプリケーションを強制終了します。ハンドラーパラメーターでブロックオブジェクトを指定すると、システムは時間が経過する前にハンドラーを呼び出して、タスクを終了する機会を与えます。

私がお勧めします:

  • 完了ハンドラーにいくつかのログを追加します
  • ロジックを使用してログにログを追加します(backgroundTimeremainingを含む)

また、アプリが一時停止された場合は、システムコンソールのログを確認してください。

PSこれはパブリックAPIであるため、iphone-privateapiタグを削除しました。

于 2012-12-14T20:02:55.627 に答える
1

OSは、圧力がかかったときにいつでもあなたを殺す可能性があります。10分程度の保証はありません。(:Dを実行すると、はるかに長く実行することもできます)

iOSにアプリを強制的に実行させる方法はありませんAFAIK

于 2012-12-14T15:47:29.763 に答える