前言
公司一款A(yù)pp使用到了地圖定位,可是從AppStore下載下來(lái)后农尖,第一次安裝完后出現(xiàn)了黑屏的現(xiàn)象。
控制臺(tái)打印的信息為:
分析造成此現(xiàn)象的原因
由于是點(diǎn)擊了允許定位當(dāng)前用戶(hù)的地位位置后出現(xiàn)的現(xiàn)象入宦,而且第二次啟動(dòng)應(yīng)用時(shí)是沒(méi)有出現(xiàn)這樣的現(xiàn)象的情況蛙埂,所以考慮是由于系統(tǒng)定位權(quán)限造成的帅腌。
由于注釋掉地圖展示當(dāng)前用戶(hù)位置的代理方法,就不會(huì)出現(xiàn)這樣的現(xiàn)象麻汰,所以考慮是由于未獲得系統(tǒng)定位權(quán)限速客,地圖就進(jìn)行定位而造成的系統(tǒng)級(jí)別Bug。
解決方案
在系統(tǒng)的AppDegate 類(lèi)中申請(qǐng)系統(tǒng)的定位五鲫,使地圖在定位之前獲取到系統(tǒng)的定位權(quán)限溺职,即可解決這個(gè)系統(tǒng)級(jí)別的Bug
代碼
[CLLocationManager locationServicesEnabled]
//檢測(cè)的是整個(gè)iOS系統(tǒng)的位置服務(wù)開(kāi)關(guān),
//無(wú)法檢測(cè)當(dāng)前應(yīng)用是否被關(guān)閉位喂,只能通過(guò)CLLocationManagerDelegate的locationManager:didFailWithError:方法去檢測(cè):
在代理方法中查看權(quán)限是否改變
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusAuthorizedAlways: NSLog(@"Always Authorized"); break;
case kCLAuthorizationStatusAuthorizedWhenInUse: NSLog(@"AuthorizedWhenInUse"); break;
case kCLAuthorizationStatusDenied: NSLog(@"Denied"); break;
case kCLAuthorizationStatusNotDetermined: NSLog(@"not Determined"); break;
case kCLAuthorizationStatusRestricted: NSLog(@"Restricted"); break; default: break;
}}
/**
第一次執(zhí)行以下語(yǔ)句時(shí)會(huì)有系統(tǒng)定位權(quán)限彈框彈出
*/
CLLocationManager *manager = [[CLLocationManager alloc] init];
[manager requestAlwaysAuthorization];//一直獲取定位信息
[manager requestWhenInUseAuthorization];//使用的時(shí)候獲取定位信息
權(quán)限彈框一閃而過(guò)的問(wèn)是CLLocationManager的實(shí)例是局部變量在方法中被釋放了浪耘,所以把它改為全局變量或靜態(tài)變量就可以了。