原来定位服务是10分钟收不到定位信息就挂起定位,现在变为最短3分钟,估计都是为了省电吧。只要你开启应用的后台定位,并且10分钟有一次定位,那么苹果就不会关闭你的线程,现在变成3分钟。若你的应用开启了后台定位,当最短3分钟(经过测试也可能大于3分钟小于等于10分钟)不定位,ios系统也会把你的应用挂起。而高德地图ios sdk的ios9以上版本后台定位开启方法变更,而高德导航库没有同步变更,导致使用老的地图库和高德导航地图库的用户定位服务不能实际开启,切换到后台3分钟(经过测试也可能大于3分钟小于等于10分钟)没有实际定位请求,被ios系统认为是伪定位服务的应用并挂起线程。而高德定位模块也有问题,有时间也有不定位的情况。如:手机开启后台定位的应用,网络连接wifi(aibinjian)切换到后台,当用户移动到wifi覆盖区外,那么应用收到网络异常通知,手机的网络自动切换到4g手机网络,应用没有收到网络正常通知,导致应用在8分钟后不定位,并且应用被系统干掉。当手机没有网络时高德也不定位,而原生态的定位在有网和无网络的情况下都能定位,所以还是用原生态的定位更靠谱。
高德地图iOS SDK V2.5.0版本提供后台持续定位的能力,即便你的app退到后台,且位置不变动时,也不会被系统挂起,可持久记录位置信息。该功能适用于记录轨迹录或者出行类App司机端。
只需要您的做以下几步操作:
1.添加代码。
对于iOS9之前的系统:
1
_mapView.pausesLocationUpdatesAutomatically = NO;
对于iOS9(含)以上系统:
1
_mapView.allowsBackgroundLocationUpdates = YES;
若你的应用有3D地图和导航地图,那么你的应用用的应该是导航地图,若想用定位由于导航地图没有更新,估计你的应用没有allowsBackgroundLocationUpdates 这个属性,只能让你发愁了。
高德导航地图库千呼万换始终不出来,需要后台定位服务的应用不可能等待这个大爷吧!只能用替代方案了。开启原生态的定位服务,只是不用原生态的位置,能够保证高德地图一致获取到经纬度,仍旧用高德的经纬。原生态的位置服务只是触发高德地图收到经纬度和保持后台定位。
@interface mainViewController()<NoticeCarViewDelegate,UIAlertViewDelegate,ServicingViewDelegate,MAMapViewDelegate,AMapSearchDelegate,UIActionSheetDelegate,PlaceSearchDeleagte,CLLocationManagerDelegate> { CLLocationManager *_locationManager; } - (void)initAMapProperty { FLDDLogDebug(@"函数"); _locationManager = [[CLLocationManager alloc] init]; _locationManager.delegate = self; _locationManager.pausesLocationUpdatesAutomatically = NO; if (IOS_VERSION_LARGE_OR_EQUAL(9.0)) { _locationManager.allowsBackgroundLocationUpdates = YES; } if (![CLLocationManager locationServicesEnabled]) { NSLog(@"定位服务当前可能尚未打开,请设置打开!"); return; } //如果没有授权则请求用户授权 if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) { [_locationManager requestAlwaysAuthorization]; } else if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways) { //设置代理 // _locationManager.delegate = self; //设置定位精度 _locationManager.desiredAccuracy = kCLLocationAccuracyBest; //定位频率,每隔多少米定位一次 CLLocationDistance distance = 10.0;//十米定位一次 _locationManager.distanceFilter = distance; //启动跟踪定位 [_locationManager startUpdatingLocation]; FLDDLogDebug(@"开启定位"); } // //定位 // _mapView.showsUserLocation = YES; //地图跟着位置和方向移动 [_mapView setUserTrackingMode:MAUserTrackingModeFollow animated:YES]; _mapView.showsCompass = NO; //楼块隐藏 _mapView.buildingsDisabled=YES; // //后台定位 可持久记录位置信息。高德地图iOS SDK V2.5.0版本提供后台持续定位的能力,即便你的app退到后台,且位置不变动时,也不会被系统挂起,可持久记录位置信息。该功能适用于记轨迹录或者出行类App司机端。 // if (IOS_VERSION_LARGE_OR_EQUAL(9)) { // _mapView.allowsBackgroundLocationUpdates = YES; // } // else { //由于IOS9中定位的授权机制改变 需要进行手动授权 _mapView.pausesLocationUpdatesAutomatically = NO; } //不能旋转 _mapView.rotateEnabled=NO; _mapView.distanceFilter = DISTANCE_FILTER; // _mapView.desiredAccuracy = kCLLocationAccuracyHundredMeters; // mapView.showsScale = YES; // [mapView setZoomLevel:KmaxLEVEL animated:NO]; //自定义精度圈样式 去除精度圈 _mapView.delegate = self; //纪录经纬度的数组 // coordates = [[NSMutableArray alloc] init]; } #pragma mark 定位回调 能获取到定位点的经纬度坐标 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations { [locations enumerateObjectsUsingBlock:^(CLLocation * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { FLDDLogDebug(@"obj.coordinate = %.f \n %.f",obj.coordinate.latitude,obj.coordinate.longitude); }]; FLDDLogDebug(@""); }
现在高德地图终于发布了新的支持ios9系统后台定位的导航地图包,并且发布了高德地图定位模块,支持一次定位的功能,能够一次定位到你的位置信息和cityCode。若你的应用是需要始终需要允许定位,那么使用ios原生定位和高德地图的定位功能吧!防止再出现高德地图不能正确启动应用的定位功能。
ios9.1以后,为了省电,应用切换到后台8分钟,不管是否是开启了后台定位服务,只要没有网络活动(定位活动也可以)都有可能被挂起。所以你的应用切换到后台要保证8分钟之内有一次网络活动(如心跳等)。若用户打开应用去打电话,不知道网络没有了,等打10多分钟的电话,再去看应用,结果应用早挂了,这个问题很坑爹,暂时没有找到原因。不知道是高德定位搞的鬼还是最新的iphone系统的问题。估计是高德地图问题多些!
现在通过启动手机原生定位功能和高德的后台定位功能,保证我们的始终定位的app,在后台不被杀死。