iOS APNS服务注册时机

104 阅读1分钟

因为有可能网络授权弹窗在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];
}