locationManager didEnterRegion未在XCode 9 Simulator中调用

mar*_*and 0 xcode cllocationmanager ios ios-simulator swift

我有一个做地理围栏的应用程序.当我在模拟器(Xcode 8.3.3和Xcode 9)中运行它时,一切似乎都有效,但我的CLLocationManager didEnterRegion永远不会被调用.

当我在iPhone上运行应用程序时,无论是在现实世界中(进入某个区域)还是在Xcode中通过位置模拟运行,它都被称为正常.

知道为什么会这样吗?

我发现的一个区别是模拟器在使用时只支持监控位置,所以我必须设置好所以我的plist文件中有两个权限字符串,但除此之外我感到难过.

由于我不提供代码(它太复杂并且在我的应用程序中分发),让我注意一下模拟器中的工作原理:

  1. 在我的应用程序方案中,我选中了"允许位置模拟",并且我已经为我正在监控的位置添加了几个.gpx文件.我有一个默认的位置设置.

  2. 我启动时会调用我的位置管理器代理.我得到了.在模拟器中使用了授权者,然后在电话上使用了.

  3. 当位置发生变化时,将调用locationManager(:didUpdateLocations :).

  4. 当调用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))")
            }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    它的工作原理.所以我的地区受到监控,我的位置就是我认为应该的位置.

  5. 最后,没有调用我的locationManager委托的monitoringDidFailFor和didFailWithError.并非他们从来没有 - 他们在开发过程中,但现在不是.

所以我很难过.再次,它在手机上工作正常,而不是在模拟器中.

我究竟做错了什么?

mar*_*and 7

好的,我发现了问题.首先,Xcode 9/iOS 11需要进行更改.我向Apple提交了一个错误并收到以下信息:

在iOS11中,如果所有应用程序都支持Always授权,则它们必须支持WhenInUse授权.通过此更改,位置服务使用情况说明密钥已更改.对于要获得"始终提示"的应用程序,他们必须在其应用程序的Info.plist中同时具有NSLocationAlwaysAndWhenInUseUsageDescription和NSLocationWhenInUseUsageDescription.

因此,如果您正在呼叫:locationManager.requestAlwaysAuthorization(),对于iOS 11,您需要同时拥有NSLocationAlwaysAndWhenInUseUsageDescriptionNSLocationWhenInUseUsageDescription.如果你希望你的应用程序继续在iOS 11之前工作,你还需要保留NSLocationAlwaysUsageDescription,所以你将拥有3个密钥.

我用Ray Wenderlich教程证实了这一点,Kuhncj的参考.它不适用于Xcode 9,但适用于Xcode 8.

我的问题是我的错误.虽然我有3个正确的密钥,但在审查我要求权限的位置时,我有以下内容:

var permission : Permission = SimulatorPlatform.isSimulator ? .locationWhenInUse : .locationAlways

所以我基本上为模拟器和设备运行不同的代码.更改后,我的应用程序确实被调用到达受监控区域.