CoreLocation
Xcode7 (プレリリース) のアプリでフレームワークを使用していますがallowsBackgroundLocationUpdates
、CLLocationManager
クラスで呼び出される新しく追加されたプロパティがあることに気付きました。
このプロパティと [ケーパビリティ] タブの [バックグラウンド モード] での場所の更新との関係は何ですか。そのデフォルト値は何ですか? iOS9 で実行されているアプリに影響しますか?
CoreLocation
Xcode7 (プレリリース) のアプリでフレームワークを使用していますがallowsBackgroundLocationUpdates
、CLLocationManager
クラスで呼び出される新しく追加されたプロパティがあることに気付きました。
このプロパティと [ケーパビリティ] タブの [バックグラウンド モード] での場所の更新との関係は何ですか。そのデフォルト値は何ですか? iOS9 で実行されているアプリに影響しますか?
この新しいプロパティについては、WWDC セッション「What's New in Core Location」で説明されています。
デフォルト値はNO
、iOS 9 に対してリンクする場合です。
アプリがバックグラウンドで (青いステータス バーを表示せずに) 位置情報を使用する場合は、Info.plist でバックグラウンド モード機能を設定するだけでなく、 を設定するallowsBackgroundLocationUpdates
必要があります。YES
それ以外の場合、ロケーションの更新はフォアグラウンドでのみ配信されます。利点は、バックグラウンドでの位置情報の更新を行うロケーション マネージャーと、フォアグラウンドでの位置情報の更新のみを行う他のロケーション マネージャーを同じアプリ内で使用できるようになったことです。値を にリセットしNO
て動作を変更することもできます。
ドキュメントはそれについてかなり明確です:
デフォルトでは、最小展開ターゲットに関係なく、iOS 9.0 以降にリンクされたアプリケーションの場合、これは NO です。
Info.plist に「場所」を含めるように UIBackgroundModes を設定すると、バックグラウンドで続行するために -startUpdatingLocation を呼び出すときは常に、実行時にこのプロパティを YES に設定する必要があります。
UIBackgroundModes に「場所」が含まれていない場合にこのプロパティを YES に設定すると、致命的なエラーになります。
このプロパティを NO にリセットすることは、UIBackgroundModes 値から「場所」を省略することと同じです。場所へのアクセスは、アプリケーションが実行中 (中断されていない場合) は常に許可され、十分な権限を持っています (つまり、WhenInUse 権限を持っていて使用中、または Always 権限を持っています)。ただし、アプリには通常のタスク一時停止ルールが適用されます。
可能な認証値の詳細については、-requestWhenInUseAuthorization および -requestAlwaysAuthorization を参照してください。
Xcode7 (プレリリース) のアプリで CoreLocation フレームワークを使用している場合、CLLocationManager クラスに allowBackgroundLocationUpdates という新しく追加されたプロパティがあることに気付くかもしれません。
この新しいプロパティについては、WWDC セッション「What's New in Core Location」で説明されています。
デフォルト値はNO
、iOS 9 に対してリンクする場合です。
アプリがバックグラウンドで (青いステータス バーを表示せずに) 位置情報を使用する場合は、Info.plist でバックグラウンド モード機能を設定するだけでなく、 を設定するallowsBackgroundLocationUpdates
必要があります。YES
それ以外の場合、ロケーションの更新はフォアグラウンドでのみ配信されます。利点は、バックグラウンドでの位置情報の更新を行うロケーション マネージャーと、フォアグラウンドでの位置情報の更新のみを行う他のロケーション マネージャーを同じアプリ内で使用できるようになったことです。値を にリセットしNO
て動作を変更することもできます。
ドキュメントはそれについてかなり明確です:
デフォルトでは、最小展開ターゲットに関係なく、iOS 9.0 以降にリンクされたアプリケーションの場合、これは NO です。
Info.plist に「場所」を含めるように UIBackgroundModes を設定すると、バックグラウンドで続行するために -startUpdatingLocation を呼び出すたびに、実行時にこのプロパティを YES に設定する必要があります。
UIBackgroundModes に「場所」が含まれていない場合にこのプロパティを YES に設定すると、致命的なエラーになります。
このプロパティを NO にリセットすることは、UIBackgroundModes 値から「場所」を省略することと同じです。場所へのアクセスは、アプリケーションが実行中 (中断されていない場合) はいつでも許可され、十分な権限を持っています (つまり、WhenInUse 権限を持っていて使用中、または Always 権限を持っています)。ただし、アプリには通常のタスク一時停止ルールが適用されます。
可能な認証値の詳細については、-requestWhenInUseAuthorization および -requestAlwaysAuthorization を参照してください。
次のようにInfo.plistを設定します:
Info.plist 構成の構文は次のようになります。
<key>NSLocationAlwaysUsageDescription</key>
<string>I want to get your location Information in background</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
または、アプリ ターゲットの [機能] タブをプルアップします。
(ソース: raywenderlich.com )
次のように使用します。
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
[_locationManager requestAlwaysAuthorization];
}
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
_locationManager.allowsBackgroundLocationUpdates = YES;
}
[_locationManager startUpdatingLocation];
ここにデモを書きます(Demo2)
{
NSArray* backgroundModes = [NSBundle MainBundle].infoDictionary[@"UIBackgroundModes"];
if(backgroundModes && [backgroundModes containsObject:@"location"]) {
if([manager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
// We now have iOS9 and the right capabilities to set this:
[manager setAllowsBackgroundLocationUpdates:YES];
}
}
}
iOS 9.0.x のバックグラウンド モードで同じ位置情報サービスに直面し、以下のコードを追加して、この投稿で推奨されているように修正しました
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
_locationManager.allowsBackgroundLocationUpdates = YES;
}
ただし、iOS 9.1 では動作しません。同じ問題を抱えている人はいますか? もしそうなら、親切に助けてください。ありがとう
7 ベータ版は常にシミュレーターでクラッシュするため、私はまだ xCode 6 を使用しています。iOS9 とリンクしていませんが、この問題があります。そして、iOS8 には存在しないため、このプロパティを設定することはできません! アップルよ、この苦しみはいつ終わるのか!?
このレイト バインド呼び出しを実行して、この xCode6 互換バージョンに変更しました。
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {
BOOL yes = YES;
NSMethodSignature* signature = [[CLLocationManager class] instanceMethodSignatureForSelector: @selector( setAllowsBackgroundLocationUpdates: )];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature];
[invocation setTarget: locationManager];
[invocation setSelector: @selector( setAllowsBackgroundLocationUpdates: ) ];
[invocation setArgument: &yes atIndex: 2];
[invocation invoke];
}
iOS8 (何もしない) と iOS9 beta 6 (メソッドを正しく呼び出す) での動作を確認しました。
iOS 8 から iOS 9 に更新された多くのメソッドの概要を次に示します。
使用しているフレームワークごとに、多くの API とコードを検索する必要があります。そのため、一般的なフレームワークを検索してから、これらのメソッドを見つけて、減価償却されたメソッドを更新します。