2017-09-25 131 views
12

从用户请求位置的权限,当我使用的时候,我有一个问题iOS11我info.plist中包含位置权限问题11的iOS和iOS 10

<key>NSLocationWhenInUseUsageDescription</key> 
<string>When in use permissions</string> 
<key>NSLocationAlwaysUsageDescription</key> 
<string>always permissions</string> 
<key>NSLocationAlwaysAndWhenInUsageDescription</key> 
<string>Always and in usage permissions</string> 

我有两个映射一个客户和其他员工。对于员工而言,我需要知道使用

locationManager.requestAlwaysAuthorization()

对于客户我只需要同时位置,即使应用程序没有运行或者转到后台(签约时,他们能够将其关闭),它们的位置,并要求允许该应用程序正在使用中,并要求使用

locationManager.requestWhenInUseAuthorization()

在iOS系统11这只是请求允许在使用的时候,从来没有在总的权限的权限。

在iOS 10中它具有正确的行为。

我想要的行为如下: 当他们是客户(未登录)时,它只会要求在使用时的权限。如果他们登录(员工),即使在不使用时也请求位置。

如果任何人都可以阐明我错过/做错了什么,将不胜感激。

需要注意的是,如果我删除权限NSLocationAlwaysUsageDescription iOS10和iOS11有同样的问题不总是请求权限。

稍微澄清一点。 我已经实现了didChangeAuthorization委托函数,并且当用户允许来自调用requestWhenInUseAuthorization() 的警报的权限时被调用,但是当我在位置管理器上调用requestWhenInUseAuthorization()函数时,委托方法未被调用,就好像它从不接收该调用并且没有提示对话框显示给用户。

+0

您是在真实设备上测试吗?你是否在位置更新位置管理器委托方法 –

+0

是测试在两个真实设备上测试iPhone 5运行iOS 10.3.3和iPhone 6运行iOS 11.我有位置管理器委托函数didChangeAuthorization和didUpdateLocations日志。位置正在被调用(当在前台),并且当我在请求使用权限时请求更改授权,但并不总是使用权限。 –

+0

看看这个答案https://stackoverflow.com/a/46339284/3024579 – Alok

回答

7

我想通过创建一个快速独立的应用程序,只要求权限的问题,我被给了错误日志th在声明我使用的钥匙是错误的。

我有NSLocationAlwaysAndWhenInUsageDescription而不是NSLocationAlwaysAndWhenInUseUsageDescription这是奇怪的,因为从docs它声明应该使用NSLocationAlwaysAndWhenInUsageDescription。切换到包括正确的关键固定问题和现在的权限如预期的iOS 11和10的作品。

感谢您的所有帮助。

0

对于这两种情况,客户和员工,你首先需要调用locationManager.requestWhenInUseAuthorization()

然后,只有当他们是员工,添加调用 locationManager.requestAlwaysAuthorization()

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

概述要配置总是授权的位置服务,做 以下:添加NSLocationWhenInUseUsageDescription密钥和 NSLocationAlwaysAndW henInUsageDescription键到Info.plist文件。 (Xcode中显示这些键为“隐私 - 位置在使用时用法 说明”和“隐私 - 位置始终和使用时使用 说明”中的Info.plist编辑)如果您的应用支持iOS的10 和更早版本,将NSLocationAlwaysUsageDescription密钥添加到您的 Info.plist文件中。 (Xcode在Info.plist编辑器中将此项显示为“隐私 - 位置 始终使用说明”。)创建并配置您的CLLocationManager对象。请先调用 requestWhenInUseAuthorization()以启用您的应用的基本 位置支持。当您使用需要授权级别的服务时,只调用requestAlwaysAuthorization()方法 。

+0

我应该使它更清楚时,应用程序打开每个人都被视为一个客户,它调用locationManager.requestWhenInUseAuthorization ()'''一旦他们登录它然后请求'''locationManager.requestAlwaysAuthorization()'''我的理解是,只要我在某个时候使用请求时,我应该能够始终跟踪请求任何晚点。这是正确的还是我误解了? –

+0

是的,这是正确的。 一些愚蠢的问题 - 1.您是否尝试从iPhone中删除应用程序并重新安装?如果没有,尝试清理项目,删除应用程序,然后重新安装它。 2.检查您的系统设置 - 用户可以在系统设置中禁用位置服务,无论是针对您的应用程序还是针对所有应用程序。 – Roee84

+0

1)我确实尝试安装/卸载。 2)我检查了我的系统设置,并且在iOS11上没有始终的权限,不知道是否有帮助。 感谢您的帮助。 –

4

在你Info.plist文件添加此:

<key>NSLocationUsageDescription</key> 
<string></string> 
<key>NSLocationWhenInUseUsageDescription</key> 
<string></string> 
在迅速文件

现在,不要忘了添加委托:CLLocationManagerDelegate

在您的viewDidLoad(),补充一点:

locationManager = CLLocationManager() 

locationManager.delegate = self 

locationManager.requestWhenInUseAuthorization() 

locationManager.desiredAccuracy = kCLLocationAccuracyBest 

locationManager.startUpdatingLocation() 

locationManager.startMonitoringSignificantLocationChanges() 

// Here you can check whether you have allowed the permission or not. 

if CLLocationManager.locationServicesEnabled() 
    { 
     switch(CLLocationManager.authorizationStatus()) 
     { 

     case .authorizedAlways, .authorizedWhenInUse: 

      print("Authorize.") 

      break 

     case .notDetermined: 

      print("Not determined.") 

      break 

     case .restricted: 

      print("Restricted.") 

      break 

     case .denied: 

      print("Denied.") 
     } 
    } 
+3

不幸的是,这不是它需要NSLocationAlwaysAndWhenInUsageDescription https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/request_always_authorization为iOS 11问题 –

+2

你不需要休息的快速切换的情况下AKHIL – Cesare

+0

@Cesare我的背景是在C#和Java中。感谢您指出。大声笑 :) –