web-dev-qa-db-ja.com

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

IOS 11 SDKを使用してアプリを再構築し、常に表示されているblue bannerを削除しようとしました。私は思った - 「素晴らしい、うまくいった」、それは位置情報サービスが現在まったく機能していないことを発見するためだけです。

アプリケーションはiOS 10で動作していました - 誰かが何かを聞いたことがありますか?

80
William George

Appleがさらに別のプライバシー機能を追加したようだ。ユーザーは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の両方を追加すると、ロケーションサービスは再び機能し始めます。

153
William George

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

それをする2つの方法:

A)簡単な方法:Info.plistファイルを選択し、プロパティを追加し、それらがLOCATIONの代わりにPRIVCYで始まることに注意してください。それぞれここにあり、ユーザが警告でこれをどのように見ているかを説明します。

B)難しい/おもしろい/プログラム的な方法(私はこの方法がより好きです):

アプリのInfo.plistを右クリックして、[View source code]を選択すると、すべて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];

これは私にとってはうまくいきますが、うまくいけばコードもあなたにとってうまくいくでしょう。

よろしく

ハイダー

38
Heider Sati

私は、Info.plistがInfo.plistのNSLocationAlwaysAndWhenInUseUsageDescriptionを必要とすることを発見しました。

enter image description here

あなたのアプリが多言語の場合、あなたの文字列のローカライズ版には3つのキーすべてが必要ですこの記事で言及されていなければ、requestAlwaysAuthorization()locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)は黙って失敗するでしょう。

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

enter image description here

つまずくときにこれがあなたの時間を節約することを願っています。

20
iDoc

Swift 4.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>  
16
Keshav Gera

次の手順を実行します:

「常に認証」を必要とするアプリで同じ問題に遭遇し、次の手順に従って解決しました。

1。Info.plistNSLocationWhenInUseUsageDescriptionキーを追加

2。Info.plistNSLocationAlwaysAndWhenInUseUsageDescriptionを追加

3。Info.plistNSLocationAlwaysUsageDescriptionを追加します(<iOS 11をサポートするため)。

4。requestWhenInUseAuthorization()_ _の前requestAlwaysAuthorization(

RequestWhenInUseAuthorization()の前にrequestAlwaysAuthorization()を実行することはできません。その許可レベルにエスカレートする必要があります。これらの変更を加えると、位置情報の更新は再び正常に機能し始めました。

詳細はこちらにあります。

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

11
mhit0

すみませんよりも安全です。 iOS 11の場合:以下を追加してください。

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

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

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>
6
Abhishek Bedi

Swift:私は同じ問題に直面しました。私は完全に解決策を見つけるのに戸惑いました。これは私がどのように問題を解決したかです。

step-1:プロジェクトファイル>機能>バックグラウンドモード> select Location Update

step-2: NSLocationWhenInUseUsageDescription、NSLocationAlwaysAndWhenInUseUsageDescriptionキーをInfo.plistに追加します。

step-3:

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true
1
Santosh Sahoo

iOS 12.2Swift 5でテスト済み

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

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

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

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

ステップ2。あなたが現在の位置を取得するために以下のSwiftコードを持っていることを確認してください

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)
    }
}
0
swiftBoy