定位服务在 iOS 11 中不起作用
Posted
技术标签:
【中文标题】定位服务在 iOS 11 中不起作用【英文标题】:Location Services not working in iOS 11 【发布时间】:2017-11-09 11:34:37 【问题描述】:我刚刚使用 ios 11 SDK 重建了我的应用程序,试图删除现在总是出现的 blue banner
。我想 - “太棒了,这工作”,却发现定位服务现在根本不起作用。
曾经与 iOS 10 配合使用的应用程序 - 有人听说过吗?
【问题讨论】:
在 Info.plist 中添加 NSLocationAlwaysAndWhenInUseUsageDescription 【参考方案1】:苹果似乎又增加了一项隐私功能。用户现在可以覆盖我们的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
和旧密钥之一NSLocationWhenInUseUsageDescription
,位置服务将重新开始工作。
【讨论】:
我面临着非常相似的情况。只有我在 iOS 10.2 中进行测试,并且我已将NSLocationAlwaysUsageDescription
添加到我的 Info.plist 中,这是我需要的权限。但我在控制台中收到上述消息,说我还需要添加 NSLocationWhenInUseUsageDescription
。
不幸的是,用户现在得到一个包含三个答案的对话,其中最有可能因为用户不耐烦而受到打击的是首选:“仅在使用应用程序时”。除非用户经历了之后再次更改设置的所有麻烦,否则这将使需要始终使用的应用程序变得无用。当这是应用要求的时候,至少“始终允许”应该是首选!
我已经添加了所有三个描述键,但我仍然没有收到位置更新。我在 viewwillAppear 中添加 locationmanagerdelgate 并在 viewwilldisapper 中删除委托。如果我去设置并选择已经选择的Allow Always。我只收到一次更新,然后就没有了。任何想法如何解决这个问题。提前致谢!
@Uma - 你打电话给startUpdatingLocation
还是requestLocation
?
@WilliamGeorge 我正在使用startUpdatingLocation
【参考方案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文件,然后选择Property list,这应该会将文件查看回默认视图。
编辑:
另一位会员要代码,这里是:
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];
这对我来说很好,希望代码也对你有用。
问候
海德
【讨论】:
我已经添加了所有三个描述键,但我仍然没有收到位置更新。我在viewwillAppear
中添加locationmanagerdelgate 并在viewwilldisapper
中删除委托。如果我去设置并选择已经选择的Allow Always
。我只得到一次更新,然后就没有了。任何想法如何解决这个问题。提前致谢!
我现在将添加我的代码来说明什么对我有用:
我的代码和你的一样。但是,除非我回家并回到应用程序,否则我不会获得位置更新。这只发生在 iOS 11 中。我仍然不知道为什么。
你能看看这个帖子吗? ***.com/questions/46616496/…。谢谢!
嗨 Uma,我们的一位用户在其中一台设备上报告了同样的问题,我正在调查此问题并会回复您,我想 IOS11 让我们现在都非常忙碌。 . 我必须尽快找出并解决这个问题,请多多包涵……谢谢【参考方案3】:
在 iOS11 下工作我发现,Info.plist 至少需要 Info.plist 中的 NSLocationAlwaysAndWhenInUseUsageDescription:
奇怪的是,当您的应用是多语言时,您的字符串的本地化版本需要本文中提到的所有三个键,否则 requestAlwaysAuthorization()
和 locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
会默默地失败。
以德语翻译为例:
希望这可以在您遇到问题时节省您的时间。
【讨论】:
谢谢,@iDoc!这为我节省了很多时间。 这是正确答案,在 iOS 11 中强制本地化位置隐私密钥。 10 小时后我看到这篇文章... tnx【参考方案4】:在 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【参考方案5】:按照以下步骤操作:
我在需要“始终授权”的应用上遇到了同样的问题,并通过以下步骤解决了它:
1. 添加 NSLocationWhenInUseUsageDescription
密钥到Info.plist
2. 添加 NSLocationAlwaysAndWhenInUseUsageDescription
到 Info.plist
3. 添加 4. 致电 您不能在 requestWhenInUseAuthorization() 之前执行 requestAlwaysAuthorization()。您必须升级到该权限级别。一旦我进行了这些更改,位置更新就会再次开始正常工作。 更多细节可以在这里找到: https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/requesting_always_authorizationNSLocationAlwaysUsageDescription
到Info.plist
(以支持requestWhenInUseAuthorization()
之前 requestAlwaysAuthorization(
)
【讨论】:
没有任何改变:( 我通过启用标志allowBackgroundLocationUpdates解决了。见***.com/a/50733860/2610888【参考方案6】:安全总比抱歉.. 在 iOS 11 中:添加以下内容即可。
<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>
【讨论】:
【参考方案7】:使用 Swift 5
在 iOS 12.2 上测试步骤 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 步。确保您有以下 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)
【讨论】:
【参考方案8】:斯威夫特:3 我也面临同样的问题。我完全搞砸了寻找解决方案。这是我解决问题的方法。
第 1 步: 项目文件 > 功能 > 后台模式 > 选择 位置更新
第二步: 将 NSLocationWhenInUseUsageDescription 、 NSLocationAlwaysAndWhenInUseUsageDescription 键添加到 Info.plist
第三步:
manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true
【讨论】:
allowsBackgroundLocationUpdates 绝对解决了我的问题,我不敢相信它没有在其他回复和论坛中报告。来自 Apple 文档:“您可以使用此属性以编程方式启用和禁用后台更新。例如,您可以仅在用户在您的应用中启用需要后台更新的功能后将此属性设置为 true。” “此属性的默认值为 false。” developer.apple.com/documentation/corelocation/…以上是关于定位服务在 iOS 11 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章