zoukankan      html  css  js  c++  java
  • iOS:位置相关(18-03-09更)

    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];
    }
    

      

      

  • 相关阅读:
    小技巧
    sql日期函数
    c#发送邮件
    js点滴
    Js序列化时间
    js中string的操作
    原系统中有AD FS , CRM Server ,迁移ADFS 到另一台电脑 , CRM Server用443端口出错
    解决UR 12后ISV目录不能用的问题
    Lucene .Net 版本
    Android 开源项目
  • 原文地址:https://www.cnblogs.com/leonlincq/p/8534412.html
Copyright © 2011-2022 走看看