百度地图打开时的鉴权问题
在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,如果不存在,就去创建一个
- 请求站点数据信息。
网友评论