IOS 7を使用するようにiOSデバイスを最近アップグレードしました。開発中のアプリの1つは、バックグラウンドロケーションサービスを使用してデバイスのロケーションを追跡し、すべてのテスターは、iOSでバックグラウンドでアプリが追跡されなくなったと報告しています7。
デバイスの設定でアプリのバックグラウンドが有効になっていること、およびiOS 6で以前のビルドが問題なく動作することを確認しました。デバイスがサイクルしても、場所の更新後にアプリが再起動します。
IOS 7でこの作業を行うために、他に何かする必要があることはありますか?
これは、フォアグラウンドまたはバックグラウンドに関係なく、iOS 7デバイスから連続した位置を取得するために使用したソリューションです。
あなたはブログからまたgithubから完全なソリューションと説明を見つけるかもしれません:-
方法と説明:-
関数で1分ごとにロケーションマネージャーを再起動しますdidUpdateLocations
ロケーションマネージャーがデバイスをシャットダウンする前に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一時停止時でもアプリ
WWDC 2013セッションビデオ#204-マルチタスクpdfの新機能を見ると、ページ番号15に、ユーザーがアプリスイッチャーからアプリを殺してもバックグラウンドでアプリが起動しないことが明記されています。画像をご覧ください、
電話の「比較的」静止した位置を検出し、位置の更新を停止するために、おそらくモーションセンサーを使用して最適化を行ったと思います。これは推測にすぎませんが、現在のテストでは次のことが示されています。
私がログに記録するデータは、約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;
}
}
私のiOSアプリの1つは、定期的にサーバーに場所の更新を送信する必要があり、次のアプローチが機能しました。
IOS 7以降:
そのため、場所の更新をいつでも停止しないでください...代わりに、必要な精度(細かい場所と粗い場所)を使用することをお勧めします。大まかな場所では多くのバッテリーを消費しないため、このソリューションは問題を解決します。
オンラインでよく検索した結果、iOS 7の実行可能なソリューションを提供するリンクが見つかりました。ソリューションは次のとおりです。
そして、アプリケーションのInfo.plistの「location」をUIBackgroundModesキーの「location-services」に、「gps」をUIRequiredDeviceCapabilitiesキーに追加してください。
クレジット: http://gooddevbaddev.wordpress.com/2013/10/22/ios-7-running-location-based-apps-in-the-background/
私は別のスレッドを見つけました バックグラウンドタスクから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で動作しないバックグラウンドロケーションサービス
ステータスバーのアイコンはオンになっていますか?それも私が持っていた奇妙な行動です。私の質問を確認してください: startMonitoringSignificantLocationChanges、しかししばらくしてdidUpdateLocationsはもう呼び出されません
重要な場所の変更がオンになっていることを発見しましたが、サービスを停止および再起動するだけで(重要な変更の場合)、新しい場所が起動されませんでした。
システムの位置更新の一時停止を無効にするには、pausesLocationUpdatesAutomatically
classのCLLocationManager
プロパティをfalseに設定する必要があります。