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

Strange #NullIsland warning from CoreMotion.framework

提问人:Reinhard Männer 提问时间:11/22/2020 更新时间:1/4/2023 访问量:4076

问:

从最近开始,我在 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'}  

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

我的问题是:

如何纠正潜在错误?
如何阻止这些警告?

iOS 位置 核心 运动

评论

0赞 user14698069 11/24/2020
在视图控制器上检查您的委托。我面临着同样的问题。我的委托未添加到 UI 视图控制器上。在此处输入图像描述
0赞 Reinhard Männer 11/24/2020
我不确定我是否正确理解了你:如果未设置对象的委托,则通常不会调用委托函数。但这不会产生像我问题中那样的警告。你收到同样的警告了吗?
0赞 Engin Kurutepe 11/30/2020
我也开始在我的项目中看到这些在 iOS 14 中。似乎大多是无害的,但很烦人。
0赞 Pranav Kasetti 1/5/2021
当应用位于前台时,是否会发生这种情况?如果没有,则警告可能是因为位置跟踪设置为仅在使用应用程序时才允许。

答:

2赞 James D 1/5/2021 #1

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

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

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

4赞 Reinhard Männer 1/8/2021 #2

显然,如果在传递第一个位置之前读取了 a 的属性,则会记录此错误消息。locationCLLocationManagerCLLocationManager

我的解决方案如下:
无论如何,我都使用它的子类,允许我以编程方式设置测试的属性。 具体操作如下:
CLLocationManagerlocation

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
    // …
  }  

而吸气剂现在是

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

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

0赞 Nathan Anthony 10/24/2021 #3
  1. 问题可能是你在模拟器上运行了应用程序,除非你在调试、模拟位置中手动更改模拟位置,否则模拟器默认不使用当前位置。
  2. 若要解决此问题,请模拟当前位置(如上所述)或在物理签名设备上运行应用程序,完全关闭应用程序,然后重新启动应用程序。
0赞 user12500771 1/4/2023 #4

OS_ACTIVITY_MODE = 禁用

要删除警告,请执行以下操作:

步骤

导航到“产品”-“>方案”-“>”编辑方案”。 打开“参数”选项卡 环境变量部分添加OS_ACTIVITY_MODE = 禁用