1

iPhone デバイス以外のすべて (シミュレーターと iPad デバイス) で位置情報の更新を受け取ることができます。

self.locationManager = [[[CLLocationManager alloc] init] autorelease];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.locationManager.pausesLocationUpdatesAutomatically = NO;
self.locationManager.delegate = self;

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = locations.lastObject;
    NSLog(@"didUpdateLocations newLocation = %@", newLocation);
.
.
}

アプリがフォアグラウンドにある限りdidUpdateLocations (NSLog メッセージ)を受け取りますが、ホーム ボタンを押した後 (つまり、アプリがバックグラウンドになる)、didUpdateLocations での通知の受信を停止します。「コンソール」に NSLog メッセージが表示されず、その後、ステータス バーの場所アイコンも 10 秒以内に消えます。

機能するものと機能しないもの -

  1. 私の他の iPhone 3gs にインストールされた iOS 6 は正常に動作するようです。小さな場所のアイコンが消えません。

  2. iOS 7 を搭載した iPad デバイスでテストすると、アプリはバックグラウンドで実行され続けます。

  3. iOS 6 および iOS 7 を搭載したすべてのシミュレーター (iPhone および iPad) は期待どおりに動作します。

  4. iOS 7 を搭載した iPhone 4 でテストすると、アプリはバックグラウンドで実行されません。おそらく、この問題は iOS 7 (および一部の特定の iPhone デバイス) にのみ発生します。

4

2 に答える 2

0

上記の解決策は、iOS 8.X の特定のケースでは機能しませんでした。そのため、他の人に役立つことを期待して、私のために機能した解決策を投稿したいと思います。

フォアグラウンド、バックグラウンド、サスペンド状態で受信していたサイレント プッシュ通知を正常にセットアップしました。PN を受け取ったら、位置情報の更新を取得する必要があります。アプリケーションがフォアグラウンドにある間は実行できましたが、アプリケーションがバックグラウンドにある間は実行できませんでした。

私がする必要があったのは、NSLocationAlwaysUsageDescription という名前の info.plist ファイルにキーを追加し、それに値を与えることでした。値は、「バックグラウンドで現在地が必要です」のようなものです。

キーを追加した後、AppDelegate.m の application:didFinishLaunchingWithOptions: メソッド内にこのコードを追加しました -

// Check for iOS 8.X. Without this guard the code will crash with "unknown selector" on iOS 7.
if([[self locationManager] respondsToSelector:@selector(requestAlwaysAuthorization)])
{
    [[self locationManager] requestAlwaysAuthorization];
}

これら 2 つの部分を追加すると、バックグラウンドで位置情報の更新を正常に取得できました。

ありがとう、聞こえる

于 2014-10-20T20:09:13.080 に答える