0

アプリがバックグラウンドにある間にユーザーの位置を送信したい。アプリでは、ユーザーは 1 分から 24 時間までのタイマーを設定できます。アプリをバックグラウンドで実行しようとしましたが、10 分間しか動作しません。タイマーを 10 分以上設定してからアプリをバックグラウンドにすると、アプリはバックグラウンドで 10 分以上実行されません。アプリを 10 分以上実行することは可能ですか? 最長で2時間?

これが私が試したことです:

これを私のplistに追加しました:

ここに画像の説明を入力

これをメソッドに追加しましたapplicationDidEnterBackground:

    __weak BADAppDelegate * weakSelf = self;
    self.backgroundTaskIdentifier =
    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        int timeTilDone = timerSeconds;// two hours

        self.bgTimer =
        [NSTimer timerWithTimeInterval:timeTilDone
                                target:weakSelf
                              selector:@selector(startTrackLocation)
                              userInfo:nil
                               repeats:NO];

        [[NSRunLoop mainRunLoop] addTimer:self.bgTimer
                                  forMode:NSDefaultRunLoopMode];


        self.testTimer =
        [NSTimer timerWithTimeInterval:60
                                target:weakSelf
                              selector:@selector(playSilentSound)
                              userInfo:nil
                               repeats:YES];

        [[NSRunLoop mainRunLoop] addTimer:self.testTimer
                                  forMode:NSDefaultRunLoopMode];


    });

毎分音を鳴らして強制的に生き残らせようとした

-(void)playSilentSound
{
if(self.silentSnd == nil)
{
    NSString *soundFile;
    if ((soundFile = [[NSBundle mainBundle] pathForResource:@"halfsec" ofType:@"caf"]))
    {
        NSURL *url = [[NSURL alloc] initFileURLWithPath:soundFile];
        self.silentSnd = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
        self.silentSnd.delegate = self;
        [self.silentSnd setNumberOfLoops:1];
    }
}

[self.silentSnd prepareToPlay];
[self.silentSnd play];
}

しかし、それは役に立ちません。

ありがとう!

アップデート:

これが私のlocationManager初期コードです:

    NSLog(@"StartTrackLocation");
    if(self.locationManager == nil)
    {
        self.locationManager = [[CLLocationManager alloc] init];
    }
    self.locationManager.delegate = self;
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.pausesLocationUpdatesAutomatically = NO;
    [self.locationManager startUpdatingLocation];
4

2 に答える 2

1

初期設定でCLLocationManagerプロパティpausesLocationUpdatesAutomaticallyを false に設定します。
true に設定すると、Apple はユーザーが GPS を必要としないと判断し、そのサービスをシャットダウンします。

iOS のメジャー アップデートごとに、 CLLocationManager クラス リファレンスの行ごとに 1 行ずつ読むことを強くお勧めします(次は 7.0 になります)。

(あなたの質問は実際には文書化されていませんが)

あなたの方法を忘れてくださいbeginBackgroundTaskWithExpirationHandler、それは必要ありません。

于 2013-08-05T19:40:31.850 に答える
1

場所を追跡するには、システムに更新が必要であることを伝える必要があります。startUpdatingLocationこれを行うには、 (きめ細かい更新を取得するため) および/またはstartMonitoringSignificantLocationChanges(エネルギー コストは低いが頻度の低い更新を取得するため、最大 500m の変更、通常はユーザーがセル タワーを変更する場合)を呼び出します。両方を使用するのが一般的です (...SignificantChanges終了した場合は起動しますが、起動しstartUpdatingLocationないため)。で地域を設定することもできstartMonitoringForRegion:、ユーザーがそこに出入りするとアラートが表示されます。

それを超えて、タイマーなどでシステムを裏切ろうとしています。それはあなたを困らせる傾向があるだけです。

とはいえ、最も一般的なケースでは、特定のリクエストは不可能です。「こんな時間に起きたい」なんて言えない。これは iOS 6 で解決できる問題ではありません。言えることは、あなたは位置情報アプリであり、位置情報を常に更新しているということです。その後、場所が更新されるたびに、何かをする時が来たかどうかを確認できます。しかし、ユーザーが何時間もじっと座っていて、あなたがバックグラウンドにいる場合 (特にあなたが終了している場合)、目を覚ます方法はありません。

リリースされていないバージョンの iOS では、この問題の解決策があるかもしれませんが、開発者のフォーラムで議論する必要があります。

于 2013-08-05T19:58:29.047 に答える