美文网首页
日志文档--网络鉴权顺序逻辑

日志文档--网络鉴权顺序逻辑

作者: 黑羽肃霜 | 来源:发表于2017-02-27 11:14 被阅读25次

    百度地图打开时的鉴权问题

    appdelegate中需要添加设定的授权。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        _mapManager = [[BMKMapManager alloc]init];
        // 如果要关注网络及授权验证事件,请设定     generalDelegate参数
        BOOL ret = [_mapManager start:BAIDU_KEY generalDelegate:self];
        if (!ret) {
            NSLog(@"manager start failed!");
        }
        // Add the navigation controller's view to the window and display.
    
        [self.window addSubview:navigationController.view];
        [self.window makeKeyAndVisible];
        return YES;
    }
    

    百度地图的sdk需要完成鉴权的操作。即为BOOL ret = [_mapManager start:BAIDU_KEY generalDelegate:self];,但是此时有一个代理需要完成鉴权的操作。如下:

    #pragma mark 百度地图代理
    -(void)onGetNetworkState:(int)iError {
        if (0 == iError)
            NSLog(@"联网成功");
        else
            NSLog(@"onGetNetworkState %d",iError);
    }
    -(void)onGetPermissionState:(int)iError {
        if (0 == iError)
            NSLog(@"授权成功");
        else
            NSLog(@"onGetPermissionState %d",iError);
    }
    
    • 完成鉴权的操作代理回调,是异步的。当我们启动的rootViewController时,需要添加其他的百度地图的操作,但是这些操作,有可能是在鉴权完成之前就发起的。

    这就造成了,我发起实际的命令操作时,鉴权还没有完成

    • 同时,上面代码中的两个代理本身也是异步的。只有当同时满足“联网成功”“授权成功”时,才通知对应的viewcontroller去开启代理和操作。解决的设想是用一个KVO操作,对一个数组进行监听。两个代理都对这个数组赋值。当数组内有两个元素时,通知rootViewController完成对应的操作。

    逻辑梳理

    鉴权和网络数据申请是分不开的。
    整体的实现思路如下:

    • 先进行鉴权
      • 用一个可变数组,存放“联网”“鉴权”.并添加KVO观察数据的变化。如上所述,数组的两个元素赋值是在代理中赋值。
      • 当联网和鉴权都被赋值(成功或失败均可)时,KVO进入观察着的回调,调用自身的block,执行下一步操作。
    • 鉴权成功时才去进行下一步的数据申请。执行的是上一步的block.需要注意的是,block的内容则是在页面加载的时候,从viewdidload去设置:如下:
        app.accessCompleteBlk = ^(BOOL result){
            if (result == YES) {
                [self setBaiduRelatedDelegate];
                [[DataUtil managerCenter] updateAllInfoWithSucBlk:^{
                    [[BaiduDistrictTool shareInstance] generateOverlaysFromPlist];
                    self.isAccess = YES;
                    [[NSNotificationCenter defaultCenter] postNotificationName:GUIDE_MODE_RADIO
                                                                        object:[NSNumber numberWithInt:NEARBY_GUIDE_MODE]];
                    [self dismissTip];
                } failBlk:^(NSError *err) {
                    XLog(@"信息请求失败,错误信息 = %@",err.domain);
                    [self dismissTip];
                    HUD_DATA_WARNING;
                }];
            } else {
                [self dismissTip];
                HUD_ACCESS_WARNING;
            }
        };
    

    鉴权成功后,执行以下逻辑:

    -(void)updateAllInfoWithSucBlk:(SucBlk)sucBlk
                           failBlk:(FailBlk)failBlk {
        plistManager *manager = [[plistManager alloc] initWithPlistName:PLIST_NAME];
        //1.1.从沙盒中取出行政区域边界信息plist用于绘制。如果plist不存在,就创建一个
        if ([manager ifPlistExist] == NO)
            [manager createPlist];
        //1.2读取这个plist文件
        NSDictionary *dict = [manager readPlist];
        if (dict.count == 0) {
            [[BaiduDistrictTool shareInstance] updateDistrictPlistWithSuccessBlk:^{
                //调试用,读plist
                NSDictionary *dict = [manager readPlist];
                XLog(@"空的plist重新获取数据后,读到的plist = %@",dict);
    
                // 2.1 到这一步,说明已读到正确的信息,继续请求站点信息
                [[StationInfo shareInstance] updateAllStationsInfoWithSuccessBlk:sucBlk
                                                                         FailBlk:failBlk];
            } FailBlk:failBlk];
        } else {// 3.2 已经读到正确的信息,继续获取站点信息
            [[StationInfo shareInstance] updateAllStationsInfoWithSuccessBlk:sucBlk
                                                                     FailBlk:failBlk];
        }
    }
    
    • 设置百度相关的代理
    • 设置了一个单例,升级数据。结果中套用了两个block,以便把握数据请求的顺序和结果。
      • 先升级区域边界,查看本地沙盒中是否有一个对应的plist,如果不存在,就去创建一个
      • 请求站点数据信息。

    相关文章

      网友评论

          本文标题:日志文档--网络鉴权顺序逻辑

          本文链接:https://www.haomeiwen.com/subject/bqkzwttx.html