iOS应用在客户第一次安装的时,会请求网络权限,此时就算用户点击了同意网络权限,网络请求此时可能也已经失败,需要在客户点击了同意的时候,重新发起新的网络请求
监听网络权限这里采用CoreTelephony/CTCellularData.h这个库来监听,具体操作流程
1、创建CTCellularData并监听网络状态(监听是在异步线程监听,如果设计到显示UI的需要到主线程刷新)
2、监听到kCTCellularDataRestricted表示网络权限关闭,此时可能是用户第一次请求,所以在这里发起一次网络请求,app会自动弹出网络申请弹出,
3、用户点击了运行网络会进入到kCTCellularDataNotRestricted这个状态下,此时 发起正常的网络请求,并且初始化系统(需要注意的是此时线程为异步线程)
#if TARGET_IPHONE_SIMULATOR //模拟器
[self performSelectorOnMainThread:@selector(fetchProtocolVersionReq) withObject:nil waitUntilDone:YES];
#elif TARGET_OS_IPHONE //真机
__block BOOL isNoNetToNet = NO;
CTCellularData *cellularData = [[CTCellularData alloc] init];
cellularData.cellularDataRestrictionDidUpdateNotifier=^(CTCellularDataRestrictedState state) {
NSLog(@"%@",[NSThread currentThread]);
switch(state){
case kCTCellularDataRestricted:
{
NSLog(@"Restricted 权限关闭的情况下 再次请求网络数据会弹出设置网络提示");
[self performSelectorOnMainThread:@selector(fetchProtocolVersionReq) withObject:nil waitUntilDone:YES];
isNoNetToNet = YES;
}
break;
case kCTCellularDataNotRestricted:{
NSLog(@"NotRestricted 已经开启网络权限 监听网络状态");
dispatch_async(dispatch_get_main_queue(), ^{
[self performSelector:@selector(fetchProtocolVersionReq) withObject:nil afterDelay:isNoNetToNet ? 1.0f : 0.0];
isNoNetToNet = NO;
});
}
break;
case kCTCellularDataRestrictedStateUnknown:
NSLog(@"Unknown 未知情况 (还没有遇到推测是有网络但是连接不正常的情况下)");
break;
default:
break;
}
};
#endif