Dịch vụ vị trí không hoạt động trong iOS 11


83

Tôi vừa xây dựng lại ứng dụng của mình bằng iOS 11 SDK để cố gắng xóa ứng dụng blue bannerhiện luôn xuất hiện. Tôi nghĩ - "Thật tuyệt vời, đã hoạt động", chỉ để phát hiện ra rằng các dịch vụ định vị hiện không hoạt động chút nào.

Ứng dụng từng hoạt động với iOS 10 - Có ai nghe thấy gì không?


Thêm NSLocationAlwaysAndWhenInUseUsageDescription trong Info.plist
Jayprakash Dubey

Câu trả lời:


156

Có vẻ như apple đã thêm một tính năng bảo mật khác. Người dùng hiện có thể ghi đè của chúng tôi requestAlwaysAuthorizationvà hạ cấp xuống requestWhenInUseAuthorization- Có nghĩa là với tư cách là nhà phát triển, chúng tôi hiện phải cung cấp cả hai mô tả trongInfo.plist

Tôi thấy rằng họ đã thêm một khóa mới 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.
*/

Tuy nhiên, khi sử dụng khóa mới này - dịch vụ định vị vẫn không hoạt động, khi tìm kiếm thêm, tôi thấy viên ngọc này bị trộn lẫn với tất cả thông tin gỡ lỗi bổ sung:

Ứng dụng này đã cố gắng truy cập dữ liệu nhạy cảm về quyền riêng tư mà không có mô tả sử dụng. Danh sách Info.plist của ứng dụng phải chứa cả khóa NSLocationAlwaysAndWhenInUseUsageDescription và NSLocationWhenInUseUsageDescription với các giá trị chuỗi giải thích cho người dùng cách ứng dụng sử dụng dữ liệu này

Điều này mâu thuẫn trực tiếp với nhận xét mà tôi tìm thấy trong CLLocationManager.htệp cập nhật . Vì vậy, tôi đã tạo ra một radar.

Tin tốt, nếu bạn làm theo lời khuyên của bảng điều khiển gỡ lỗi, IE. thêm cả khóa mới NSLocationAlwaysAndWhenInUseUsageDescriptionvà một trong các khóa cũ NSLocationWhenInUseUsageDescription, các dịch vụ vị trí sẽ bắt đầu hoạt động trở lại.


2
Tôi đang đối mặt với một tình huống tương tự. Chỉ tôi đang thử nghiệm trong iOS 10.2 và tôi đã NSLocationAlwaysUsageDescriptionthêm vào Info.plist của mình, đó là quyền mà tôi cần. Nhưng tôi nhận được thông báo ở trên trong bảng điều khiển cho biết tôi cũng cần thêm NSLocationWhenInUseUsageDescription.
Isuru

7
Thật không may, bây giờ người dùng nhận được một đoạn hội thoại với ba câu trả lời, trong đó khả năng bị ảnh hưởng nhiều nhất do người dùng thiếu kiên nhẫn bắt đầu là lựa chọn hàng đầu: "Chỉ khi đang sử dụng ứng dụng". Điều này sẽ làm cho các ứng dụng luôn được sử dụng trở nên vô dụng trừ khi người dùng trải qua tất cả những rắc rối khi thay đổi lại cài đặt sau đó. Ít nhất thì "Luôn cho phép" phải là lựa chọn hàng đầu khi đây là những gì ứng dụng đang yêu cầu!
Hans Terje Bakke

1
Tôi đã thêm tất cả ba khóa mô tả và tôi vẫn không nhận được cập nhật vị trí. Tôi đang thêm locationmanagerdelgate trong viewwillAppear và xóa đại biểu trong viewwilldisapper. Nếu tôi vào cài đặt và chọn Cho phép Luôn luôn được chọn. Tôi nhận được bản cập nhật chỉ một lần và sau đó không nhận được nữa. BẤT KỲ ý tưởng nào để khắc phục điều này. Cảm ơn trước!!
LoveMeSomeFood

@Uma - bạn đang gọi startUpdatingLocationhay requestLocation?
William George

@WilliamGeorge Tôi đang sử dụngstartUpdatingLocation
LoveMeSomeFood

43

Chỉ cần thêm các bước để sửa lỗi này:

2 cách để làm điều đó:

A) Cách dễ dàng: Chọn tệp Info.plist của bạn, thêm các thuộc tính, lưu ý rằng chúng bắt đầu bằng RIÊNG TƯ thay vì VỊ TRÍ ... do đó, tên chính xác của các biến này bắt đầu bằng "Quyền riêng tư - Vị trí ...", v.v., hãy thêm từng ở đây và mô tả cách người dùng nhìn thấy điều này trên cảnh báo.

B) Cách khó / thú vị / có chương trình (tôi thích cách này hơn):

Nhấp chuột phải vào Info.plist cho ứng dụng của bạn, sau đó chọn "Xem mã nguồn", bạn sẽ thấy tất cả ở dạng XML,

Thực hiện theo định dạng ...... khác và thêm các thuộc tính này như sau:

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

Lưu, sau đó bấm chuột phải vào tệp info.plist, sau đó chọn Danh sách thuộc tính, thao tác này sẽ xem tệp trở lại dạng xem mặc định.

BIÊN TẬP:

Một thành viên khác đã yêu cầu mã, đây là:

1) Trên tệp .H của bạn, hãy thêm:

@property (strong, nonatomic) CLLocationManager *LocationManager;

2) Trên tệp .M của bạn, thêm vào trong hà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];

Điều này làm việc tốt cho tôi, hy vọng mã cũng sẽ hoạt động cho bạn.

Trân trọng

Heider


1
Tôi đã thêm tất cả ba khóa mô tả và tôi vẫn không nhận được cập nhật vị trí. Tôi đang thêm locationmanagerdelgate vào viewwillAppear và xóa đại biểu trong viewwilldisapper. Nếu tôi đi đến cài đặt và chọn đã được chọn Allow Always. Tôi nhận được bản cập nhật chỉ một lần và sau đó không nhận được nữa. BẤT KỲ ý tưởng nào để khắc phục điều này. Cảm ơn trước!!
LoveMeSomeFood

Tôi sẽ thêm mã của tôi bây giờ để minh họa cho những gì đang làm việc cho tôi:
Heider Sati

Tôi có mã giống như mã của bạn. Tuy nhiên, tôi không nhận được thông tin cập nhật về vị trí, trừ khi tôi về nhà và quay lại ứng dụng. Điều này chỉ xảy ra trong iOS 11. Tôi vẫn không thể tìm ra lý do tại sao.
LoveMeSomeFood

Bạn có thể xem qua chủ đề này không? stackoverflow.com/questions/46616496/… . Cảm ơn bạn!
LoveMeSomeFood

Xin chào Uma, Một trong những người dùng của chúng tôi đã báo cáo vấn đề tương tự trên một trong các thiết bị, tôi đang điều tra vấn đề này và sẽ liên hệ lại với bạn, tôi đoán IOS11 đang khiến tất cả chúng ta cực kỳ bận rộn vào lúc này ... Tôi sẽ phải tìm hiểu và giải quyết việc này càng sớm càng tốt, xin vui lòng chịu với tôi ... nhờ
Heider Sati

23

hoạt động dưới iOS11 tôi đã phát hiện ra rằng Info.plist cần ít nhất NSLocationAlwaysAndWhenInUseUsageDescription trong Info.plist:

nhập mô tả hình ảnh ở đây

Thật kỳ lạ khi ứng dụng của bạn đa ngôn ngữ, các phiên bản bản địa hóa của chuỗi của bạn cần cả ba khóa được đề cập trong bài đăng này nếu không requestAlwaysAuthorization()locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) sẽ không hoạt động.

Ảnh hiển thị bản dịch tiếng Đức làm ví dụ:

nhập mô tả hình ảnh ở đây

Hy vọng điều này giúp bạn tiết kiệm thời gian khi vấp phải.


Cảm ơn, @iDoc! Điều này đã tiết kiệm cho tôi rất nhiều thời gian.
Reinhard Männer

Đây là câu trả lời chính xác, trong iOS 11 là bắt buộc bản địa hóa các khóa bảo mật vị trí.
jberlana

Sau 10 giờ, tôi nhận được bài đăng này ... tnx
1110

17

Làm việc trong 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>  

Cảm ơn vipulkumarmehta
Keshav Gera

13

Làm theo các bước sau:

Tôi đã gặp phải vấn đề tương tự với một ứng dụng cần "Luôn cấp quyền" và đã giải quyết nó bằng cách làm theo các bước sau:

1. Thêm NSLocationWhenInUseUsageDescription khóa vàoInfo.plist

2. Thêm NSLocationAlwaysAndWhenInUseUsageDescription vàoInfo.plist

3. Thêm NSLocationAlwaysUsageDescription vào Info.plist(để hỗ trợ <iOS 11)

4. Gọi requestWhenInUseAuthorization() TRƯỚC requestAlwaysAuthorization( )

Bạn không thể thực thi requestAlwaysAuthorization () trước requestWhenInUseAuthorization (). Bạn phải chuyển đến cấp độ quyền đó. Sau khi tôi thực hiện những thay đổi này, cập nhật vị trí bắt đầu hoạt động bình thường trở lại.

Nhiều thông tin thêm có thế được tìm thấy ở đây:

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


1
Không có gì thay đổi với điều đó :(
Cemal BAYRI

Tôi đã giải quyết bằng cách bật cờ allowBackgroundLocationUpdates. Xem stackoverflow.com/a/50733860/2610888
Andrea Gorrieri

6

An toàn hơn là xin lỗi .. Trong iOS 11: Thêm vào bên dưới và bạn tốt.

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

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

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

5

Đã thử nghiệm trên iOS 12.2 với Swift 5

Bước 1. bạn phải thêm các quyền riêng tư sau vào tệp 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>

Bước 2. Đảm bảo rằng bạn có mã nhanh sau để nhận các vị trí hiện tại

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 Tôi đã gặp phải vấn đề tương tự. tôi đã hoàn toàn khó khăn trong việc tìm ra giải pháp. đây là cách tôi khắc phục sự cố.

bước 1: Tệp dự án> Khả năng> chế độ nền> chọn Cập nhật vị trí

bước 2: Thêm các khóa NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription vào Info.plist

bước 3 :

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true

allowBackgroundLocationUpdates chắc chắn đã giải quyết được vấn đề của tôi, tôi không thể tin rằng nó không được báo cáo trong các phản hồi và diễn đàn khác. Từ tài liệu của Apple: "bạn sử dụng thuộc tính này để bật và tắt cập nhật nền theo chương trình. Ví dụ: bạn có thể đặt thuộc tính này thành true chỉ sau khi người dùng bật các tính năng trong ứng dụng của bạn khi cần cập nhật nền." "Giá trị mặc định của thuộc tính này là false." developer.apple.com/documentation/corelocation/…
Andrea Gorrieri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.