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

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


#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <React/RCTBridgeModule.h>

@interface PermissionModule : NSObject<RCTBridgeModule>

@end
#import "PermissionModule.h"
#import <UserNotifications/UserNotifications.h>

@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]);
      }
    }
  });
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 极光推送: 1.JPush当前版本是1.8.2,其SDK的开发除了正常的功能完善和扩展外也紧随苹果官方的步伐,SD...
    Isspace阅读 6,952评论 10赞 16
  • 推送通知注意:这里说的推送通知跟NSNotification有所区别NSNotification是抽象的,不可见的...
    醉叶惜秋阅读 1,664评论 0赞 3
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 14,790评论 0赞 15
  • 前言 本文是一篇转载文章,在这一篇实用的文章里,你可以按照上面的步骤实现不借助第三方和服务器端,自己给自己的设备发...
    進无尽阅读 1,868评论 6赞 6
  • “推送通知?喔,不!”。是的,这就是我被叫去实现一个 iOS 应用中的推送通知功能时,脑海中闪过的第一念头,而且我...
    王小宾阅读 2,922评论 0赞 2

友情链接更多精彩内容