iOS開發 獲取當前位置信息

首先要在plist文件里添加兩個鍵值對,向用戶請求位置服務時會顯示在這里設置的值的內容。

NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
屏幕快照 2016-07-06 15.54.05.png

導入頭文件

#import <CoreLocation/CoreLocation.h>

把CLLocationManager設置為屬性。
這里有一個坑點,如果不設置為屬性,軟件開啟時提示定位的提示出現一瞬間就消失了。
被這個坑了一會兒,最后才發現是因為沒有設置成屬性的緣故。

@interface HomeViewController ()<CLLocationManagerDelegate>
@property (nonatomic, strong) CLLocationManager *locationManager;
@end

@implementation HomeViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self startLocation];
    // Do any additional setup after loading the view.
}

//開始定位
- (void)startLocation {
    if ([CLLocationManager locationServicesEnabled]) {
        //        CLog(@"--------開始定位");
        self.locationManager = [[CLLocationManager alloc]init];
        self.locationManager.delegate = self;
        //控制定位精度,越高耗電量越
        self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
        // 總是授權
        [self.locationManager requestAlwaysAuthorization];
        self.locationManager.distanceFilter = 10.0f;
        [self.locationManager requestAlwaysAuthorization];
        [self.locationManager startUpdatingLocation];
    }
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    if ([error code] == kCLErrorDenied) {
        CLog(@"訪問被拒絕");
    }
    if ([error code] == kCLErrorLocationUnknown) {
        CLog(@"無法獲取位置信息");
    }
}
//定位代理經緯度回調
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    CLLocation *newLocation = locations[0];

    // 獲取當前所在的城市名
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    //根據經緯度反向地理編譯出地址信息
    [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *array, NSError *error){
        if (array.count > 0){
            CLPlacemark *placemark = [array objectAtIndex:0];
            
            //獲取城市
            NSString *city = placemark.locality;
            if (!city) {
                //四大直轄市的城市信息無法通過locality獲得,只能通過獲取省份的方法來獲得(如果city為空,則可知為直轄市)
                city = placemark.administrativeArea;
            }
            NSLog(@"city = %@", city);
            
            [self httpGetWeather:city];
        }
        else if (error == nil && [array count] == 0)
        {
            NSLog(@"No results were returned.");
        }
        else if (error != nil)
        {
            NSLog(@"An error occurred = %@", error);
        }
    }];
    //系統會一直更新數據,直到選擇停止更新,因為我們只需要獲得一次經緯度即可,所以獲取之后就停止更新
    [manager stopUpdatingLocation];
    
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,914評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,242評論 25 708
  • James9958閱讀 224評論 0 0
  • 皆言宮門繁不盡, 紛踏探首往里尋。 一朝得以遂己愿, 正是獨自深怨時。 不料宮門深似海, 波譎...
    后為卿閱讀 531評論 6 2
  • 今天是大喜的日子,祝愿我舸子妹妹和陳燁妹夫新婚快樂,永結同心,甜甜蜜蜜永永遠遠!4月2日就回來了,姐姐等著你們。 ...
    清晨劉丹閱讀 149評論 2 4