在iPhone上的GoogleMaps上获取我的位置时崩溃

我写信给你是因为我遇到了一个非常奇怪的错误。 我试图在我的应用程序上添加GMS,最后,当我必须获取设备位置时,我遇到了这个崩溃:

由于未捕获的exception’NSInternalInconsistencyException’而终止应用程序,原因:’类GMSMapView的实例0x7ff7fd82def0已取消分配,而键值观察者仍在其中注册。 当前观察信息:(上下文:0x0,属性:0x7ff7fdc2f470>

代码在这里初始化:

self.mapView.myLocationEnabled = YES; self.mapView.mapType = kGMSTypeNormal; self.mapView.settings.compassButton = YES; self.mapView.settings.myLocationButton = YES; //=> Listen to the myLocation property of GMSMapView. [self.mapView addObserver:self forKeyPath:@"myLocation" options:NSKeyValueObservingOptionNew context:NULL]; - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"myLocation"] && [object isKindOfClass:[GMSMapView class]]) { appDelegate().curUserLocation = [change objectForKey:NSKeyValueChangeNewKey]; [self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithLatitude:self.mapView.myLocation.coordinate.latitude longitude:self.mapView.myLocation.coordinate.longitude zoom:15]]; } } 

但仍然没有成功。 我把断点放在observerValueForKey方法中,一旦从这里出来,就会出现崩溃。 无法得到这个想法。

我也删除了观察者:

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.mapView removeObserver:self forKeyPath:@"myLocation"]; //=> Set map delegate to nil (to avoid: mapView:regionDidChangeAnimated:]: message sent to deallocated instance ) self.mapView.delegate = nil; self.mapView = nil; } 

并没有成功。

谁能帮我这个 ? 我尝试了所有可能的解决方案,但没办法。

提前致谢!

已经在评论中说过了…… GMSMapView必须Strong如果你没有调用requestWhenInUseAuthorization你的代码在iOS 8中requestWhenInUseAuthorization

我建议你只使用CLLocationManager代替KVO …但是你的决定。

附上我的例子 – 我用2个例子修改了Google示例…

  1. 与KVO
  2. 仅限CLLocationManager

如果您有任何问题……请告诉我

PS别忘了添加API密钥

快乐的编码!

UPDATE

如果你startUpdatingLocation ..不要忘记用stopUpdatingLocation停止它..让我们说在ViewDidDisapear

如果在viewWillAppear :中注册,请使用viewWillDisappear删除观察者。

如果在viewDidLoad中注册,请使用deinit取消注册观察者。 始终使用计数器部件进行注册和取消注册,这应该没问题

斯威夫特3

 deinit { mapView.removeObserver(self, forKeyPath: "myLocation") }