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