1、定位设置
2、定位页面逻辑
1、定位设置
2、定位页面逻辑
1)、第一次进入该VC,在 viewDidLoad 调用刷新页面 refreshLocationView 。这时用户还没决定,会刷出“正常”的view
- (void)refreshLocationView{ // 定位服务正常 && 定位被用户拒绝 if([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied ) { // "提示用户开启定位"view if (self.用户拒绝view == nil) { [self.view addSubview:self.deniedView]; } }else{ // "用户的正常定位"View if (self.用户拒绝view) { [self.用户拒绝view removeFromSuperview]; } // 开始定位( 高德 的 startUpdatingLocation ) [self 是否创建管理者,并开始定位]; // 按需显示hud [self showHud] } }
思路:1、需要判断 “用户拒绝view”的存在,减少创建、删除等重复操作。
2、 “用户拒绝view”需要覆盖在“正常显示view”的上面(最后被addSubview)
2)、弹出定位警告窗给用户选
2-1)、如果用户选允许,那么没问题。
2-2)、如果用户选不允许,再回调里,再刷新上面的方法,从而刷出“用户拒绝View”,并添加到最上面
注意:如当前“正常view”显示Hud,在等待用户同意。然后用户拒绝,这个时候,需要隐藏Hud,并刷出“用户拒绝View”。
而,隐藏hud,不能写在回调外面,因为刚切换过来,定位状态会更新,所以需要在当前状态是拒绝里,隐藏Hud。
//amap 是 高德 的方法 //- (void)amapLocationManager:(AMapLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { if (status == kCLAuthorizationStatusDenied) { // 如有Hud,可隐藏Hud [self hideHud]; [self refreshLocationView]; } }
3)、“用户拒绝View”设置按钮,跳转到隐私设置。
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil]; }
4)、从隐私设置里跳转回来,不会调用 viewWillAppear: 系列方法,所以需要加通知,再刷新view
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(refreshLocationView) name:UIApplicationWillEnterForegroundNotification object:nil];
5)、最后dealloc移除通知
- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; }
6)、可选,隐藏Hud。
6-1)、如果只要经纬度,得到经纬度回调里,隐藏Hud。
// 高德 的 定位成功回调 - (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode { // 停止定位(高德 的 stopUpdatingLocation) // 看需请求搜索附近建筑 (高德 的 AMapPOIAroundSearch: ) }
6-2)、如要附近建筑,在得到经纬度的回调里,再请求附近数据 AMapPOIAroundSearchRequest 。
请求成功后,得到附近建筑回调,再隐藏Hud
// 高德 的 搜索成功回调 - (void)onPOISearchDone:(AMapPOISearchBaseRequest *)request response:(AMapPOISearchResponse *)response { [self hideHud]; }