2017-09-25 26 views
12

が、私は問題を抱えていiOS11私のInfo.plistは場所のアクセス許可の問題iOSの11とiOS 10

<key>NSLocationWhenInUseUsageDescription</key> 
<string>When in use permissions</string> 
<key>NSLocationAlwaysUsageDescription</key> 
<string>always permissions</string> 
<key>NSLocationAlwaysAndWhenInUsageDescription</key> 
<string>Always and in usage permissions</string> 

が含まれている私は2つのマップの従業員のための顧客のための1つ、別のを持っています。私はアプリが実行されていないか、バックグラウンドにされた(彼らが署名するときにそれをオフにすることができます)と顧客のために

locationManager.requestAlwaysAuthorization()

を使用して要求許可しても、その場所を知っている必要があり、従業員のために私がいる間だけの場所を必要としますアプリが使用中であり、使用量が、決して常に許可にiOSの11でこの要求のみ許可を

locationManager.requestWhenInUseAuthorization()

を使用して許可を要求します。

iOS 10では正しく動作しています。

私がしたい振る舞いは、次のとおりです。 顧客(サインインされていない)は、使用許可を得ているかどうかを尋ねます。彼らがサインイン(従業員)している場合、それは使用されていなくても場所を要求します。

誰かが私が行方不明/間違っていることに少しでも光を当てることができれば、それは非常に高く評価されます。

許可を削除した場合の注意点NSLocationAlwaysUsageDescription iOS10とiOS11には、常にアクセス許可を要求しないという同じ問題があります。

もう少し説明します。 私はdidChangeAuthorizationデリゲート関数を実装しました。ユーザが呼び出しからの警告の許可を許可したときに呼び出されますrequestWhenInUseAuthorization() requestWhenInUseAuthorization()関数を位置マネージャに呼び出すと、デリゲートメソッドは呼び出されず、ユーザーに表示されます。どちらの場合も、顧客と従業員のために

+0

実際のデバイスでテストしていますか?あなたはlocationupdate locationmanagerデリゲートメソッドにブレークポイントを設定しました –

+0

2つの実際のデバイスのiPhone 5がiOS 10.3.3とiOS 11を実行しているiPhone 5をテストしています。私はロケーションマネージャのデリゲート関数didChangeAuthorizationとdidUpdateLocationsにログを記録しています。場所はフォアグラウンドで呼び出されていますが、使用権限ではいつでもアクセス許可ではないと要求したときに認可を変更しました。 –

+0

このアンサーを見てください - https://stackoverflow.com/a/46339284/3024579 – Alok

答えて

7

私は、許可を求められたクイックスタンドアローンのアプリケーションを作成することで問題を見つけました。エラーログが表示されました。私が使用していたキーは間違っていました。

私はdocsから、それはNSLocationAlwaysAndWhenInUsageDescriptionを使用すべきであると述べているので、奇数であるNSLocationAlwaysAndWhenInUsageDescription代わりのNSLocationAlwaysAndWhenInUseUsageDescriptionを持っていました。修正された正しい鍵と正しい権限を含むように切り替えると、iOS 11および10で期待どおりに動作します。

ありがとうございました。

0

、あなたは最初にhttps://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/request_always_authorization

概要を参照してください、彼らは従業員である場合にのみ、その後locationManager.requestWhenInUseAuthorization()

を呼び出す必要が locationManager.requestAlwaysAuthorization()

に呼び出しを追加しますロケーションサービスに常に許可を設定するには、次のように を実行します。NSLocationWhenInUseUsageDescriptionキーと NSLocationAlwaysAndW henInUsageDescription Info.plistファイルのキーです。 (これらのキーはInfo.plistエディタの「プライバシー - 場所使用時の場所 の説明」と「プライバシー - 場所の使用中および使用中の使用 説明」と表示されます)。アプリケーションがiOS 10 以前をサポートしている場合、 NSLocationAlwaysUsageDescriptionキーを Info.plistファイルに追加します。 (XcodeはこのキーをInfo.plistエディタの "Privacy - Location 常に使用の説明"と表示します)。 CLLocationManagerオブジェクトを作成して設定します。最初に requestWhenInUseAuthorization()を呼び出すと、アプリの基本 の位置情報サポートが有効になります。そのレベルの許可を必要とするサービスを使用する場合は、requestAlwaysAuthorization()メソッドを呼び出すのは です。

+0

アプリが開かれたら誰もが顧客として扱われ、 '' 'locationManager.requestWhenInUseAuthorization () '' 'ログインすると' '' locationManager.requestAlwaysAuthorization() ''を要求します。私の理解は、ある時点でいつ使用要求があったとしても、いつでも追跡要求を行うことができるはずです後の任意の点。それは間違っているのですか? –

+0

はい、正しいです。 いくつかの愚かな質問 - 1.あなたのiPhoneからアプリを削除してもう一度再インストールしようとしましたか?そうでない場合は、プロジェクトをクリーンアップして、アプリケーションを削除してから再インストールしてください。 2.システム設定を確認します。ユーザーは、アプリの設定やすべてのアプリのシステム設定でロケーションサービスを無効にすることができます。 – Roee84

+0

1)私はインストール/アンインストールを試みました。 2)私は自分のシステム設定をチェックしましたが、iOS11ではそれが役に立たないかどうかわからない常時アクセス権はありません。 ご協力いただきありがとうございます。 –

4

あなたのInfo.plistファイルには、これを追加するには:

<key>NSLocationUsageDescription</key> 
<string></string> 
<key>NSLocationWhenInUseUsageDescription</key> 
<string></string> 

今すぐあなたの迅速なファイルに、デリゲートを追加することを忘れないでください:あなたのviewDidLoadでCLLocationManagerDelegate

()、これを追加します。

locationManager = CLLocationManager() 

locationManager.delegate = self 

locationManager.requestWhenInUseAuthorization() 

locationManager.desiredAccuracy = kCLLocationAccuracyBest 

locationManager.startUpdatingLocation() 

locationManager.startMonitoringSignificantLocationChanges() 

// Here you can check whether you have allowed the permission or not. 

if CLLocationManager.locationServicesEnabled() 
    { 
     switch(CLLocationManager.authorizationStatus()) 
     { 

     case .authorizedAlways, .authorizedWhenInUse: 

      print("Authorize.") 

      break 

     case .notDetermined: 

      print("Not determined.") 

      break 

     case .restricted: 

      print("Restricted.") 

      break 

     case .denied: 

      print("Denied.") 
     } 
    } 
+3

残念ながら、これはそれが私の背景がある@Cesare NSLocationAlwaysAndWhenInUsageDescription https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/request_always_authorization –

+2

あなたはスウィフトスイッチケースアクヒル – Cesare

+0

で休憩を必要としない必要がiOS版11のための問題ではありませんC#とJavaで。それを指摘してくれてありがとう。笑 :) –

関連する問題