iOS 处理应用第一次启动无法联网的情况

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
posted @ 2021-11-16 10:16  qqcc1388  阅读(2987)  评论(0编辑  收藏  举报