因为有可能网络授权弹窗在APNS注册之后,所以我们需要监听网络变化,在第一次网络可用时注册APNS服务。
#pragma mark - 向ANPS服务注册
- (void)registerNotification {
if (@available(iOS 10.0, *)) {
//iOS10特有
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center setNotificationCategories:[self createNotificationCategoryActions]];
// 必须写代理,不然无法监听通知的接收与点击
center.delegate = self;
[center requestAuthorizationWithOptions:UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
// 点击允许
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"%@", settings);
}];
// 初始化 CTCellularData 对象
CTCellularData *cellularData = [[CTCellularData alloc] init];
// 已开启网络访问权限
cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state) {
if (state == kCTCellularDataNotRestricted) { // 网络权限已开启
dispatch_async(dispatch_get_main_queue(), ^{
// 注册获得device Token
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
} else {
VVLog(@"registerForRemoteNotifications -- 网络权限未开启");
}
};
} else {
// 点击不允许
// 互传的通知权限未开启,要能跳到互传的通知开关设置页。
UIAlertController* alertController = [UIAlertController alertControllerWithTitle:@"权限请求" message:@"为了正常使用双机互联功能,请您开启vivo互传的通知,并选择任一种提醒方式。" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"去设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[VPSystemPermissionsTool goNotificationSetting];
}];
[alertController addAction:defaultAction];
UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:cancelAction];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.currentNav presentViewController:alertController animated:YES completion:^{
}];
});
}
}];
}
}
#pragma mark -- 网络监听
- (void)getNetworStatus {
__weak typeof(self) weakSelf = self;
self.mgr = [AFNetworkReachabilityManager sharedManager];
[self.mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
weakSelf.networkStatus = status;
//获取联网可达状态
NSString * statusMsg = @"";
BOOL canUse = NO;
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"NetworkingTypeUnknown");
statusMsg = @"未知网络";
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"NetworkingTypeNotReachable");
statusMsg = @"无网络访问";
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"NetworkingTypeReachableViaWWAN");
statusMsg = @"数据流量访问";
if (!weakSelf.isNotFirstNetworkReachability) {
[[AppDelegateDataSource sharedDataSource] registerNotification];
}
weakSelf.isNotFirstNetworkReachability = YES;
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"NetworkingTypeReachableViaWiFi");
statusMsg = @"Wi-Fi热点访问";
if (!weakSelf.isNotFirstNetworkReachability) {
[[AppDelegateDataSource sharedDataSource] registerNotification];
}
weakSelf.isNotFirstNetworkReachability = YES;
break;
default:
NSLog(@"NetworkingTypeUnknown");
statusMsg = @"未知网络";
break;
}
}];
[self.mgr startMonitoring];
}