1

バックグラウンドで実行するアプリがあり、バックグラウンドモードに入ってから30分後にすべての位置情報サービスを停止したいと思います。

だから私のバックグラウンド関数では、これを行います:

// 1800 sec = 30 min * 60 sec.
NSDate *date30min = [[NSDate alloc] initWithTimeIntervalSinceNow:1800.0];
NSLog(@"Date30min : %@", date30min);

self.timer = [[NSTimer alloc] initWithFireDate:date30min interval:1 target:self selector:@selector(stopLocation) userInfo:nil repeats:NO];

そして私のstopLocation関数は:

- (void)stopLocation
{
    NSLog(@"[My APP] [PASS INTO stopLocation]");
    [self.locationManager stopMonitoringSignificantLocationChanges];
    [self.locationManager stopUpdatingLocation];
    [self.locationManager stopUpdatingHeading];
}

しかし、私のタイマーは関数を呼び出さないので、私のエラーは何ですか?(私の関数は.hおよび.mファイルに正しく実装されています。これをバックグラウンド関数からテストしました。

助けてください..

4

1 に答える 1

2

実行ループ(この場合)にタイマーを追加するのを忘れても問題ありません。

NSTimerアプリがバックグラウンドに入っても、オブジェクトは起動しません。したがって、バックグラウンドの30分後に何かを実行したい場合は、別の手法を使用します。

たとえば、バックグラウンドタスクstopLocationを使用して、後でメソッドを実行します。

- (void)applicationDidEnterBackground:(UIApplication *)application {       

    __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
         NSLog(@" expiration handler!"); 
    }];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 30 * 60 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{

         [self stopLocation];

         // we're done with this task now
         [application endBackgroundTask: bgTask]; 
         bgTask = UIBackgroundTaskInvalid;
    });
}

もちろん、これも宣言する必要があります。

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

あなたのInfo.plistファイルにありますが、私はあなたがすでにそれを理解していると思います。

于 2012-09-06T21:32:34.123 に答える