定位服务在iOS 11中不起作用


83

我只是用iOS 11 SDK重建了我的应用程序,试图删除blue banner现在总是出现的应用程序。我以为“很棒,那很有效”,只是发现定位服务现在根本无法正常工作。

该应用程序过去曾与iOS 10配合使用-有人听到了吗?


在Info.plist中添加NSLocationAlwaysAndWhenInUseUsageDescription
Jayprakash Dubey

Answers:


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必须同时包含NSLocationAlwaysAndWhenInInUseUsageDescription和NSLocationWhenInUseUsageDescription键,并带有向用户说明该应用程序如何使用此数据的字符串值

这与我在更新CLLocationManager.h文件中找到的注释直接矛盾。因此,我创建了雷达。

好消息,如果您遵循调试控制台IE的建议。同时添加新密钥NSLocationAlwaysAndWhenInUseUsageDescription和旧密钥之一NSLocationWhenInUseUsageDescription,Locations服务将再次开始工作。


2
我面临着非常相似的情况。只有我在iOS 10.2中进行测试,并且已将NSLocationAlwaysUsageDescription我所需的权限添加到Info.plist中。但是我在控制台中收到上述消息,说我也需要添加NSLocationWhenInUseUsageDescription
Isuru

7
不幸的是,用户现在得到一个带有三个答案的对话框,其中最容易因用户不耐烦而被击中的是最佳选择:“仅在使用应用程序时”。除非用户随后经历了再次更改设置的所有麻烦,否则那些始终需要使用的应用将变得无用。当这正是应用程序所要求的时,至少“始终允许”应该是首选!
汉斯·特耶·巴克

1
我已经添加了所有三个描述码,但仍然没有收到位置更新。我在viewwillAppear中添加locationmanagerdelgate并在viewwilldisapper中删除委托。如果我转到设置并选择已选择的“始终允许”。我只得到一次更新,然后就没有了。想法如何解决。提前致谢!!
LoveMeSomeFood

@Uma-您打给startUpdatingLocation还是requestLocation
威廉·乔治

我使用的startUpdatingLocation
@WilliamGeorge

43

只是添加解决此问题的步骤:

2种方法:

A)简单方法:选择Info.plist文件,添加属性,请注意,它们以PRIVCY而不是LOCATION开头...因此,这些变量的确切名称以“ 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
我已经添加了所有三个描述码,但仍然没有收到位置更新。我要在中添加locationmanagerdelgateviewwillAppear 并在中删除委托viewwilldisapper。如果我去设置并选择已经选择的Allow Always。我只得到一次更新,然后就没有了。想法如何解决。提前致谢!!
LoveMeSomeFood

我现在将添加代码来说明对我
有用的

我有和你相同的代码。但是,除非我回到家并返回到应用程序,否则我不会获得位置更新。这仅发生在iOS 11中。我仍然不知道为什么。
LoveMeSomeFood

你可以看看这个线程吗?stackoverflow.com/questions/46616496/…。谢谢!
LoveMeSomeFood

嗨,乌玛(Uma),我们的一位用户在其中一台设备上报告了相同的问题,我正在对此进行调查,并将尽快回复您,我想IOS11目前让我们所有人都很忙...我必须找出并尽快解决这个问题,请多多包涵...谢谢
Heider Sati

23

我发现在iOS11下工作,Info.plist至少需要Info.plist中的NSLocationAlwaysAndWhenInUseUsageDescription:

在此处输入图片说明

很奇怪,当你的应用程序是多语言的字符串的本地化版本需要所有三个键在这篇文章中提到的其他requestAlwaysAuthorization()locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) 将静默失败。

截图显示了德语翻译:

在此处输入图片说明

希望这样做可以节省您的时间。


谢谢@iDoc!这节省了我很多时间。
ReinhardMänner'17 / 10/23

这是正确的答案,在iOS 11中是强制本地化位置隐私密钥。
jberlana

10小时后,我得到这个职位... TNX
1110

17

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

感谢vipulkumarmehta
Keshav Gera

13

跟着这些步骤:

我遇到了一个需要“始终授权”的应用程序,并通过以下步骤解决了该问题:

1. NSLocationWhenInUseUsageDescription密钥添加Info.plist

2. 添加 NSLocationAlwaysAndWhenInUseUsageDescriptionInfo.plist

3. 添加 NSLocationAlwaysUsageDescriptionInfo.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
一切都没有改变:(
Cemal BAYRI

我通过启用标志allowBackgroundLocationUpdates解决了。参见stackoverflow.com/a/50733860/2610888
Andrea Gorrieri,

6

安全胜于遗憾.. 在iOS 11中:添加以下内容,您就很好。

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

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

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

5

iOS 12.2上使用Swift 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

斯威夫特:3 我也遇到过同样的问题。我完全搞砸了寻找解决方案。这是我解决问题的方法。

步骤1:项目文件>功能>后台模式>选择位置更新

步骤2: 将NSLocationWhenInUseUsageDescription,NSLocationAlwaysAndWhenInUseUsageDescription键添加到Info.plist

第三步:

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true

allowBackgroundLocationUpdates绝对解决了我的问题,我不敢相信其他响应和论坛中也没有报告过。来自Apple文档:“您可以使用此属性以编程方式启用和禁用后台更新。例如,只有在用户启用需要后台更新的应用程序中的功能之后,才可以将此属性设置为true。” “此属性的默认值为false。” developer.apple.com/documentation/corelocation/...
安德烈Gorrieri
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.