iOS11で位置情報サービスが機能しない


83

iOS 11 SDKを使用してアプリを再構築し、blue banner現在常に表示されているアプリを削除しようとしました。「素晴らしい、うまくいった」と思ったのですが、位置情報サービスがまったく機能していないことに気づきました。

iOS 10で動作するために使用されるアプリケーション-誰かが何か聞いたことがありますか?


Info.plistにNSLocationAlwaysAndWhenInUseUsageDescriptionを追加
Jayprakash Dubey 2017

回答:


156

アップルがさらに別のプライバシー機能を追加したように見えます。ユーザーは私たちをオーバーライドしてrequestAlwaysAuthorizationダウングレードできるようになりましたrequestWhenInUseAuthorization-つまり、開発者として、両方の説明をで提供する必要がありますInfo.plist

彼らが新しいキーを追加したことがわかりました NSLocationAlwaysAndWhenInUseUsageDescription

/*
*      Either the NSLocationAlwaysAndWhenInUseUsageDescription key or both the
*      NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription
*      keys must be specified in your Info.plist; otherwise, this method will do
*      nothing, as your app will be assumed not to support Always authorization.
*/

ただし、この新しいキーを使用すると、位置情報サービスはまだ機能しませんでした。さらに検索すると、このgemがすべての追加のデバッグ情報と混在していることがわかりました。

このアプリは、使用法の説明なしでプライバシーに配慮したデータにアクセスしようとしました。アプリのInfo.plistには、NSLocationAlwaysAndWhenInUseUsageDescriptionキーとNSLocationWhenInUseUsageDescriptionキーの両方が含まれている必要があり、文字列値はアプリがこのデータをどのように使用するかをユーザーに説明します。

これは、更新されたCLLocationManager.hファイルで見つけたコメントと直接矛盾します。だから私はレーダーを作成しました。

デバッグコンソールIEのアドバイスに従えば、朗報です。新しいキーNSLocationAlwaysAndWhenInUseUsageDescriptionと古いキーの1つを追加するとNSLocationWhenInUseUsageDescription、ロケーションサービスが再び機能し始めます。


2
私は非常によく似た状況に直面しています。私だけがiOS10.2でテストしていNSLocationAlwaysUsageDescriptionて、必要な権限であるInfo.plistに追加しました。しかし、コンソールに上記のメッセージが表示され、NSLocationWhenInUseUsageDescription同様に追加する必要があるというメッセージが表示されます。
isuru 2017

7
残念ながら、ユーザーは3つの回答を含むダイアログを表示するようになりました。ユーザーが開始するのを待ち焦がれているためにヒットする可能性が最も高いのは、「アプリの使用中のみ」です。これにより、ユーザーが後で設定を再度変更するという面倒な作業をすべて行わない限り、常に使用する必要のあるアプリは役に立たなくなります。これがアプリが求めているものである場合、少なくとも「常に許可」が一番の選択であるはずです!
Hans Terje Bakke 2017

1
3つの説明キーをすべて追加しましたが、場所の更新をまだ受信していません。viewwillAppearにlocationmanagerdelgateを追加し、viewwilldisapperのデリゲートを削除しています。設定に移動して、すでに選択されている[常に許可]を選択した場合。アップデートを取得するのは1回だけで、それ以上は取得しません。これを修正する方法を考えてみてください。前もって感謝します!!
LoveMeSomeFood 2017年

@ Uma-あなたは電話していますstartUpdatingLocationrequestLocation
ウィリアムジョージ

私が使用している@WilliamGeorgestartUpdatingLocation
LoveMeSomeFood

43

これを修正する手順を追加するだけです。

それを行う2つの方法:

A)簡単な方法:Info.plistファイルを選択し、プロパティを追加します。プロパティはLOCATIONではなくPRIVCYで始まることに注意してください。したがって、これらの変数の正確な名前は「Privacy-Location ...」などで始まります。ここにそれぞれ、警告でユーザーがこれをどのように見るかを説明します。

B)難しい/面白い/プログラム的な方法(私はこの方法がもっと好きです):

アプリのInfo.plistを右クリックし、[ソースコードを表示]を選択すると、すべてがXMLで表示されます。

他の......形式に従い、次のようにこれらのプロパティを追加します。

<key>NSLocationAlwaysUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app uses your Microphone to allow Voice over IP communication with the Program Admin system</string>

保存してからinfo.plistファイルを右クリックし、[プロパティリスト]を選択すると、ファイルがデフォルトのビューに戻ります。

編集:

別のメンバーがコードを要求しました、ここにあります:

1).Hファイルに以下を追加します。

@property (strong, nonatomic) CLLocationManager *LocationManager;

2).Mファイルで、ViewDidAppear()関数の下に追加します。

_LocationManager = [[CLLocationManager alloc] init];
[_LocationManager setDelegate:self];
_LocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
_LocationManager.pausesLocationUpdatesAutomatically = NO;
[_LocationManager requestAlwaysAuthorization];

_LocationManager.headingFilter = 5;
_LocationManager.distanceFilter = 0;

[_LocationManager startUpdatingLocation];
[_LocationManager startUpdatingHeading];

これは私にとってはうまく機能しますが、コードがあなたにとってもうまくいくことを願っています。

よろしく

ハイダー


1
3つの説明キーをすべて追加しましたが、場所の更新をまだ受信していません。にlocationmanagerdelgateを追加viewwillAppear し、のデリゲートを削除していviewwilldisapperます。設定に移動して、すでに選択されているを選択した場合Allow Always。アップデートを取得するのは1回だけで、それ以上は取得しません。これを修正する方法を考えてみてください。前もって感謝します!!
LoveMeSomeFood 2017年

私は私のために働いているもの説明するために、今、私のコードを追加します:
ハイダーサティ

私はあなたと同じコードを持っています。それでも、家に帰ってアプリに戻らない限り、位置情報の更新はありません。これはiOS11でのみ発生します。それでも理由がわかりませんでした。
LoveMeSomeFood 2017年

このスレッドを見ていただけませんか?stackoverflow.com/questions/46616496/…。ありがとうございました!
LoveMeSomeFood 2017年

こんにちはウマ、私たちのユーザーの1人がデバイスの1つで同じ問題を報告しました、私はこれを調査していて、あなたに戻ります、私はIOS11が現在私たち全員を非常に忙しくしていると思います...私は見つけなければなりませんそしてこのできるだけ早く解決してください、私に耐えてください...ありがとう
ハイダーサティ2017年

23

iOS11で動作していると、Info.plistには少なくともInfo.plistのNSLocationAlwaysAndWhenInUseUsageDescriptionが必要であることがわかりました。

ここに画像の説明を入力してください

あなたのアプリがある奇妙な十分な多言語のあなたの文字列のローカライズされたバージョンが必要なすべての3つのキーが他にこの記事で言及requestAlwaysAuthorization()し、locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) 静かに失敗します。

例としてドイツ語の翻訳を示すショット:

ここに画像の説明を入力してください

これにより、つまずいたときに時間を節約できることを願っています。


ありがとう、@ iDoc!これは私に多くの時間を節約しました。
ラインハルト方法

これは正解です。iOS11では、場所のプライバシーキーをローカライズする必要があります。
jberlana 2017年

10時間後、私はこの投稿にたどり着きます... tnx
1110

17

Swift4.0.3での作業

   <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
   <string>Description</string>

   <key>NSLocationAlwaysUsageDescription</key>
   <string>Will you allow this app to always know your location?</string>

   <key>NSLocationWhenInUseUsageDescription</key>
   <string>Do you allow this app to know your current location?</string>  

ありがとうvipulkumarmehta–
Keshav Gera

13

次の手順を実行します:

「AlwaysAuthorization」が必要なアプリで同じ問題が発生し、次の手順で解決しました。

1. キーを追加し NSLocationWhenInUseUsageDescriptionますInfo.plist

2. 追加 NSLocationAlwaysAndWhenInUseUsageDescriptionしますInfo.plist

3. 追加 NSLocationAlwaysUsageDescriptionするInfo.plist(サポートへ<iOS版11)

4. 前に電話してくださいrequestWhenInUseAuthorization() requestAlwaysAuthorization(

requestWhenInUseAuthorization()の前にrequestAlwaysAuthorization()を実行することはできません。その権限レベルにエスカレーションする必要があります。これらの変更を行うと、場所の更新が再び正しく機能し始めました。

詳細については、こちらをご覧ください。

https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/requesting_always_authorization


1
それで

フラグallowsBackgroundLocationUpdatesを有効にすることで解決しました。stackoverflow.com/a/50733860/2610888
AndreaGorrieri19年

6

申し訳ありませんよりも安全です..iOS11の場合 :以下を追加すれば問題ありません。

<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>

5

上でテストされたiOSの12.2スウィフト5

ステップ1.plistファイルに次のプライバシー権限を追加する必要があります

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

<key>NSLocationWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

ステップ2.現在の場所を取得するための次の迅速なコードがあることを確認してください

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    // MARK: Variables declearations
    @IBOutlet weak var mapView: MKMapView!
    var locationManager: CLLocationManager!

    // MARK: View Controller life cycle methods
    override func viewDidLoad() {
        super.viewDidLoad()
        //TODO: Make user you must add following three privacy permissions in plist
        //NSLocationWhenInUseUsageDescription
        //NSLocationAlwaysAndWhenInUseUsageDescription
        //NSLocationAlwaysUsageDescription

        getCurrentLocation()
    }

    func getCurrentLocation()
    {
        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }

    // MARK: Location Manager Delegate methods
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let locationsObj = locations.last! as CLLocation
        print("Current location lat-long is = \(locationsObj.coordinate.latitude) \(locationsObj.coordinate.longitude)")
        showOnMap(location: locationsObj)
    }
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Get Location failed")
    }

    func showOnMap(location: CLLocation )
    {
        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
        mapView.setRegion(region, animated: true)
    }
}

2

Swift:3 同じ問題に直面しました。私は解決策を見つけるのに完全にめちゃくちゃでした。これが私が問題を修正した方法です。

ステップ-1:プロジェクトファイル>機能>バックグラウンドモード>ロケーションアップデートを選択

ステップ2: NSLocationWhenInUseUsageDescription、NSLocationAlwaysAndWhenInUseUsageDescriptionキーをInfo.plistに追加します

ステップ-3:

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true

allowBackgroundLocationUpdatesは間違いなく私の問題を解決しました、他の応答やフォーラムで報告されていないことは信じられません。Appleのドキュメントから:「このプロパティを使用して、プログラムでバックグラウンド更新を有効または無効にします。たとえば、ユーザーがバックグラウンド更新が必要なアプリの機能を有効にした後でのみ、このプロパティをtrueに設定できます。」「このプロパティのデフォルト値はfalseです。」developer.apple.com/documentation/corelocation/...
アンドレアGorrieri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.