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

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

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,如果不存在,就去创建一个
    • 请求站点数据信息。

你可能感兴趣的:(日志文档--网络鉴权顺序逻辑)