1

アプリがバックグラウンドで実行されているときにプッシュ通知を受信すると、アプリがユーザーの場所を必要とするという問題に直面しています。

少し読んだ後、これは不可能であるという印象を受けました。

1) バックグラウンドのアプリ

2) プッシュ通知の受信

3) ユーザーの位置情報を取得し、コード ブロックを実行します。

ユーザーの場所を取得するために、N 分ごとにタスクを実行できることを示唆するこの投稿を見つけました。これを使用すると、10 分ごとに確認できますが、GPS をアクティブにし続けると、ユーザーのバッテリーが無駄になります。したがって、ユーザーがアプリを待っているプッシュ通知を持っているかどうか、バックグラウンド タスク内で確認できるかどうか疑問に思っていました。そうすれば、10 分ごとに確認して、そうである場合にのみ GPS をアクティブにします。

おそらく私はこれについてすべて間違った方法で進んでいます。アドバイスをいただければ幸いです。まだバックグラウンド タスクを動作させようとしている最中なので、バックグラウンド タスクのコードがなくて申し訳ありません。

[アップデート]

ダスティンさん、アドバイスありがとうございます。少しテストした後、より簡単なオプションを使用することにしました。現在、Apple の重要な場所の変更を使用しています。変更を配列に保存します。最後の変更が 10 分以上前の場合にのみ更新するように設定しました。次に、アプリがアクティブになると、配列内の最も近い時刻とプッシュ通知が送信された時刻を照合し、その場所を使用します。

4

1 に答える 1

1

説明したように、別のソリューションを使用しましたが、次のとおりです。

viewDidLoad または didFinishingLaunchingWithOptions の下に以下を追加します。

locationsLogged = [[NSMutableArray alloc] init];
lastLocationTime = [[NSDate alloc] init]
locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

applicationDidEnterBackground の下に以下を追加します。

[locationManager startMonitoringSignificantLocationChanges];

追加:

-(void) storeLocations:(CLLocation *)location
{
bgTask = [[UIApplication sharedApplication]
          beginBackgroundTaskWithExpirationHandler:
          ^{
              [[UIApplication sharedApplication] endBackgroundTask:bgTask];
               }];

[locationsLogged addObject:location];

if (bgTask != UIBackgroundTaskInvalid)
{
    [[UIApplication sharedApplication] endBackgroundTask:bgTask];
     bgTask = UIBackgroundTaskInvalid;
     }
}


 -(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
BOOL isInBackground = NO;
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground)
{
    isInBackground = YES;
} 


NSDate *now = [NSDate date];
NSTimeInterval diff = [now timeIntervalSinceDate:lastLocationTime];


if ((int)diff > 600) {

    if (isInBackground)
    {
        [lastLocationTime release];
        lastLocationTime = [[NSDate alloc] init];
        [self storeLocations:newLocation];
    }
    else
    {
        // ...
    }
}
}

次に、applicationDidBecomeActive で、位置情報を適用するために必要なロジックを使用できます。

于 2012-07-30T23:19:22.520 に答える