提问人:Reinhard Männer 提问时间:11/22/2020 更新时间:1/4/2023 访问量:4076
来自 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'}
我没有看到我的应用程序有任何故障。所以也许这些日志可以忽略,但它们无论如何都很烦人。
我的问题是:
如何纠正潜在错误?
如何阻止这些警告?
答:
尝试在应用程序中获取用户的位置时,我遇到了同样的错误。有两件事阻止我获得有效的纬度/经度。我遇到的主要问题是我正在使用模拟器,必须手动设置位置。如果您使用的是模拟器,请转到 XCode,单击 Debug --> Simulate Location,然后选择一个位置。我还必须确保将正确的位置权限密钥添加到 Info.plist。您可能也已经知道,但您会知道 Info.plist 中是否缺少任何键,因为单独的错误消息将打印到这些纬度/经度错误消息上方或下方的控制台,并会告诉您缺少哪个键。所以基本上:
- 请确保在用于测试应用程序的设备/模拟器上接受所有必要的位置权限。
- 获得位置权限后,如果使用模拟器,请设置位置。
不确定这是否会有所帮助,但我希望它能有所帮助。如果您已经确认这些不是问题,我不确定是什么原因导致了您的问题,但是单步执行负责获取用户位置的代码部分可能有助于查看过程中的哪个链接失败。
显然,如果在传递第一个位置之前读取了 a 的属性,则会记录此错误消息。location
CLLocationManager
CLLocationManager
我的解决方案如下:
无论如何,我都使用它的子类,允许我以编程方式设置测试的属性。
具体操作如下: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
// …
}
而吸气剂现在是
get {
guard anyLocationDelivered else { return nil }
let usedLocation = _location ?? super.location
return usedLocation
}
现在,不再记录此错误消息。
- 问题可能是你在模拟器上运行了应用程序,除非你在调试、模拟位置中手动更改模拟位置,否则模拟器默认不使用当前位置。
- 若要解决此问题,请模拟当前位置(如上所述)或在物理签名设备上运行应用程序,完全关闭应用程序,然后重新启动应用程序。
OS_ACTIVITY_MODE = 禁用
要删除警告,请执行以下操作:
步骤
导航到“产品”-“>方案”-“>”编辑方案”。 打开“参数”选项卡 环境变量部分添加OS_ACTIVITY_MODE = 禁用
评论