0

GPS ベース アプリケーションを作成しました。

GPS データを 1 秒ごとに記録したアプリ。アプリは NSTimer を使用して、1 秒ごとに GPS データを取得しました。この NSTimer はバックグラウンドで開始されます。NSTimer は、アプリが APNS からサイレント プッシュ通知を受信したときに開始されます。iOS 7 で、電話が電源ケーブルで接続されているときにタイマーが適切に呼び出されるが、電源ケーブルが接続されていない場合、App がバックグラウンドである間にタイマーが停止するという問題が発生しました。

この問題を解決するためのご意見をお待ちしております。

4

2 に答える 2

3

NSTimerアプリがフォアグラウンドにない場合、 が起動する保証はありません。ケーブルを抜くと、システムはアプリをバックグラウンドにしてバッテリーを節約します。

を使用しNSTimerて位置データを取得する方法はサポートされていません。新しい場所がある場合は、デリゲートCLLocationManagerに伝えます。ポーリングする必要はありません。

バックグラウンドで地理位置情報を追跡する必要がある場合は、Xcode 5 ターゲット設定の機能タブから位置の更新をバックグラウンド モードとして宣言する必要があります。そうしないと、アプリがフォアグラウンドでなくなると、ロケーション マネージャーがロケーション アップデートの配信を停止します。

于 2013-09-30T12:44:56.457 に答える
0

フォアグラウンドで実装できるユース ケースはごくわずかです。審査中にアプリケーションが拒否されたくない場合は、ハックを使用しないでください。もちろん、バックグラウンドで NSTimer を使用することもできますが、バックグラウンド タスクのスレッド (runloop) で作成する必要があります。ただし、このバックグラウンド タスクは一定の時間しか存在しないため、タイマーはこの期間中に起動する必要があります。つまり、最初の目標はバックグラウンド タスクを作成することであり、そうして初めてタイマーを使用できるようになります。目的に適した (このタスクを作成できる) 場合はほとんどありません。なので参考にしてください

   -(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
     NSLog(@"BG fetch in action");
    //the only 30 sec is allowed to perform all your actions 
    //during this period you can each second track GPS data
        [self performSelector:@selector(finishBackgroundFetch:) withObject:completionHandler afterDelay:27];

        [[NSNotificationCenter defaultCenter] postNotificationName:@"StartMyGPSRoutine" object:nil];
    }

    -(void)finishBackgroundFetch:(void (^)(UIBackgroundFetchResult))completionHandler {
        NSLog(@"BG fetch completion handler");
        [[NSNotificationCenter defaultCenter] postNotificationName:@"ForceStopAnyBackgroundTaskCreatedWithStartMyGPSRoutine" object:nil];
        completionHandler(UIBackgroundFetchResultNewData);
    }

アプリケーション デリゲートの - これは、重要な場所の変更を監視するだけでなく、あなたの場合に役立ちます。あなたはどこにでも置くべきです:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(setMinimumBackgroundFetchInterval:)]) {
            NSLog(@"Set Force BG interval to %ld", interval);
            [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:interval];
} 

私の場合、5 分ごとに GPS データをフェッチするので、このタスクを完了するのに 27 秒はそれほど長くありません。とにかく、XCode を使用して時間間隔で遊ぶことができます。Main Menu->Debug->Simulate Background Fetch を参照してください。

于 2014-05-23T12:05:24.630 に答える