背景
ios10之后,收到用戶反饋瘪贱,“你的游戲怎么無法登錄纱控,刪掉之后重新下載也不行!”菜秦。第一反應(yīng)甜害,是登錄服務(wù)存在問題;第二反應(yīng)是玩家網(wǎng)絡(luò)沒有開球昨,結(jié)果排查下來都不是尔店。最后讓用戶檢查 設(shè)置->應(yīng)用的網(wǎng)絡(luò)鏈接權(quán)限,發(fā)現(xiàn)處于關(guān)閉狀態(tài),更加可惡的是這個權(quán)限一旦關(guān)閉之后嚣州,就算應(yīng)用刪掉重新下載也不會彈出詢問窗口鲫售,一直會處于關(guān)閉狀態(tài)。于是该肴,參考網(wǎng)上資料情竹,發(fā)現(xiàn)這種機(jī)子網(wǎng)絡(luò)正常,但應(yīng)用網(wǎng)絡(luò)鏈接權(quán)限處于關(guān)閉狀態(tài)的情況匀哄,可以程序增加設(shè)定秦效,提醒用戶重新開啟權(quán)限。
效果圖
實現(xiàn)原理
在程序啟動的時機(jī)涎嚼,檢查是否處于權(quán)限關(guān)閉的狀態(tài)阱州,若是的話,則彈框引導(dǎo)用戶前往重新設(shè)置網(wǎng)絡(luò)法梯。
代碼實現(xiàn)
在處于啟動的入口調(diào)用 [self checkNetworkPower];
#include "Reachability.h"
#import <CoreTelephony/CTTelephonyNetworkInfo.h> //為判斷網(wǎng)絡(luò)制式的主要文件
#import <CoreTelephony/CTCarrier.h> //添加獲取客戶端運營商 支持
#import <CoreTelephony/CTCellularData.h>
#import <SystemConfiguration/CaptiveNetwork.h>
// 檢查網(wǎng)絡(luò)是否受限制
- (void)checkNetworkPower{
if ([self checkHaveNetwork:@"www.baidu.com"] ||
[self checkHaveNetwork:@"www.qq.com"]){
return;
}
NSString* strInfo = [self fetchMobileInfo];
BOOL bIs2G = FALSE;
if ([strInfo isEqualToString:CTRadioAccessTechnologyEdge] || [strInfo isEqualToString:CTRadioAccessTechnologyGPRS] ){
// 2G網(wǎng)絡(luò)不處理
bIs2G = TRUE;
}
if (bIs2G == FALSE){
if ([self fetchSSIDInfo] != nil){
[self dealNetworkPower];
}
else{
[self startValidateNetworkAuthorization];
}
}
}
// 如果獲取到的info不為nil苔货,則當(dāng)前是wifi情況下沒有網(wǎng)絡(luò)連接。
- (NSDictionary *)fetchSSIDInfo {
NSArray *ifs = (NSArray *)CNCopySupportedInterfaces();
if (!ifs) {
return nil;
}
NSDictionary *info = nil;
for (NSString *ifnam in ifs) {
info = ( NSDictionary *)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
if (info && [info count]) { break; }
}
return info;
}
//蜂窩:獲取運營商信息
- (NSString *)fetchMobileInfo {
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
return info.currentRadioAccessTechnology;
}
//可以去判斷是否為2G鹊汛,2G情況下我是直接排除判斷范圍蒲赂,因為2G環(huán)境下有可能會出現(xiàn)發(fā)生了網(wǎng)絡(luò)請求阱冶,但是系統(tǒng)沒有彈窗刁憋。
//然后用了一個ios9的api去判斷當(dāng)前設(shè)置的蜂窩允許狀態(tài):(用戶第一次彈窗選擇了不允許,是指蜂窩和無線都不允許木蹬,那么可以通過這個蜂窩的狀態(tài)間接去判斷)
- (void)startValidateNetworkAuthorization
{
CTCellularData *cellularData = [[CTCellularData alloc] init];
cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state){
if (state != kCTCellularDataNotRestricted){
NSLog(@"如果獲取到的info不為nil至耻,則當(dāng)前是wifi情況下沒有網(wǎng)絡(luò)連接。");
[self dealNetworkPower];
}
};
}
// 判斷網(wǎng)絡(luò)是否通
- (BOOL)checkHaveNetwork:(NSString*)strAddress
{
BOOL isExistenceNetwork = YES;
Reachability *reach = [Reachability reachabilityWithHostName:strAddress];
switch ([reach currentReachabilityStatus]) {
case NotReachable:
isExistenceNetwork = NO;
break;
case ReachableViaWiFi:
isExistenceNetwork = YES;
break;
case ReachableViaWWAN:
isExistenceNetwork = YES;
break;
}
return isExistenceNetwork;
}
// 處理網(wǎng)絡(luò)問題
- (void)dealNetworkPower
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"無法訪問網(wǎng)絡(luò)"
message:@"由于IOS10系統(tǒng)問題镊叁,我們無法訪問您的網(wǎng)絡(luò)尘颓,請單擊<前往設(shè)置>->進(jìn)入<無線數(shù)據(jù)>,將其設(shè)為<無線局域網(wǎng)與蜂窩移動數(shù)據(jù)>晦譬,并重返回游戲疤苹!"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"前往設(shè)置", nil];
alertView.tag = 1000;
[alertView show];
}
#pragma mark - delegate method
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (alertView.tag == 1000) {
if (buttonIndex == 1) {
NSLog(@"前往設(shè)置");
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication]canOpenURL:url]) {
[[UIApplication sharedApplication]openURL:url];
}
}
}
}