CLLocationManager startMonitoringForRegion 在 ios 8.4 上崩溃

Posted

技术标签:

【中文标题】CLLocationManager startMonitoringForRegion 在 ios 8.4 上崩溃【英文标题】:CLLocationManager startMonitoringForRegion crashes on ios 8.4 【发布时间】:2016-02-15 08:41:42 【问题描述】:

我发现 startMonitoringForRegion 仅在 ios 8.4 上崩溃并给我这个错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: major)'
*** First throw call stack:
(0x2af4a49f 0x38744c8b 0x2ae67c63 0x3c3bbd 0x380d6b 0x17fcd8 0x19f170 0xebe9db 0xebe9c7 0xec23ed 0x2af103b1 0x2af0eab1 0x2ae5c3c1 0x2ae5c1d3 0x3225a0a9 0x2e46a7b1 0x2ad734 0x38cc4aaf)
libc++abi.dylib: terminating with uncaught exception of type NSException

认为CLBeaconRegion 主要值可以为零。所以我不知道发生了什么。

代码如下:

if let context = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext
    var dataFetch = DataFetcher()
    dataFetch.fetchBeacons(context, completion:  (success) -> Void in
        dispatch_async(dispatch_get_main_queue()) 
            var beacons = Beacon.getAllBeacons(context)
            if let uuid = beacons.first?.uuid 
                var region = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: uuid), identifier: "iBeacon")
                region.notifyOnEntry = true
                region.notifyOnExit = true
                if self.isBluetoothOn 
                    self.manager.startMonitoringForRegion(region)
                
            
        
    )

【问题讨论】:

您是否 100% 确定是 self.manager.startMonitoringForRegion(region) 代码行导致了所示异常?我怀疑它可能是别的东西。尝试在该行上设置断点并越过它以验证确实是导致它的原因。 尝试设置异常断点:developer.apple.com/library/ios/recipes/… 【参考方案1】:

错误是

setObjectForKey:对象不能为nil(key:major)

这更有可能是 NSDictionary 错误。正如它所说,您将对象设置为 nil。在您的major 中检查一次关键对象是否为零或不在您的viewcontroller 中的任何位置

【讨论】:

主要值是可选的。它在这里为零,但在其他 ios 版本中它不会崩溃。 可能是iOS已修复,这是iOS 9之后的问题,原因是您的旧xcode中不起作用,检查一次,如果它是nil,很容易访问【参考方案2】:

这更有可能是 NSDictionary 错误。正如它所说,您将对象设置为 nil。

您可以通过添加“异常”断点来找到它的实际原因。它将自动停止您的应用程序并指向您收到此错误的代码位置。为了获得更多帮助,我附上了展示如何添加异常断点的图片。

1)转到项目导航器的断点部分。

2)然后点击左下角的'+'图标并选择添加异常断点。

3)添加断点后,重新运行你的代码,你会发现问题出在哪里。

希望这会有所帮助。

【讨论】:

【参考方案3】:

经过多天的搜索,我发现我有一个第三方框架搞砸了这个。该框架是 taplytics 的 sdk,一个推送通知服务。

谢谢大家的帮助。

【讨论】:

以上是关于CLLocationManager startMonitoringForRegion 在 ios 8.4 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为啥'CLLocationManager.locationServicesEnabled()'默认为真?

Xcode 6 GM - CLLocationManager

CLLocationManager 和 CLGeoCoder

CLLocationManager:没有调用 didChangeAuthorization 和 didRangeBeacons

CLLocationManager 最后一个已知位置

CLLocationManager 从不调用委托方法[重复]