来自 CoreMotion.framework 的奇怪#NullIsland 警告

Strange #NullIsland warning from CoreMotion.framework

最近,我在 Xcode 日志中收到许多来自 CoreMotion 框架的奇怪警告,与函数 getLocationForBundleID:

相关
[Client] {"msg":"#NullIsland Either the latitude or longitude was exactly 0! That's highly unlikely", "latIsZero":0, "lonIsZero":0}  
[Client] {"msg":"#NullIsland Received a latitude or longitude from getLocationForBundleID that was exactly zero", "latIsZero":0, "lonIsZero":0, "location":'28 5B E0 D7 EB 7F 00 00'}  

我没有发现我的应用程序有任何故障。所以也许这些日志可以忽略,但无论如何它们都很烦人。

我的问题是:

如何更正潜在的错误?
我怎样才能停止这些警告?

我在尝试获取用户在应用中的位置时遇到了同样的错误。有两件事阻止我获得有效的 lat/long。我遇到的主要问题是我使用的是模拟器并且必须手动设置位置。如果您使用的是模拟器,请转至 XCode,单击调试 --> 模拟位置,然后选择一个位置。我还必须确保将正确的位置权限密钥添加到 Info.plist。您也可能已经知道,但是您会知道 Info.plist 中是否缺少任何键,因为单独的错误消息将打印到这些 lat/long 错误消息上方或下方的控制台,并且它将告诉你哪个键丢失了。所以基本上:

  1. 确保您在用于测试应用程序的 device/simulator 上接受了所有必要的位置权限。
  2. 获得位置权限后,如果使用模拟器,请设置一个位置。

不确定这是否有帮助,但我希望它有帮助。如果您已经确认这些不是问题,我不确定是什么导致了您的问题,但是单步执行负责获取用户位置的代码部分可能有助于了解哪个 link 进程失败。

显然,如果 CLLocationManager 的 属性 locationCLLocationManager 传送第一个位置之前被读取,则会记录此错误消息。

我的解决方案如下:
我无论如何都使用 CLLocationManager 的子类,它允许我以编程方式设置 location 属性 进行测试。 这是按如下方式完成的:

private var _location: CLLocation?
@objc dynamic override var location: CLLocation? {
    get { 
        let usedLocation = _location ?? super.location // Here the error is logged if no location has been delivered yet
        return usedLocation 
    }
    set {
        _location = newValue
    }   
}

这个子类现在有一个额外的 属性

  var anyLocationDelivered = false  

即在

中设置true
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        locationManager.anyLocationDelivered = true
    // …
  }  

现在getter

get { 
    guard anyLocationDelivered else { return nil }
    let usedLocation = _location ?? super.location
    return usedLocation 
}  

现在不再记录此错误消息。

  1. 问题可能是您 运行 您在模拟器上的应用程序,默认情况下它不会使用您的当前位置,除非您在“调试”、“模拟位置”中手动更改模拟位置。
  2. 要解决此问题,请模拟您的当前位置(如上所述)或 运行 您在物理签名设备上的应用程序,完全关闭该应用程序,然后重新启动您的应用程序。