CLLocationManager的startUpdatingLocation不工作

如何知道iphone的物理位置,这一问题在LBS的应用中很常见。解决起来其实也很简单,就两步。第一步,通过CoreLocation获取经度纬度;第二步,通过google网络服务或者其他架构及获取经纬度以得到物理地址。

获取经度纬度的操作过程

首先,
添加CoreLocation.Frameworks,并将其头文件放在需要引用的类的头文件中,且在头文件中声明一个CLLocationManager类的属性对象。在头文件中@interface后加上<CLLocationManagerDelegate>;

其次,
在头文件中声明属性locationManager;
@property (nonatomic, weak) CLLocationManager *locationManager;
因为XCODE使用的是4.5版本,所以在implement文件中可以不加@synchronized locationManager;

最后,在实现文件中实现CLLocationManagerDelegate的必须实现的方法和CLLocationManager调用。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.locationManager.delegate=self;
    self.locationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters;
    [self.locationManager startUpdatingLocation];
}

委托CLLocationManagerDelegate中两个方法需要实现。
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
    DebugLog(@"%f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    DebugLog(@"%@",error);
}

但是,在调试过程中,发现委托的方法并没有执行。在属性locationManager经过编译器设置的_locationManager已经在viewDidLoad执行结束后就释放了,所以,委托方法是不可能执行的。
两个解决方法,其一,调整属性设置,@property (nonatomic, strong) CLLocationManager *locationManager;其二,不要属性设置,自己在interface()中定义实例变量,再自己初始化。
因为默认对象的引用指针保留方式都是strong。

获取物理位置的操作过程
我们已经获取了经纬度,要知道物理位置,到经纬度与物理位置对应的数据库中去找即可。

方法很多中,通过google可以,http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=true。但是google不幸被墙了,只能通过其他方式,有人说高德可以,也有人说第三方框架也可以。


On iOS 5 MKReverseGeoCoder is Deprecated!

So you want to use CLGeocoder with CLLocationManager, very simple and works with block.

Example:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
   [self.locationManager stopUpdatingLocation];

   CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
   [geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
       for (CLPlacemark * placemark in placemarks) {
           .... = [placemark locality];
        }    
    }];
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值