XCode 9 模拟器中未调用 locationManager didEnterRegion
locationManager didEnterRegion not called in XCode 9 Simulator
我有一个可以进行地理围栏的应用程序。当我在模拟器(Xcode 8.3.3 和 Xcode 9)中 运行 时,一切似乎都正常工作,但我的 CLLocationManager didEnterRegion 从未被调用过。
当我 运行 我的 iPhone 上的应用程序时,无论是在现实世界中(进入一个区域)还是在 Xcode 中通过位置模拟,它都被调用得很好。
知道为什么会这样吗?
我发现的一个区别是模拟器只在使用时支持监控位置,所以我必须进行设置,所以我的 plist 文件中有两个权限字符串,但除此之外我很困惑.
因为我没有提供代码(它太复杂并且分布在我的应用程序中),让我记下模拟器中的工作:
在我的应用方案中,我检查了 'Allow Location Simulation' 并且为我正在监视的位置添加了一些 .gpx 文件。我设置了默认位置。
我的位置管理器委托在我启动时被调用。我在模拟器中获得 .authorizedWhenInUse,在 phone.
中获得 .authorizedAlways
locationManager(:didUpdateLocations:) 在位置更改时被调用。
调用 didUpdateLocations 时,我执行以下操作:
for r in manager.monitoredRegions {
if let cr = r as? CLCircularRegion {
if cr.contains(location.coordinate) {
log.debug("Am in the region!")
} else {
let crLoc = CLLocation(latitude: cr.center.latitude,
longitude: cr.center.longitude)
log.debug("distance is: \(location.distance(from: crLoc))")
}
}
而且有效。所以我的区域正在被监视,我的位置是我认为应该在的位置。
最后,我的 locationManager 委托的 monitoringDidFailFor 和 didFailWithError 没有被调用。并不是说他们从来没有 - 他们在开发过程中有,但不是现在。
所以我很难过。同样,它在 phone 上运行良好,但在模拟器上运行不正常。
我做错了什么?
好的,我找到问题了。首先,Xcode 9/iOS 11 需要更改。我已向 Apple 提交了一个错误并收到以下信息:
In iOS11 all applications must support WhenInUse authorization if they
support Always authorization. With this change the Location Services usage
description keys have changed. For an application to get an Always prompt to
show they must have both NSLocationAlwaysAndWhenInUseUsageDescription and
NSLocationWhenInUseUsageDescription in their App’s Info.plist.
因此,如果您调用:locationManager.requestAlwaysAuthorization()
,对于 iOS 11,您需要同时拥有 NSLocationAlwaysAndWhenInUseUsageDescription
和 NSLocationWhenInUseUsageDescription
。如果您希望您的应用在 iOS 11 之前继续运行,您还需要保留 NSLocationAlwaysUsageDescription
,因此您将拥有 3 个键。
我通过 Kuhncj 引用的 Ray Wenderlich 教程证实了这一点。实际上,它不适用于 Xcode 9,但适用于 Xcode 8。
我的问题是我的错误。虽然我有 3 个正确的密钥,但在查看我请求权限的位置时,我有以下内容:
var permission : Permission = SimulatorPlatform.isSimulator ? .locationWhenInUse : .locationAlways
所以我基本上是 运行 模拟器和设备的不同代码。更改后,我的应用确实被调用到达受监控区域。
对于 iOS 11,请在 info.plist 中使用以下内容:
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Need Location</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Need Location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Access For Location</string>
我有一个可以进行地理围栏的应用程序。当我在模拟器(Xcode 8.3.3 和 Xcode 9)中 运行 时,一切似乎都正常工作,但我的 CLLocationManager didEnterRegion 从未被调用过。
当我 运行 我的 iPhone 上的应用程序时,无论是在现实世界中(进入一个区域)还是在 Xcode 中通过位置模拟,它都被调用得很好。
知道为什么会这样吗?
我发现的一个区别是模拟器只在使用时支持监控位置,所以我必须进行设置,所以我的 plist 文件中有两个权限字符串,但除此之外我很困惑.
因为我没有提供代码(它太复杂并且分布在我的应用程序中),让我记下模拟器中的工作:
在我的应用方案中,我检查了 'Allow Location Simulation' 并且为我正在监视的位置添加了一些 .gpx 文件。我设置了默认位置。
我的位置管理器委托在我启动时被调用。我在模拟器中获得 .authorizedWhenInUse,在 phone.
中获得 .authorizedAlways
locationManager(:didUpdateLocations:) 在位置更改时被调用。
调用 didUpdateLocations 时,我执行以下操作:
for r in manager.monitoredRegions { if let cr = r as? CLCircularRegion { if cr.contains(location.coordinate) { log.debug("Am in the region!") } else { let crLoc = CLLocation(latitude: cr.center.latitude, longitude: cr.center.longitude) log.debug("distance is: \(location.distance(from: crLoc))") } }
而且有效。所以我的区域正在被监视,我的位置是我认为应该在的位置。
最后,我的 locationManager 委托的 monitoringDidFailFor 和 didFailWithError 没有被调用。并不是说他们从来没有 - 他们在开发过程中有,但不是现在。
所以我很难过。同样,它在 phone 上运行良好,但在模拟器上运行不正常。
我做错了什么?
好的,我找到问题了。首先,Xcode 9/iOS 11 需要更改。我已向 Apple 提交了一个错误并收到以下信息:
In iOS11 all applications must support WhenInUse authorization if they support Always authorization. With this change the Location Services usage description keys have changed. For an application to get an Always prompt to show they must have both NSLocationAlwaysAndWhenInUseUsageDescription and NSLocationWhenInUseUsageDescription in their App’s Info.plist.
因此,如果您调用:locationManager.requestAlwaysAuthorization()
,对于 iOS 11,您需要同时拥有 NSLocationAlwaysAndWhenInUseUsageDescription
和 NSLocationWhenInUseUsageDescription
。如果您希望您的应用在 iOS 11 之前继续运行,您还需要保留 NSLocationAlwaysUsageDescription
,因此您将拥有 3 个键。
我通过 Kuhncj 引用的 Ray Wenderlich 教程证实了这一点。实际上,它不适用于 Xcode 9,但适用于 Xcode 8。
我的问题是我的错误。虽然我有 3 个正确的密钥,但在查看我请求权限的位置时,我有以下内容:
var permission : Permission = SimulatorPlatform.isSimulator ? .locationWhenInUse : .locationAlways
所以我基本上是 运行 模拟器和设备的不同代码。更改后,我的应用确实被调用到达受监控区域。
对于 iOS 11,请在 info.plist 中使用以下内容:
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Need Location</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Need Location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Access For Location</string>