IOSは、ネイティブ、ユーザーの場所へのアクセスを実現CLLocationManagerの位置決めを達成するために

要件:オープン市APP取得

CLLocationManagerシステムは、次の手順を使用することによって達成されます。

Info.plistのプロジェクトに以下のように1、2つのフィールドを追加します。

次のように初期化AppDelegate CLLocationManager 2.、オブジェクト:

#importを " AppDelegate.h " 
の#import <CoreLocation / CoreLocation.h>
 の#import  " MainViewController.h " 

@interface AppDelegate()<CLLocationManagerDelegate> 

@property(非アトミック、強い)CLLocationManager * locationManager。

@end 

@implementation AppDelegate

 - (BOOL)アプリケーション:(のUIApplication *)アプリケーションdidFinishLaunchingWithOptions:(NSDictionaryの* )launchOptions {
     // アプリケーション起動後のカスタマイズのためのオーバーライドポイント。
    
    // 判断是否有定位权限
    場合([CLLocationManager locationServicesEnabled]){
         // 开启定位
        【self.locationManager startUpdatingLocation]; 
    } そうでなければ{ 
        のNSLog(@ " システムが配置されているがまだ開いていない、[セットしてください-プライバシー-マニュアル開における位置情報サービス" ); 
    } 
    
    戻りYES; 
    
} 

の#pragmaマーク-標的
- (CLLocationManagerを* )locationManager {
     IF!(_locationManager){
         // 作成CoreLocationは、管理オブジェクト 
        CLLocationManager * locationManager = [[CLLocationManagerアロケーション]のinit];
         // 権限チェックを見つけ
        [locationManager requestWhenInUseAuthorizationは];
         // 位置決め精度を設定します
        [locationManager setDesiredAccuracy:kCLLocationAccuracyBest]。
        // 设置代理 
        locationManager。デリゲート = 自己; 
        
        _locationManager = locationManager。
    } 
    戻り_locationManagerと、
    
}

3.適切なエージェントCLLocationManager、次のコードを達成する方法

#pragmaマーク-プロキシアプローチ、検査のための標的許可
- (無効)locationManager:(CLLocationManager * )マネージャーdidChangeAuthorizationStatus:(CLAuthorizationStatus){ステータス
     切替(ステータス){
         ケースkCLAuthorizationStatusNotDetermined:{ 
            のNSLog(@ " ユーザーはまだ認可することを決定していません" );
             / / アクティブ許可
            [self.locationManager requestWhenInUseAuthorization];
             BREAK ; 
        } 
        ケースkCLAuthorizationStatusRestricted:
        { 
            のNSLog(@ " 制限されたアクセス" );
             // アクティブ認可
            【self.locationManager requestWhenInUseAuthorization];
             BREAK ; 
        } 
        ケースkCLAuthorizationStatusDeniedは:{
             // 権限適用することはできませんアクティブターゲットを用いた方法を取得する。この時点で、
             // クラスメソッドを、ロケーションサービスを開くかどうかを判定する
            IF ([CLLocationManager locationServicesEnabled]){ 
                のNSLog(@ " ロケーションオープンサービスが拒否される" ); 
            } { 
                のNSLog(@" 位置情報サービス、利用できないオフ" ); 
            } 
            BREAK ; 
        } 
        ケースkCLAuthorizationStatusAuthorizedAlways:{ 
            のNSLog(@ " の前と許可テーブルを取得した後" );
             BREAK ; 
        } 
        ケースkCLAuthorizationStatusAuthorizedWhenInUse:{ 
            のNSLog(@ " 受信権限を持つ" );
             BREAK ; 
        } 
        デフォルトBREAK ; 
    } 
} 
の#pragmaマーク-位置取得
- (無効)locationManager:(* CLLocationManager )マネージャ
   didUpdateLocations:(にNSArray * )場所{ 
    
    CLLocation * newLocation = [位置lastObject];
     // 決意プロセス空気
    IF(newLocation.horizo​​ntalAccuracy < 0 ){ 
        のNSLog(@ " 場所に障害が発生した、携帯電話ネットワークとポジショニングチェック" );
         リターン; 
    } 
    // ストップ配置
    【self.locationManager stopUpdatingLocation];
     // 座標取得
 //     CLLocationCoordinate2D coor2D = newLocationを.coordinate;
 //     のNSLog(@ "緯度:%のF、経度:%のF"、coor2D.latitude、coor2D.longitude); 
    
    //は、都市、符号化オブジェクトを作成し得る 
    CLGeocoderをジオコーダ* = [[CLGeocoder ALLOC] INIT ];
     // 逆ジオコーディング
    [ジオコーダreverseGeocodeLocation:newLocation CompletionHandler:^(目印のにNSArray <CLPlacemark *> * _Nullable、NSError *、として_Nullableエラー){
         IF(誤差=ゼロ|| placemarks.count ==!0 ){
             リターン; 
        } 
        // 取得目印 
        CLPlacemark *目印= [目印の、firstObjectなど];
 //         のNSLog(@ "%@取得ランドマーク=、"、placeMark.locality); 
    }]; 
   
} 
の#pragmaマーク-場所の失敗
- (無効)locationManager:(* CLLocationManager)マネージャーdidFailWithError:(NSError * )エラー{
 //      のNSLog(@ "場所に障害が発生した、携帯電話ネットワークとポジショニングをチェック"); 
}

 

 

おすすめ

転載: www.cnblogs.com/zk1947/p/11806337.html