12

テスト目的でのみベンチマークアプリを作成しています。これを App Store に公開するつもりはありません。

もちろん、UIBackgroundTaskIdentifierを使用してバックグラウンドで実行し続け、データをCore Data dbに保存し、最終的にデータをサーバーにプッシュします(私はParseを使用しています)。

したがって、基本的に、私の特定のケースに当てはまる質問は見つかりませんでした。私はNSTimerを次のように設定しました:

    UIBackgroundTaskIdentifier bgTask;
UIApplication  *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask]; 
}];

self.timer = [NSTimer scheduledTimerWithTimeInterval:self.localInterval target:self selector:@selector(updateCoreData:) userInfo:nil repeats:YES];

メソッド updateCoreData は単に Core Data クラスを呼び出し、必要な挿入を行います。

VoIP と音楽再生部分について読んだことがありますが、どちらが私のケースに最も適しているか、またそれらを実装する方法が正確にはわかりません。

4

2 に答える 2

38

同様の問題を抱えている他の人のために、私が最初にしたことは、Info.plistファイルの場所の更新フラグをオンにすることでした。これを行うには、Xcode 4 で「Required Background Modes」というキーを追加し、値として「アプリが位置情報の更新を登録する」を選択する必要があります。

.h ファイルで次のように宣言されたタイマーがあります。

NSTimer *silenceTimer;
@property (nonatomic, retain) NSTimer *silenceTimer;

次に、.m ファイルで、次のように宣言しました。

UIBackgroundTaskIdentifier bgTask;
UIApplication  *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask]; 
}];
self.silenceTimer = [NSTimer scheduledTimerWithTimeInterval:300 target:self
selector:@selector(startLocationServices) userInfo:nil repeats:YES];

最後に、セレクター メソッドで、次のようにしました。

-(void)startLocationServices {
    [locationManager startUpdatingLocation];
    [locationManager stopUpdatingLocation];
}

これにより、位置情報サービスを開始して 5 分後にすぐに停止するタイマーが作成されます。これは、プロセスを強制終了しない限り、アプリが無期限に存続するのに十分です。

于 2012-03-08T19:18:26.530 に答える
2

XCode 6.3.1、iOS 8.3 用

アプリ間で遭遇した大きな違いがあります。デバッガーと同じアプリを使用して、XCode を実行している Mac に接続している間の動作。抜き差し時の挙動。

現在の iOS バージョン 8.3 では、有効期限ハンドラーを使用した有限の長時間実行タスクのバックグラウンドでの実行にアプリに割り当てられる最大時間は 180 秒です。

何を試しても、スマートフォンのプラグが抜かれていると、アプリは 180 秒以内にシステムによって強制終了されます。これを確認するために、かなりの量のテストとトリックを行いました。私の投稿を見て...

私のNSTimer投稿

これは、アプリが終了するまでの残り時間を確認するための便利な方法です。この時間は保証されないことに注意してください。

NSTimeInterval backgroundTimeRemaining = [[UIApplication sharedApplication] backgroundTimeRemaining];

if (backgroundTimeRemaining == DBL_MAX)
{
    NSLog(@"background time remaining = undetermined");
}
else
{
    NSLog(@"background time remaining = %0.2f sec.", backgroundTimeRemaining);
}

これがあなたの調査に役立つことを願っています。乾杯!

于 2015-06-25T21:33:58.563 に答える