在XCode 9模拟器

时间:2017-06-23 13:15:15

标签: ios swift xcode ios-simulator cllocationmanager

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

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

知道为什么会这样吗?

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

由于我没有提供代码(它在我的应用程序中过于复杂和分布),让我注意一下模拟器中的工作原理:

  1. 在我的应用程序计划中,我已经允许位置模拟'检查,我有一些.gpx文件添加到我监控的位置。我有一个默认的位置设置。

  2. 我启动时正在调用我的位置管理器委托。我得到了。在模拟器中使用了授权者,然后在电话上单独使用。

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

  5. 当调用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))")
            }
    }
    

    它有效。所以我的地区受到监控,我的位置就是我认为应该的位置。

  6. 最后,我的locationManager委托的monitoringDidFailFor和didFailWithError未被调用。并非他们从来没有 - 他们在开发期间,但现在没有。

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

    我做错了什么?

2 个答案:

答案 0 :(得分:7)

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

  

在iOS11中,所有应用程序必须支持WhenInUse授权   支持始终授权。通过此更改位置服务使用情况   描述键已更改。对于应用程序获取始终提示   显示他们必须同时拥有NSLocationAlwaysAndWhenInUseUsageDescription和   NSLocationWhenInUseUsageDescription在他们的App的Info.plist中。

因此,如果您致电:locationManager.requestAlwaysAuthorization(),对于iOS 11,您需要同时拥有NSLocationAlwaysAndWhenInUseUsageDescriptionNSLocationWhenInUseUsageDescription。如果您希望自己的应用继续在iOS 11之前工作,则还需要保留NSLocationAlwaysUsageDescription,这样您才能拥有3个密钥。

我用Kuhncj引用的Ray Wenderlich教程证实了这一点。因为它不能与Xcode 9一起使用,但与Xcode 8一起使用。

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

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

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

答案 1 :(得分:0)

对于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>