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

12

最近,我在Xcode日志中经常收到与函数getLocationForBundleID有关的CoreMotion框架的奇怪警告:

[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'}  

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

我的问题是:

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


检查您的视图控制器上的委托。 我曾经遇到过同样的问题。我的委托没有添加到UI视图控制器上。[输入图像描述](https://i.stack.imgur.com/CRGiy.png) - user14698069
我不确定我是否理解你的意思:如果对象的委托未设置,则通常不会调用委托函数。但是这不会产生像我问题中那样的警告。你收到了同样的警告吗? - Reinhard Männer
我在我的项目中也开始看到这些问题,似乎大多数是无害的但很烦人。 - Engin Kurutepe
这种情况是在应用程序在前台时发生的吗?如果不是,那么警告可能是因为位置跟踪设置为仅在使用应用程序时允许。 - Pranav Kasetti
4个回答

4

显然,如果在CLLocationManager提供第一个位置之前读取其location属性,则会记录此错误消息。

我的解决方案如下:
我无论如何都使用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 
}  

现在这个错误信息不再被记录。


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

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

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


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

0

OS_ACTIVITY_MODE = disable

为了消除警告,请执行以下操作:

步骤

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接