web-dev-qa-db-ja.com

iOS 7でバックグラウンドロケーションサービスが機能しない

IOS 7を使用するようにiOSデバイスを最近アップグレードしました。開発中のアプリの1つは、バックグラウンドロケーションサービスを使用してデバイスのロケーションを追跡し、すべてのテスターは、iOSでバックグラウンドでアプリが追跡されなくなったと報告しています7。

デバイスの設定でアプリのバックグラウンドが有効になっていること、およびiOS 6で以前のビルドが問題なく動作することを確認しました。デバイスがサイクルしても、場所の更新後にアプリが再起動します。

IOS 7でこの作業を行うために、他に何かする必要があることはありますか?

35
Alan Samet

これは、フォアグラウンドまたはバックグラウンドに関係なく、iOS 7デバイスから連続した位置を取得するために使用したソリューションです。

あなたはブログからまたgithubから完全なソリューションと説明を見つけるかもしれません:-

  1. iOS 7および8のバックグラウンドロケーション更新プログラミング

  2. Githubプロジェクト:iOS 7および8のバックグラウンドロケーション更新プログラミング

方法と説明:-

  1. 関数で1分ごとにロケーションマネージャーを再起動しますdidUpdateLocations

  2. ロケーションマネージャーがデバイスをシャットダウンする前に10秒間デバイスからロケーションを取得できるようにします(バッテリーを節約するため)。

以下の部分的なコード:-

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{

for(int i=0;i<locations.count;i++){
    CLLocation * newLocation = [locations objectAtIndex:i];
    CLLocationCoordinate2D theLocation = newLocation.coordinate;
    CLLocationAccuracy theAccuracy = newLocation.horizontalAccuracy;
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];

    if (locationAge > 30.0)
        continue;

    //Select only valid location and also location with good accuracy
    if(newLocation!=nil&&theAccuracy>0
       &&theAccuracy<2000
       &&(!(theLocation.latitude==0.0&&theLocation.longitude==0.0))){
        self.myLastLocation = theLocation;
        self.myLastLocationAccuracy= theAccuracy;
        NSMutableDictionary * dict = [[NSMutableDictionary alloc]init];
        [dict setObject:[NSNumber numberWithFloat:theLocation.latitude] forKey:@"latitude"];
        [dict setObject:[NSNumber numberWithFloat:theLocation.longitude] forKey:@"longitude"];
        [dict setObject:[NSNumber numberWithFloat:theAccuracy] forKey:@"theAccuracy"];
        //Add the vallid location with good accuracy into an array
        //Every 1 minute, I will select the best location based on accuracy and send to server
        [self.shareModel.myLocationArray addObject:dict];
    }
}

//If the timer still valid, return it (Will not run the code below)
if (self.shareModel.timer)
    return;

self.shareModel.bgTask = [BackgroundTaskManager sharedBackgroundTaskManager];
[self.shareModel.bgTask beginNewBackgroundTask];

//Restart the locationMaanger after 1 minute
self.shareModel.timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self
                                                       selector:@selector(restartLocationUpdates)
                                                       userInfo:nil
                                                        repeats:NO];

//Will only stop the locationManager after 10 seconds, so that we can get some accurate locations
//The location manager will only operate for 10 seconds to save battery
NSTimer * delay10Seconds;
delay10Seconds = [NSTimer scheduledTimerWithTimeInterval:10 target:self
                                                selector:@selector(stopLocationDelayBy10Seconds)
                                                userInfo:nil
                                                 repeats:NO];
 }

2014年5月の更新:特定の時間間隔でサーバーに場所を送信する際にサンプルコードを追加するように要求されました。サンプルコードを追加し、BackgroundTaskManagerの修正も組み合わせて、長時間にわたって実行されるバックグラウンドのグリッチを解決しました。ご質問がある場合は、こちらのディスカッションにご参加ください: サーバーディスカッションへのロケーション更新を使用したiOS 7のバックグラウンドロケーション更新プログラミング

2015年1月の更新:アプリが中断されている場合でも場所の更新を取得する場合は、次を参照してください: Get Location Updates for iOS一時停止時でもアプリ

47
Ricky

WWDC 2013セッションビデオ#204-マルチタスクpdfの新機能を見ると、ページ番号15に、ユーザーがアプリスイッチャーからアプリを殺してもバックグラウンドでアプリが起動しないことが明記されています。画像をご覧ください、

enter image description here

18
Obj-Swift

電話の「比較的」静止した位置を検出し、位置の更新を停止するために、おそらくモーションセンサーを使用して最適化を行ったと思います。これは推測にすぎませんが、現在のテストでは次のことが示されています。

  1. ロケーション更新の開始。 (10および100メートルの精度で、それぞれ3回テスト済み)
  2. アプリをバックグラウンドにするには、デバイスの画面をオフにします。
  3. デバイスを30分間静止したままにします(机の上など)。

私がログに記録するデータは、約15分と30秒後にジオ更新が停止することを示しています。これにより、ユーザーが行う他のすべてのバックグラウンド処理も終了します。

私のデバイスは、iOS 7を搭載したiPhone 5です。

私は95%確信しています。これはiOS 6/6.1には当てはまりませんでした。 100mの精度で地理情報の更新を取得して、バックグラウンドでほとんど継続的に実行できるようにしました。

更新

ロケーションマネージャーを8分ごとに再起動すると、継続的に実行されます。

更新#2

私はこれを最新の状態でテストしていませんが、これは私が投稿を書いたときに再起動する方法です。これがお役に立てば幸いです。

- (void)tryRestartLocationManager
{
    NSTimeInterval now = [[NSDate date] timeIntervalSince1970];

    int seconds = round(floor(now - locationManagerStartTimestamp));

    if ( seconds > (60 * 8) ) {
        [locationManager stopUpdatingLocation];
        [locationManager startUpdatingLocation];
        locationManagerStartTimestamp = now;
    }
}
15
Nikolay Tsenkov

私のiOSアプリの1つは、定期的にサーバーに場所の更新を送信する必要があり、次のアプローチが機能しました。

IOS 7以降:

  • バックグラウンドランタイムの対象となるためには、アプリがバックグラウンド化される前に、既に位置情報サービス(startUpdatingLocation)を使用している必要があります。
  • バックグラウンドの猶予期間のタイムアウトが10分から3分に短縮されました。
  • (stopUpdatingLocationを介して)ロケーション更新を停止すると、3分のbackgroundTimeRemainingカウントダウンが開始されます
  • 既にバックグラウンドで位置の更新を開始しても、backgroundTimeRemainingはリセットされません。

そのため、場所の更新をいつでも停止しないでください...代わりに、必要な精度(細かい場所と粗い場所)を使用することをお勧めします。大まかな場所では多くのバッテリーを消費しないため、このソリューションは問題を解決します。

オンラインでよく検索した結果、iOS 7の実行可能なソリューションを提供するリンクが見つかりました。ソリューションは次のとおりです。

  • アプリがまだフォアグラウンドにある間に、位置の更新を開始(startUpdatingLocation)しますが、精度と距離フィルターを非常に粗い(たとえば3 km)更新に設定します。これをフォアグラウンドで行うことが重要です(applicationDidEnterBackgroundでは遅すぎます)。
  • きめの細かい解像度が必要な場合は、精度と距離フィルターを一時的に設定して最適な場所を取得し、それらを粗い値に戻しますが、場所の更新は停止しません。
  • 位置情報の更新は常に有効になっているため、アプリはバックグラウンドに移行しても中断されません。

そして、アプリケーションのInfo.plistの「location」をUIBackgroundModesキーの「location-services」に、「gps」をUIRequiredDeviceCapabilitiesキーに追加してください。

クレジット: http://gooddevbaddev.wordpress.com/2013/10/22/ios-7-running-location-based-apps-in-the-background/

7
androidExplorer

私は別のスレッドを見つけました バックグラウンドタスクからiOS 7でロケーションマネージャーを開始 Sashは

問題/解決策を見つけました。位置情報サービスを開始してバックグラウンドタスクを停止する時間になったら、バックグラウンドタスクを遅らせる必要があります(1秒に設定します)。そうでない場合、位置情報サービスは開始されません。

誰でもそれを試して確認できますか?

ニコライ、ここにコードを貼り付けられますか?ロケーションマネージャーを8分ごとに再起動しようとしましたが、継続的に実行されません。

更新:

HighとLowを検索した後、Apple Forum!

IOS 7では、バックグラウンドで位置情報サービスを開始できません。位置情報サービスをバックグラウンドで実行し続けたい場合は、フォアグラウンドで開始する必要があり、バックグラウンドで引き続き実行されます。

あなたが私のようだった場合、位置情報サービスを停止し、タイマーを使用してバックグラウンドで再起動すると、機能しません。

詳細については、WWDC 2013のビデオ307の最初の8分間を見ることができます。 https://developer.Apple.com/wwdc/videos/

2014年2月の更新:iOS 7を使用して、数か月間試行した後、デバイスから継続的に位置を取得できます。完全な答えがここに表示される場合があります: iOS 7で動作しないバックグラウンドロケーションサービス

5
Ricky

ステータスバーのアイコンはオンになっていますか?それも私が持っていた奇妙な行動です。私の質問を確認してください: startMonitoringSignificantLocationChanges、しかししばらくしてdidUpdateLocationsはもう呼び出されません

重要な場所の変更がオンになっていることを発見しましたが、サービスを停止および再起動するだけで(重要な変更の場合)、新しい場所が起動されませんでした。

1
Mr. Cobblepot

システムの位置更新の一時停止を無効にするには、pausesLocationUpdatesAutomaticallyclassのCLLocationManagerプロパティをfalseに設定する必要があります。

0
Tibin Thomas