IOS之定位淺談

由于項(xiàng)目的需要巍举,用到定位的功能脆荷,折騰了一下午,總算有個(gè)大概得了解了懊悯。

這里主要是用了CLLocationManager進(jìn)行定位蜓谋。使用分為以下幾個(gè)步驟:

1.導(dǎo)入相關(guān)的庫(kù)CoreLocation.frameWork

2.勾選開(kāi)啟后臺(tái)定位選項(xiàng)

3.此時(shí)在plist文件可以看到多了

4.在plist添加兩個(gè)參數(shù),允許應(yīng)用在使用期間定位炭分、或者在后臺(tái)也能繼續(xù)定位桃焕。


5.到這里為止,所有的界面配置完成捧毛。然后在AppDelegate.h類中導(dǎo)入頭文件

```

#import<CoreLocation/CoreLocation.h>

```

若是報(bào)錯(cuò)观堂,則證明在第一步中沒(méi)有導(dǎo)入相關(guān)的 CoreLocation.frameWork 庫(kù)。

在AppDelegate.m文件中有代理方法

```

@interface AppDelegate ()<CLLocationManagerDelegate>

```

然后在APPDelegate.h中聲明設(shè)置這些變量呀忧。

```

@property (strong,nonatomic)CLLocationManager * locationManager; // 創(chuàng)建工程的全部變量

@property (nonatomic,assign)BOOL executingInBackground;

@property (strong,nonatomic)NSTimer * timer; // 計(jì)時(shí)器

```

一般來(lái)說(shuō)师痕,locationManager定位只要一開(kāi)始,如果不[self.locationManager stopUpdatingLocation]而账,則會(huì)根據(jù)所在的位置是否超出多少米胰坟,不定時(shí)的更新定位。如果想要每隔一段時(shí)間進(jìn)行定位福扬。則需要開(kāi)啟一個(gè)計(jì)時(shí)器(timer)腕铸,然后每定位一次,立刻關(guān)掉定位铛碑。待計(jì)時(shí)器計(jì)算時(shí)間狠裹,再次觸發(fā)定位。在didFinishLaunchingWithOptions方法中:

```

self.locationManager = [[CLLocationManager alloc]init];

self.locationManager.delegate = self;

//? ? self.locationManager.distanceFilter = 1.0; // 位置超過(guò)1米汽烦,就再次重新定位

self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; // 定位精度最為準(zhǔn)確涛菠,越準(zhǔn)確,耗電量越大

//? ? [self.locationManager startUpdatingLocation];

self.locationManager.pausesLocationUpdatesAutomatically=NO;

if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])

{

if(kIOSVersions>=8.0)

{

[self.locationManager requestAlwaysAuthorization];

[self.locationManager requestWhenInUseAuthorization];//使用程序其間允許訪問(wèn)位置數(shù)據(jù)(iOS8定位需要)

}

if(kIOSVersions>=9.0)

{

[self.locationManager setAllowsBackgroundLocationUpdates:YES];

}

}


NSError *setCategoryErr = nil;

NSError *activationErr? = nil;

[[AVAudioSession sharedInstance]

setCategory: AVAudioSessionCategoryPlayback

error: &setCategoryErr];

[[AVAudioSession sharedInstance]

setActive: YES

error: &activationErr];

NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

[userDefault setValue:@"0" forKey:isShowTestEnvironment];

[userDefault setBool:NO forKey:USERDEFAULTS_IS_SAVE_ENVIRONMENT];

[userDefault synchronize];

```

以上代碼之所以沒(méi)有立刻開(kāi)啟定位,是想讓計(jì)時(shí)器觸發(fā)開(kāi)始定位俗冻。

6.應(yīng)用程序掉到后臺(tái)時(shí)候礁叔,執(zhí)行的方法:applicationDidEnterBackground

要想在后臺(tái)計(jì)時(shí)器能繼續(xù)計(jì)時(shí),則需要在此方法中添加

```

UIApplication*? app = [UIApplication sharedApplication];

__block? ? UIBackgroundTaskIdentifier bgTask;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{

dispatch_async(dispatch_get_main_queue(), ^{

if (bgTask != UIBackgroundTaskInvalid)

{

bgTask = UIBackgroundTaskInvalid;

}

});

}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

dispatch_async(dispatch_get_main_queue(), ^{

if (bgTask != UIBackgroundTaskInvalid)

{

bgTask = UIBackgroundTaskInvalid;

}

});

});

```

7.應(yīng)用在前臺(tái)是調(diào)用的方法:applicationWillEnterForeground

//當(dāng)應(yīng)用程序回到前臺(tái)時(shí)迄薄,執(zhí)行該方法

```

-(void)applicationWillEnterForeground:(UIApplication*)application

{

//程序進(jìn)入前臺(tái)琅关,轉(zhuǎn)化為高精確定位

self.executingInBackground = NO;

[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

}

```

8.定位成功時(shí)候的回調(diào)方法:didUpdateToLocation

```

#pragma mark 定位成功回調(diào)

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

{

if (self.executingInBackground)

{ // 在后臺(tái)

if(kIOSVersions>=8.0)

{

[self.locationManager requestAlwaysAuthorization];

[self.locationManager requestWhenInUseAuthorization];//使用程序其間允許訪問(wèn)位置數(shù)據(jù)(iOS8定位需要)

}

if(kIOSVersions>=9.0)

{

[self.locationManager setAllowsBackgroundLocationUpdates:YES];

}

NSLogS(@"后臺(tái)臺(tái)");

}else{

// 在前臺(tái)

NSLogS(@"前臺(tái)");

}

NSLog(@"經(jīng)度:%f", newLocation.coordinate.longitude+0.001253);

NSLog(@"緯度:%f", newLocation.coordinate.latitude-0.000182);

NSLog(@"速度:%f 米/秒", newLocation.speed);

CLGeocoder * geocoder = [[CLGeocoder alloc] init];

[geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {

NSDictionary *locationInfo = [[NSDictionary alloc]init];

for (CLPlacemark * placemark in placemarks) {

locationInfo = [placemark addressDictionary];

}

NSLog(@"%@",locationInfo);

}];

```

[self.locationManager stopUpdatingLocation]; // 這里每定位一次,就關(guān)掉定位讥蔽,等待計(jì)時(shí)器再次觸發(fā)涣易。如果不關(guān)掉定位,則:

?? self.locationManager.distanceFilter = 1.0; // 兩者位置超過(guò)1米冶伞,就再次重新定位

根據(jù)這句話判斷是否重新定位新症。(需不需要關(guān)掉,看需求)

}

9.定位失敗的時(shí)候的回調(diào)方法

```

#pragma mark 定位失敗回調(diào)

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

{

NSLog(@"error%@", error);

}

```

ps:這里我觸發(fā)定位的開(kāi)始是在MainMenuController類中做的响禽。(也就是一旦用戶登錄成功就開(kāi)始定位)

在MainMenuController類中:

調(diào)用計(jì)時(shí)器的圖片

說(shuō)得比較粗糙徒爹,望各位多多指點(diǎn),謝謝~

ps:在ios8系統(tǒng)中芋类,不知怎么的隆嗅,我退到后臺(tái)定位后,利用計(jì)時(shí)器調(diào)用觸發(fā)事件梗肝,只執(zhí)行了兩次就沒(méi)法點(diǎn)位了榛瓮,后來(lái)檢查了好久,發(fā)現(xiàn)計(jì)時(shí)器在后臺(tái)還一直計(jì)時(shí)巫击,被困擾了好久禀晓。最后,刪了app坝锰,重新再安裝粹懒,就可以了。真暈顷级,不知道是不是緩存的問(wèn)題凫乖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弓颈,隨后出現(xiàn)的幾起案子帽芽,更是在濱河造成了極大的恐慌,老刑警劉巖翔冀,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件导街,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡纤子,警方通過(guò)查閱死者的電腦和手機(jī)搬瑰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)款票,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人泽论,你說(shuō)我怎么就攤上這事艾少。” “怎么了翼悴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵缚够,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我抄瓦,道長(zhǎng)潮瓶,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任钙姊,我火速辦了婚禮,結(jié)果婚禮上埂伦,老公的妹妹穿的比我還像新娘煞额。我一直安慰自己,他們只是感情好沾谜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布膊毁。 她就那樣靜靜地躺著,像睡著了一般基跑。 火紅的嫁衣襯著肌膚如雪澜薄。 梳的紋絲不亂的頭發(fā)上谆甜,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼重斑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毙籽,可吹牛的內(nèi)容都是我干的役首。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼掺逼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吃媒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吕喘,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赘那,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后氯质,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體募舟,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年病梢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胃珍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梁肿。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖觅彰,靈堂內(nèi)的尸體忽然破棺而出吩蔑,到底是詐尸還是另有隱情,我是刑警寧澤填抬,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布烛芬,位于F島的核電站,受9級(jí)特大地震影響飒责,放射性物質(zhì)發(fā)生泄漏赘娄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一宏蛉、第九天 我趴在偏房一處隱蔽的房頂上張望遣臼。 院中可真熱鬧,春花似錦拾并、人聲如沸揍堰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屏歹。三九已至,卻和暖如春之碗,著一層夾襖步出監(jiān)牢的瞬間蝙眶,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工褪那, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幽纷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓武通,卻偏偏與公主長(zhǎng)得像霹崎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冶忱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容