1. 程式人生 > >ios9定位服務的app進入後臺三分鐘收不到經緯度,應用被掛起問題及解決方式

ios9定位服務的app進入後臺三分鐘收不到經緯度,應用被掛起問題及解決方式

sso 進入 ont use -c 大於 null 方案 cti

原來定位服務是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,在後臺不被殺死。

ios9定位服務的app進入後臺三分鐘收不到經緯度,應用被掛起問題及解決方式