在不弹出网络授权提示的设备中,更有些机型会默认不允许访问网络。那么,坑就来了。导致APP数据加载不出来,而用户又不知道是网络问题。
在网上查到:
据了解,这一功能与工信部起草的一份《移动智能终端应用软件(APP)预置和分发管理暂行规定》有关,规定中要求设备生产企业「未经明示且经用户同意,不得实施擅自收集使用用户个人信息、强制开启应用软件……等侵害用户合法权益和危害网络安全的行为」。
所以现在我们使用的国行手机,首次打开 App,一般也都会有请求网络权限的弹窗。非国行设备新安装的 App 不会弹出「请求联网」的授权提示。
查看是否国行手机可以在 设置->通用->关于本机->型号 中查看,CH为国行、ZP为港行、LL为美行、KR为韩行、J为日行。
但是,目前的「联网权限」功能并不完善,还因此带来了一些使用上的不便。具体表现为:在部分国行 iPhone 上,当用户打开一款新 App 时,请求联网授权的提示框有一定几率不会出现。这就出现了 App 加载异常,用户又不知道这是因为没有联网导致APP无法使用的,毕竟其他软件是可以上网的。
所以,针对这种情况,APP端最好做一下网络授权判断。上代码:
#import <CoreTelephony/CTCellularData.h>
#pragma mark - Network auth status
- (void)networkAuthStatus {
CTCellularData *cellularData = [[CTCellularData alloc]init];
cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state) {
if (state == kCTCellularDataRestricted) {
//拒绝
[self networkSettingAlert];
} else if (state == kCTCellularDataNotRestricted) {
//允许
} else {
//未知
[self unknownNetwork];
}
};
}
- (void)networkSettingAlert {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"您尚未授权“app”访问网络的权限,请前往设置开启网络授权" preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"去设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
}]];
[self.window.rootViewController presentViewController:alertController animated:YES completion:nil];
});
}
- (void)unknownNetwork {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"未知网络" preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}]];
[self.window.rootViewController presentViewController:alertController animated:YES completion:nil];
});
}