首页 > 代码库 > iOS设备定位

iOS设备定位

一、iOS自带定位

1、SignInSignOutViewController.h

@interface SignInSignOutViewController : UIViewController<CLLocationManagerDelegate>{
    CLLocationManager *_locationManager;
    // 纬度
    float _latitude;
    // 经度
    float _longitude;
}
@property (nonatomic,retain) CLLocationManager *locationManager;
@property (nonatomic) float latitude;
@property (nonatomic) float longitude;

@end

2、SignInSignOutViewController.m

#import "SignInSignOutViewController.h"

@interface SignInSignOutViewController ()

@end

@implementation SignInSignOutViewController
@synthesize locationManager = _locationManager;
@synthesize latitude = _latitude;
@synthesize longitude = _longitude;

-(void)dealloc{
    
    self.locationManager = nil;
    [super dealloc];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.locationManager = nil;
}



- (void)viewDidLoad
{
    [super viewDidLoad];
    // 实例化一个位置管理器
    CLLocationManager *cllocationManager = [[CLLocationManager alloc] init];
    self.locationManager = cllocationManager;
    [cllocationManager release];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
    if(![CLLocationManager locationServicesEnabled]){
        [GlobalApplication Alert:@"提示":@"请开启定位:设置 > 隐私 > 位置 > 定位服务"];
    }else{
        if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorized) {
            [GlobalApplication Alert:@"提示":@"定位失败,请开启定位:设置 > 隐私 > 位置 > 定位服务 下 XX应用"];
        }
    }
 }



#pragma mark - CLLocationManagerDelegate
#pragma mark - CLLocationManagerDelegate
// 地理位置发生改变时触发
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    CLLocationCoordinate2D cc,cc2;
    // 获取经纬度
    cc.longitude = newLocation.coordinate.longitude;
    cc.latitude = newLocation.coordinate.latitude;
    // ios坐标(google)转换为 百度坐标
    cc2 = BMKCoorDictionaryDecode(BMKBaiduCoorForWgs84(cc));
    self.longitude = cc2.longitude;
    self.latitude = cc2.latitude;
    // 停止位置更新
    [manager stopUpdatingLocation];
}

// 定位失误时触发
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSString *errorString;
    [manager stopUpdatingLocation];
    switch([error code]) {
        case kCLErrorDenied:
            errorString = @"定位失败,请开启定位:设置 > 隐私 > 位置 > 定位服务 下 XX应用";
            //errorString = @"Access to Location Services denied by user";
            break;
        case kCLErrorLocationUnknown:
            errorString = @"定位失败,位置数据不可用";
            break;
        default:
            errorString = @"定位失败,未知错误";
            break;
    }

    [GlobalApplication Alert:@"定位":errorString];
}

二、百度地图定位(版本2.1)

1、MainMenuViewController.h

@interface MainMenuViewController : UIViewController<BMKUserLocationDelegate> {
    BMKUserLocation *_mapLocation;
    // 纬度
    float _latitude;
    // 经度
    float _longitude;
}

@property (nonatomic, retain) BMKUserLocation *mapLocation;
@property (nonatomic) float latitude;
@property (nonatomic) float longitude;
@end

2、MainMenuViewController.m

#import "MainMenuViewController.h"
@interface MainMenuViewController ()

@end

@implementation MainMenuViewController
@synthesize mapLocation = _mapLocation;
@synthesize latitude = _latitude;
@synthesize longitude = _longitude;
 
-(void)dealloc{
    self.mapLocation = nil;
    [super dealloc];
    
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.mapLocation = nil;
}



- (void)viewDidLoad
{
    [super viewDidLoad];
    BMKUserLocation *bmkLocation = [[BMKUserLocation alloc] init];
    bmkLocation.delegate = self;
    self.mapLocation = bmkLocation;
    [bmkLocation release];
    [self.mapLocation startUserLocationService];
}

#pragma mark - baidu map

/**
 *调用startUserLocationService定位成功后,会调用此函数
 *@param userLoc 我的位置坐标
 */
- (void)viewDidGetLocatingUser:(CLLocationCoordinate2D)userLoc{
    if (userLoc.longitude != 0 && userLoc.latitude != 0 ) {
        self.longitude = userLoc.longitude;
        self.latitude = userLoc.latitude;
        [self.mapLocation stopUserLocationService];
    }
}

三、结果
方法一:
iOS:xxx.151604,xx.170156(iOS采集的坐标)
baidu:xxx.162720,xx.174000 (百度转换的坐标)
方法二:
baidu:xxx.162716,xx.173980 (百度采集的坐标)