react native 推送开关的处理(通知权限判断)并跳转系统设置界面

如果app中有推送功能,那么一般app的设置中都会有一个UISwitch开关来控制是否接收通知,或者用户可以选择关闭接收通知。一般来说集成推送SDK后第一次安装时会询问用户是否接收推送,如果此时用户选择了不接收,那么即使app内设置里的开关是打开的,用户一样收不到通知,所以这个Switch初始时的状态应该是根据用户是否授权接收通知,当用户同意接收通知时开关打开,以后怎么处理看用户选择,但是当用户选择了不接收通知时,那么开关应该是关闭的,且用户打开开关时该开关是无法打开的,此时要提示用户去【设置】-【通知】中开启权限之后才能打开。所以在进入设置界面的要判断用户是否授权了。通过原生判断桥接到react native,每次在设置页面的ComponentDidMount方法里判断即可


#import 
#import 
#import 

@interface PermissionModule : NSObject

@end
#import "PermissionModule.h"
#import 

@implementation PermissionModule

RCT_EXPORT_MODULE(PermissionModule)

RCT_EXPORT_METHOD(isAllowReceiveNotifiction:(RCTResponseSenderBlock)callback)
{
  if ([[[UIDevice currentDevice] systemVersion] doubleValue] >=10.0) { //iOS10以上包含iOS10
    UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
    [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
      if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined){
        //未选择;
        callback([[NSArray alloc] initWithObjects:@(0), nil]);
      }else if (settings.authorizationStatus == UNAuthorizationStatusDenied){
        //未授权;
        callback([[NSArray alloc] initWithObjects:@(0), nil]);
      }else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized){
        //已授权;
        callback([[NSArray alloc] initWithObjects:@(1), nil]);
      }
    }];
  }else if([[[UIDevice currentDevice] systemVersion] doubleValue] >=8.0 && [[[UIDevice currentDevice] systemVersion] doubleValue] <10.0){ // ios8-ios10
    if ([[UIApplication sharedApplication] currentUserNotificationSettings].types  == UIRemoteNotificationTypeNone) {
      callback([[NSArray alloc] initWithObjects:@(0), nil]);
    }else{
      callback([[NSArray alloc] initWithObjects:@(1), nil]);
    }
  }
}
@end

如果没有给权限接收通知,则应该让用户跳转到app的设置界面,开启接收通知开关
方法1,可以直接在RN端打开(未亲测)

Linking.openURL('app-settings:')
  .catch(err => console.log('error', err))

方法2:桥接(亲测可用),使用原生UIApplication的canOpenURL方法,怎么桥接见我桥接支付宝

RCT_EXPORT_METHOD(pushToCurrentAppSetting:(RCTResponseSenderBlock)callback)
{
  dispatch_async(dispatch_get_main_queue(), ^{
    NSURL *targetURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    if ([[[UIDevice currentDevice] systemVersion] doubleValue] >=10.0) {
      if([[UIApplication sharedApplication] canOpenURL:targetURL]){
        [[UIApplication sharedApplication] openURL:targetURL options:@{} completionHandler:^(BOOL success) {
          callback([[NSArray alloc] initWithObjects:@(1), nil]);
        }];
      }else{
         callback([[NSArray alloc] initWithObjects:@(0), nil]);
      }
    }else{
      if([[UIApplication sharedApplication] canOpenURL:targetURL]){
        [[UIApplication sharedApplication] openURL:targetURL];
        callback([[NSArray alloc] initWithObjects:@(1), nil]);
      }else{
        callback([[NSArray alloc] initWithObjects:@(0), nil]);
      }
    }
  });
}

你可能感兴趣的:(react native 推送开关的处理(通知权限判断)并跳转系统设置界面)