6

位置情報サービスを使用して、アプリをバックグラウンドで実行し続けたいと考えています。このために私は使用しました:

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

    [locationManager stopUpdatingLocation];
    [locationManager startUpdatingLocation];

    //timer=[NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(UpdateLocation) userInfo:nil repeats:YES];

}

しかし、使用するNSTimerと呼び出されませんUpdateLocation。別の方法で呼び出してみましたが、一度しか呼び出されませんでした。

アプリをバックグラウンドで継続的に実行し、一定の時間間隔で位置を検出したいと考えています。

4

3 に答える 3

6

私が開発しているアプリケーションでこれを行いました。アプリがバックグラウンドにある場合、タイマーは機能しませんが、アプリは常に位置情報の更新を受信して​​います。ドキュメントのどこかで読んだことがあります(今は見つからないようです。更新を投稿します)。アプリがバックグラウンドにある場合、アクティブな実行ループでのみメソッドを呼び出すことができます。アプリデリゲートにはbgでもアクティブな実行ループがあるため、これを機能させるために独自のループを作成する必要はありません。[これが正しい説明であるかどうかはわかりませんが、私が読んだことからそれがどのように理解されたかです]

まず、アプリのinfo.plistにキー「BackgroundModes」の「location」オブジェクトを追加します。今、あなたがする必要があるのはあなたのアプリのどこでも位置の更新を開始することです:

CLLocationManager locationManager = [[CLLocationManager alloc] init];

locationManager.delegate = self;//or whatever class you have for managing location

[locationManager startUpdatingLocation];

次に、アプリデリゲートで、場所の更新を処理するメソッド、たとえば-(void)didUpdateToLocation:(CLLocation *)locationを記述します。次に、ロケーションマネージャを開始したクラスにCLLocationManagerDelegateのメソッドlocationManager:didUpdateLocation:fromLocationを実装します(ロケーションマネージャデリゲートを「self」に設定したため)。このメソッド内では、位置の更新を処理する必要がある時間間隔が経過したかどうかを確認する必要があります。これを行うには、毎回現在の時刻を保存します。その時間が経過した場合は、アプリデリゲートからメソッドUpdateLocationを呼び出します。

NSDate *newLocationTimestamp = newLocation.timestamp;
NSDate *lastLocationUpdateTiemstamp;

int locationUpdateInterval = 300;//5 mins

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if (userDefaults) {

        lastLocationUpdateTiemstamp = [userDefaults objectForKey:kLastLocationUpdateTimestamp];

        if (!([newLocationTimestamp timeIntervalSinceDate:lastLocationUpdateTiemstamp] < locationUpdateInterval)) {
            //NSLog(@"New Location: %@", newLocation);
            [(AppDelegate*)[UIApplication sharedApplication].delegate didUpdateToLocation:newLocation];
            [userDefaults setObject:newLocationTimestamp forKey:kLastLocationUpdateTimestamp];
        }
    }
}

これにより、アプリがバックグラウンドにある場合でも、5分ごとにメソッドが呼び出されます。Imp:この実装はバッテリーを消耗します。位置データの精度が重要でない場合は、[locationManagerstartMonitoringSignificantLocationChanges]を使用する必要があります。

これをアプリに追加する前に、 http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.htmlにあるLocationAwarenessプログラミングガイドをお読みください。

于 2011-06-23T07:38:00.047 に答える
0

これは答えが非常に遅いことを知っています。それでも答えが得られない場合は、これが私が行ったことであり、私のアプリはバックグラウンドで継続的に実行されます。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
     UIApplication *app = [UIApplication sharedApplication];
     UIBackgroundTaskIdentifier bgTask = 0;

     backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self  selector:@selector(backgroundTask) userInfo:nil repeats:YES];

     bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];
}

ここで、 backgroundTaskメソッドで必要なことを行います。

于 2012-12-20T06:38:21.787 に答える
0

特定のタスクのバックグラウンドでアプリを実行するために使用できます。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIApplication *app = [UIApplication sharedApplication];
    UIBackgroundTaskIdentifier bgTask = 0;

    backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(backgroundTask) userInfo:nil repeats:YES];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];
}
于 2013-04-29T06:13:34.010 に答える