web-dev-qa-db-ja.com

ロケーション許可の問題iOS 11およびiOS 10

Info.plistに含まれているiOS11を使用しているときに、ユーザーにロケーション許可を要求すると問題が発生します

_<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つのマップがあります。従業員の場合、アプリが実行されていない場合やバックグラウンドになっている場合でも(ログアウト時にアプリをオフにすることができます)、場所を知って、

locationManager.requestAlwaysAuthorization()

顧客の場合、アプリの使用中に場所のみが必要で、次を使用して許可を要求します

locationManager.requestWhenInUseAuthorization()

IOS 11では、これは使用中にのみ許可を要求し、常時許可ではありません。

IOS 10では、正しい動作が行われます。

私が望む動作は次のとおりです:彼らが顧客である場合(サインインしていない場合)、使用許可の場合のみ要求します。サインイン(従業員)する場合、使用していないときでも場所を要求します。

誰かが私が見逃している/間違っていることについて何らかの光を当てることができれば、それは大歓迎です。

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

もう少し明確化。 didChangeAuthorizationデリゲート関数を実装し、ユーザーがrequestWhenInUseAuthorization()の呼び出しからのアラートからの許可を許可すると呼び出されますが、ロケーションマネージャーでrequestWhenInUseAuthorization()関数を呼び出すと、デリゲートメソッドは呼び出されませんその呼び出しを受信せず、ユーザーに警告ダイアログが表示されないように。

14
Ben Avery

許可のみを要求するクイックスタンドアローンアプリを作成することで問題を解決しました。使用しているキーが間違っていることを示すエラーログが表示されました。

NSLocationAlwaysAndWhenInUsageDescriptionの代わりにNSLocationAlwaysAndWhenInUseUsageDescriptionがありましたが、これは docs からNSLocationAlwaysAndWhenInUsageDescriptionを使用する必要があると述べているため、奇妙です。修正された正しいキーを含むように切り替えると、iOS 11および10で期待どおりに権限が機能するようになりました。

すべての助けてくれてありがとう。

8
Ben Avery

Info.plistファイルにこれを追加します。

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

これでSwiftファイルに、デリゲートを追加することを忘れないでください:CLLocationManagerDelegate

ViewDiDLoad()で、これを追加します:

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.")
        }
    }
4
Akhil Nair

顧客と従業員の両方の場合、最初にlocationManager.requestWhenInUseAuthorization()を呼び出す必要があります

次に、従業員である場合にのみ、locationManager.requestAlwaysAuthorization()への呼び出しを追加します

https://developer.Apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/request_always_authorization を参照してください

概要ロケーションサービスの常時認証を構成するには、次の手順を実行します。NSLocationWhenInUseUsageDescriptionキーとNSLocationAlwaysAndWhenInUsageDescriptionキーをInfo.plistファイルに追加します。 (Xcodeは、これらのキーをInfo.plistエディターで「プライバシー-使用中の場所の使用状況の説明」および「プライバシー-常に使用場所の使用状況の説明」として表示します。)アプリがiOS 10以前をサポートする場合、NSLocationAlwaysUsageDescriptionキーを追加しますInfo.plistファイルに。 (Xcodeは、このキーをInfo.plistエディターで「Privacy-Location Always Usage Description」として表示します。)CLLocationManagerオブジェクトを作成および構成します。最初にrequestWhenInUseAuthorization()を呼び出して、アプリの基本的な場所のサポートを有効にします。 requestAlwaysAuthorization()メソッドは、そのレベルの認証を必要とするサービスを使用する場合にのみ呼び出します。

0
Roee84