問題以及背景
升級(jí)iOS10之后,絕大多數(shù)應(yīng)用第一次進(jìn)入都會(huì)提示無(wú)網(wǎng)絡(luò),首頁(yè)是無(wú)網(wǎng)絡(luò)狀態(tài)。具體原因是iOS10新出現(xiàn)的網(wǎng)絡(luò)鑒權(quán)授權(quán)機(jī)制,在網(wǎng)絡(luò)訪問未獲得授權(quán)情況下,使用Reachability判斷出的結(jié)果是:NotReachable.是屬于無(wú)網(wǎng)絡(luò)狀況(此時(shí)非常有可能是有網(wǎng)絡(luò)的)。如圖

ScreenShot_20160929110221.png
問題分析
- 思路一:根據(jù)以往經(jīng)驗(yàn),iOS7之后出現(xiàn)的相機(jī)、通知等鑒權(quán)。有對(duì)應(yīng)的API來(lái)判斷,如果沒有權(quán)限可以讓程序自動(dòng)跳轉(zhuǎn)到設(shè)置頁(yè)面,讓用戶去設(shè)置。例如:
- (BOOL)isCameraValid
{
double version = [[UIDevice currentDevice].systemVersion doubleValue];
if(version>=7.0f){
// 判斷程序的隱私設(shè)置是否授予權(quán)限
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authStatus != AVAuthorizationStatusAuthorized)
{
return NO;
}
}
return YES;
}
在XCode Dcouments里邊,以及https://developer.apple.com/search里搜索AuthorizationStatus

AuthorizationStatus_-_Search_-_Apple_Developer.png
沒有發(fā)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)相關(guān)的api,應(yīng)該是目前沒有開放出來(lái)。此路不通
- 思路二:去看那些其他軟件怎么做的,打開微信,
設(shè)置->微信關(guān)閉無(wú)線數(shù)據(jù)

ScreenShot_20160929115344.png
再次打開微信

ScreenShot_20160929115404.png
根據(jù)思路一,google,github未發(fā)現(xiàn)對(duì)應(yīng)API。自己做個(gè)Demo試驗(yàn)一下
關(guān)閉
無(wú)線數(shù)據(jù)之后,第一次進(jìn)入程序

ScreenShot_20160929115904.png
- 結(jié)論
- iOS10系統(tǒng)做了判斷處理,用戶無(wú)法干涉。
- 當(dāng)點(diǎn)擊允許或者不允許,均無(wú)直接回掉。所以用戶并不能根據(jù)當(dāng)前網(wǎng)絡(luò)狀態(tài),正確處理當(dāng)前網(wǎng)絡(luò)請(qǐng)求。
解決方案
但是Reachability會(huì)在授權(quán)界面點(diǎn)擊允許之后,有回掉??梢酝ㄟ^此回掉來(lái)正確處理當(dāng)前網(wǎng)絡(luò)請(qǐng)求。也就是在首頁(yè)或者其他需要相關(guān)請(qǐng)求注冊(cè)通知kReachabilityChangedNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
在回掉函數(shù)里進(jìn)行重新請(qǐng)求
- (void) reachabilityChanged:(NSNotification *)note
{
//
Reachability* curReach = [note object];
NetworkStatus netStatus = [curReach currentReachabilityStatus];
//發(fā)送請(qǐng)求
if(netStatus!=NotReachable)
{
}
}