web-dev-qa-db-ja.com

iOS9のCLLocationManagerのallowBackgroundLocationUpdates

Xcode7(プレリリース版)のアプリでCoreLocationフレームワークを使用していますが、allowsBackgroundLocationUpdatesクラスにCLLocationManagerという新しいプロパティが追加されていることに気付きました。

[機能]タブの[バックグラウンドモード]でのこのプロパティと場所の更新との関係は何ですか。デフォルト値は何ですか?また、iOS9で実行されているアプリに影響しますか?

63
tounaobun

この新しいプロパティは、WWDCセッションで説明されています 「コアロケーションの新機能」

IOS 9に対してリンクする場合、デフォルト値はNOです。

アプリがバックグラウンドで位置を使用する場合(青色のステータスバーを表示しない)、Info.plistでバックグラウンドモード機能を設定することに加えて、allowsBackgroundLocationUpdatesYESに設定する必要があります。それ以外の場合、位置の更新はフォアグラウンドでのみ配信されます。利点は、同じアプリ内で、バックグラウンドでの位置情報の更新を行うロケーションマネージャーと、フォアグラウンドでの位置情報の更新のみを行うotherロケーションマネージャーを使用できることです。値をNOにリセットして、動作を変更することもできます。

ドキュメントはそれについてかなり明確です:

デフォルトでは、iOS 9.0以降に対してリンクされているアプリケーションの場合、最小展開ターゲットに関係なく、NOです。

Info.plistに「location」を含めるように設定されたUIBackgroundModesを使用して、バックグラウンドで続行する目的で-startUpdatingLocationを呼び出すたびに、実行時にこのプロパティをYESに設定する必要があります。

UIBackgroundModesに「location」が含まれていない場合、このプロパティをYESに設定すると致命的なエラーになります。

このプロパティをNOにリセットすることは、UIBackgroundModes値から「location」を省略することと同等です。場所へのアクセスは、アプリケーションが実行中(つまり、一時停止されていない)であり、十分な承認(つまり、WhenInUse承認があり使用中、またはAlways承認がある)であればいつでも許可されます。ただし、アプリは通常のタスク一時停止ルールの対象となります。

可能な許可値の詳細については、-requestWhenInUseAuthorizationおよび-requestAlwaysAuthorizationを参照してください。

103
Felix

Xcode7(pre-released)のアプリでCoreLocationフレームワークを使用している場合、CLLocationManagerクラスにallowBackgroundLocationUpdatesと呼ばれる新しく追加されたプロパティがあることに気付くかもしれません。

この新しいプロパティは、WWDCセッションで説明されています 「コアロケーションの新機能」 。 enter image description here

IOS 9に対してリンクする場合、デフォルト値はNOです。

アプリがバックグラウンドで位置を使用する場合(青色のステータスバーを表示しない)、Info.plistでバックグラウンドモード機能を設定することに加えて、allowsBackgroundLocationUpdatesYESに設定する必要があります。それ以外の場合、位置の更新はフォアグラウンドでのみ配信されます。利点は、同じアプリ内で、バックグラウンドでロケーションを更新するロケーションマネージャーと、フォアグラウンドでロケーションを更新する他のロケーションマネージャーを使用できるようになったことです。値をNOにリセットして、動作を変更することもできます。

ドキュメントはそれについてかなり明確です:

デフォルトでは、iOS 9.0以降に対してリンクされているアプリケーションの場合、最小展開ターゲットに関係なく、NOです。

Info.plistに「location」を含めるように設定されたUIBackgroundModesを使用して、バックグラウンドで続行する目的で-startUpdatingLocationを呼び出すたびに、実行時にこのプロパティをYESに設定する必要があります。

UIBackgroundModesに「location」が含まれていない場合、このプロパティをYESに設定すると致命的なエラーになります。

このプロパティをNOにリセットすることは、UIBackgroundModes値から「location」を省略することと同等です。場所へのアクセスは、アプリケーションが実行中(つまり、一時停止されていない)であり、十分な承認(つまり、WhenInUse承認があり使用中、またはAlways承認がある)であればいつでも許可されます。ただし、アプリは通常のタスク一時停止ルールの対象となります。

可能な許可値の詳細については、-requestWhenInUseAuthorizationおよび-requestAlwaysAuthorizationを参照してください。

Info.plistを次のように設定します。 enter image description here

Info.plist構成の構文は次のようになります。

<key>NSLocationAlwaysUsageDescription</key>
<string>I want to get your location Information in background</string>

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

または、アプリターゲットの[機能]タブを表示します。

enter image description here

次のように使用します:

_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)

39
ElonChan

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ベータ6(メソッドを正しく呼び出す)で動作することを確認しました。

5
TalL

IOS 9.0.xのバックグラウンドモードで同じロケーションサービスに直面し、以下のコードを追加してこの投稿で推奨されているように修正しました

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}

しかし、iOS 9.1では機能しません誰も同じ問題を抱えていますか?もしそうなら、親切に助けてください。ありがとう

{
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];
         }
     }
}
5
Manish Nahar

ここ は、iOS 8からiOS 9に更新される多くのメソッドの要約です

使用しているフレームワークごとに、多くのAPIとコードを検索する必要があります。したがって、フレームワークを一般で検索し、これらのメソッドを見つけて、減価償却されたメソッドを更新します。

0
Tommy Woodfin