1.蜂窩權限狀態(tài)獲取
檢查應用的蜂窩權限,可使用CTCellularData類
#import <CoreTelephony/CTCellularData.h>
- 創(chuàng)建CTCellularData實例,監(jiān)聽蜂窩權限的變化,注意:這個CTCellularData實例需要設置成全局變量,在需要獲取蜂窩權限狀態(tài)的場景下使用這個對象
static CTCellularData *_cellularData;
- (void)addObserverForWWAN {
_cellularData = [CTCellularData new];
_cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state) {
switch (state) {
case kCTCellularDataRestricted:
NSLog(@"蜂窩-變化-受限");
break;
case kCTCellularDataNotRestricted:
NSLog(@"蜂窩-變化-不受限");
break;
default:
NSLog(@"蜂窩-變化-未知");
break;
}
};
}
當添加這個監(jiān)聽時,會立即執(zhí)行一次上面這個block回調.
- 獲取當前蜂窩權限
+ (CTCellularDataRestrictedState)stateOfWWAN {
return _cellularData.restrictedState;
}
2. 判斷蜂窩是否開啟
網上找了很久沒找到對應的方法,只找到判斷wifi開啟狀態(tài)的方法,這個判斷蜂窩開啟的方法由此演化得來(在iOS12,iOS10上面測試均有效)
- 導入頭文件
#import <net/if.h>
#import <ifaddrs.h>
- 關鍵代碼
+ (BOOL)isWWANEnable {
NSCountedSet *countedSet = [NSCountedSet new];
struct ifaddrs *interfaces;
if (!getifaddrs(&interfaces)) {
for (struct ifaddrs *interface = interfaces; interface; interface = interface->ifa_next) {
if ((interface->ifa_flags & IFF_UP) == IFF_UP) {
NSString *ifa_name = [NSString stringWithUTF8String:interface->ifa_name];
[countedSet addObject:ifa_name];
NSLog(@"ifa_name: %s, sa_family: %d", interface->ifa_name, interface->ifa_addr->sa_family);
}
}
}
freeifaddrs(interfaces); // 需要手動釋放
BOOL open = [countedSet countForObject:@"pdp_ip0"] > 1 ? YES : NO;
NSLog(@"cellular open status: %@", open ? @"open" : @"unopen");
return open;
}
當沒有打開蜂窩時,pdp_ip0個數為0, 當打開蜂窩時,pdp_ip0個數有4個