1

アプリにこのコードがあります-

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    ...
    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                [application endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            }
    }];
    //NO MORE CODE AFTER THAT
}

外部ソースからのいくつかのイベントを処理するために、アプリのバックグラウンドでの実行時間を延長したいだけです。このコードをアプリで使用すると、アプリがログでクラッシュすることがあります -

[app-name]には、許可された時間を超えてアクティブなアサーションがあります

誰でもこれで私を助けることができますか?

クラッシュしても、ユーザーには影響しません。アプリがバックグラウンドにあるため、ユーザーはクラッシュについて知ることはありません。ただアプリストアのレビューで拒否されるのが気になります。緊急の助けが必要です!:(

EDIT: 私のアプリは、非同期TCPソケットを介した外部デバイスへの通信です。上記のコードでは、アプリをバックグラウンドに送信すると、さらに 10 分間データを受信します。アプリをフォアグラウンドに移動してから 10 分後、アプリはまだ閉じていませんが、ソケット接続が切断されたことが示されています。そのため、アプリが 10 分後にフォアグラウンドになるとすぐに、接続の再確立が開始されます。

これは、テスト ケースの約 80% で発生します。残りの 20% は、前述のクラッシュにつながります。

4

1 に答える 1

1

バックグラウンドでメインスレッドでどのような作業を行っていますか? ブロックしている場合、有効期限ハンドラー ブロックは呼び出されません。つまり、次のようになります。

アプリケーションの残りのバックグラウンド時間が 0 になる直前に呼び出されるハンドラー。このハンドラーを使用して、バックグラウンド タスクをクリーンアップし、終了をマークする必要があります。タスクを明示的に終了しないと、アプリケーションが終了します。ハンドラーはメイン スレッドで同期的に呼び出されるため、アプリケーションに通知されている間、アプリケーションの中断が一時的にブロックされます。

これにより、バックグラウンド タスクを時間内に終了できなかったとして、ウォッチドッグがあなたを傷つけます。

于 2013-03-28T16:46:10.060 に答える