4

私は現在、位置追跡と位置に関するデータのサーバーへの送信に依存するアプリケーションを作成しています。ただし、問題は、24 時間年中無休で実行する必要があり、現在、2 ~ 3 日ごとにランダムなクラッシュが発生することです。アプリケーションを常にバックグラウンドで実行するために行ったことは、applicationDidEnterBackground メソッドのすぐ横にある beginBackgroundTaskWithExpirationHandler メソッドに NSTimer を配置することです。タイマーは毎分実行され、位置情報サービスを停止/開始します。

クラッシュ ログの例を次に示します。

コードは基本的に次のようになります。

UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTaskId = 0;

bgTaskId = [app beginBackgroundTaskWithExpirationHandler:^{
    NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1 * 60.0 target: self selector: @selector(onTick) userInfo: nil repeats: YES];
    [t fire];

    if (bgTaskId != UIBackgroundTaskInvalid){
        [app endBackgroundTask: bgTaskId];

        bgTaskId = UIBackgroundTaskInvalid;
    }
}];

接続の目的でGCDAsyncSocketsを使用しています。各呼び出しのタイムアウトは約 30 秒です。

私は本当にアイデアがありません。クラッシュが発生する理由は何ですか?

4

1 に答える 1

4

あなたのタイマーはおそらく、タスクが無効化された後([UIApplication sharedApplication].backgroundTimeRemaining0になった後)に起動しています。

問題は、アプリケーションを常にバックグラウンドで実行することはできないということです。ときどきコードを実行したい場合、唯一のオプションはバックグラウンド ロケーション API を使用することであり、アプリがその plist でロケーションバックグラウンド モードを使用するように設定します。コールバックを取得し、それらのメソッドが呼び出されたときに何らかの作業を行う時間があります。CLLocationManagerDelegate

バックグラウンド モードに関する Apple のドキュメントを参照してください: http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

位置認識マニュアル: http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009497

于 2012-06-01T19:39:09.103 に答える