之前看到某款app诈乒,當(dāng)我開著4G網(wǎng)絡(luò)但是禁止該app訪問網(wǎng)絡(luò)時漆羔,該app會提示我前往設(shè)置頁面開啟數(shù)據(jù)訪問權(quán)限戏羽,后來在一本書上找到了一個解決方案担神。
原理其實(shí)不難,首先導(dǎo)入頭文件<objc/message.h>始花,狀態(tài)欄是由當(dāng)前app控制的妄讯,獲取當(dāng)前app后遍歷所有屬性,找到關(guān)于狀態(tài)欄的
UIApplication *app = [UIApplication sharedApplication];
unsigned int outCount = 0;
Ivar *ivars = class_copyIvarList(app.class, &outCount);
for (int i = 0; i < outCount; i++) {
Ivar ivar = ivars[i];
printf("|%s \n", ivar_getName(ivar));
}
lvarList
輸出得到app的所有屬性和變量酷宵,很明顯statusBar就是狀態(tài)欄的亥贸,然后我們一層層往下剝,這里我就不一一贅述了浇垦,最后獲取到的dataNetworkType就是當(dāng)前網(wǎng)絡(luò)狀態(tài)
UIApplication *application = [UIApplication sharedApplication];
NSArray *children = [[[application valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
id type = [child valueForKeyPath:@"dataNetworkType"];
NSLog(@" type class is %@, value is %@", [type class], type);
}
}
經(jīng)過測試炕置,發(fā)現(xiàn),可能的值為 1男韧,2朴摊,3,5 分別對應(yīng)的網(wǎng)絡(luò)狀態(tài)是2G此虑、3G甚纲、4G及WIFI。 當(dāng)沒有網(wǎng)絡(luò)時寡壮,隱藏UIStatusBarDataNetworkItemView贩疙,無法獲取dataNetworkType值。