jpush-react-native icon indicating copy to clipboard operation
jpush-react-native copied to clipboard

重构版删除了 `hasPermission` api,判断用户是否允许了推送通知的权限。能否添加回这个api

Open KingAmo opened this issue 5 years ago • 16 comments

你的运行环境

System:
    OS: macOS 10.14.6
    CPU: (12) x64 Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
    Memory: 59.57 MB / 16.00 GB
    Shell: 5.3 - /bin/zsh
  Binaries:
    Node: 12.3.1 - /usr/local/bin/node
    Yarn: 1.16.0 - /usr/local/bin/yarn
    npm: 6.11.3 - /usr/local/bin/npm
    Watchman: 4.9.0 - /usr/local/bin/watchman
  SDKs:
    iOS SDK:
      Platforms: iOS 13.1, DriverKit 19.0, macOS 10.15, tvOS 13.0, watchOS 6.0
    Android SDK:
      API Levels: 21, 23, 26, 27, 28
      Build Tools: 23.0.1, 26.0.1, 28.0.3, 29.0.2
  IDEs:
    Android Studio: 3.5 AI-191.8026.42.35.5900203
    Xcode: 11.1/11A1027 - /usr/bin/xcodebuild
  npmPackages:
    react: 16.9.0 => 16.9.0
    react-native: 0.61.2 => 0.61.2
  • 插件版本:
    "jcore-react-native": "^1.3.7",
    "jpush-react-native": "^2.5.10",
  • react-native 版本: 0.61.2

期望效果

之前版本的api 有hasPermission 这个api 检查用户是否开启了推送通知的权限。

实际效果

新版本的库没有了hasPermission这个api。希望能重新加回来

KingAmo avatar Oct 17 '19 07:10 KingAmo

你的运行环境

System:
    OS: macOS 10.14.6
    CPU: (12) x64 Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
    Memory: 59.57 MB / 16.00 GB
    Shell: 5.3 - /bin/zsh
  Binaries:
    Node: 12.3.1 - /usr/local/bin/node
    Yarn: 1.16.0 - /usr/local/bin/yarn
    npm: 6.11.3 - /usr/local/bin/npm
    Watchman: 4.9.0 - /usr/local/bin/watchman
  SDKs:
    iOS SDK:
      Platforms: iOS 13.1, DriverKit 19.0, macOS 10.15, tvOS 13.0, watchOS 6.0
    Android SDK:
      API Levels: 21, 23, 26, 27, 28
      Build Tools: 23.0.1, 26.0.1, 28.0.3, 29.0.2
  IDEs:
    Android Studio: 3.5 AI-191.8026.42.35.5900203
    Xcode: 11.1/11A1027 - /usr/bin/xcodebuild
  npmPackages:
    react: 16.9.0 => 16.9.0
    react-native: 0.61.2 => 0.61.2
  • 插件版本:
    "jcore-react-native": "^1.3.7",
    "jpush-react-native": "^2.5.10",
  • react-native 版本: 0.61.2

期望效果

�之前版本的api 有hasPermission 这个api 检查用户是否开启了推送通知的权限。

实际效果

新版本的库没有了hasPermission这个api。希望能重新加回来

你需要什么权限判断?接收通知是不用判断权限的

wicked-tc130 avatar Oct 17 '19 08:10 wicked-tc130

@wicked-tc130 判断用户是否允许了我的app接收推送。和jpush接收通知的业务无关,是我们的业务需要用到这个功能

KingAmo avatar Oct 17 '19 08:10 KingAmo

app第一次安装的时候,系统会询问用户是否允许app推送通知。我的需求就是要获取到用户是点了允许还是拒绝

KingAmo avatar Oct 17 '19 08:10 KingAmo

app第一次安装的时候,系统会询问用户是否允许app推送通知。我的需求就是要获取到用户是点了允许还是拒绝

android没有申请通知弹框权限,你可以翻下之前的代码

ios现在是支持的,只要你按照demo集成

wicked-tc130 avatar Oct 19 '19 02:10 wicked-tc130

这是之前的代码:

    private boolean hasPermission(String appOpsServiceId) {

        Context context = getReactApplicationContext();
        if (Build.VERSION.SDK_INT >= 24) {
            NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(
                    Context.NOTIFICATION_SERVICE);
            return mNotificationManager.areNotificationsEnabled();
        }else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
            ApplicationInfo appInfo = context.getApplicationInfo();

            String pkg = context.getPackageName();
            int uid = appInfo.uid;
            Class appOpsClazz;

            try {
                appOpsClazz = Class.forName(AppOpsManager.class.getName());
                Method checkOpNoThrowMethod = appOpsClazz.getMethod("checkOpNoThrow", Integer.TYPE, Integer.TYPE,
                        String.class);
                Field opValue = appOpsClazz.getDeclaredField(appOpsServiceId);
                int value = opValue.getInt(Integer.class);
                Object result = checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg);
                return Integer.parseInt(result.toString()) == AppOpsManager.MODE_ALLOWED;
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }

        return false;
    }

KingAmo avatar Oct 19 '19 02:10 KingAmo

app第一次安装的时候,系统会询问用户是否允许app推送通知。我的需求就是要获取到用户是点了允许还是拒绝

@wicked-tc130 你误解了我的意思,我需求是:我要拿到一个boolean值,判断用户是否允许了app推送通知,也就是是否打开了通知权限。这个功能在重构前版本中是有的:即:hasPermission 这个api

KingAmo avatar Oct 19 '19 02:10 KingAmo

之前代码iOS端的实现:

RCT_EXPORT_METHOD(hasPermission:(RCTResponseSenderBlock)callback) {
  float systemVersion = [[UIDevice currentDevice].systemVersion floatValue];
  
  
  if (systemVersion >= 8.0) {
    UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
    UIUserNotificationType type = settings.types;
    if (type == UIUserNotificationTypeNone) {
      callback(@[@(NO)]);
    } else {
      callback(@[@(YES)]);
    }
    
  } else if (systemVersion >= 10.0) {
    [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
      
      switch (settings.authorizationStatus)
      {
        case UNAuthorizationStatusDenied:
        case UNAuthorizationStatusNotDetermined:
          callback(@[@(NO)]);
          break;
        case UNAuthorizationStatusAuthorized:
          callback(@[@(YES)]);
          break;
      }
    }];
  }
}

KingAmo avatar Oct 19 '19 03:10 KingAmo

之前代码iOS端的实现:

RCT_EXPORT_METHOD(hasPermission:(RCTResponseSenderBlock)callback) {
  float systemVersion = [[UIDevice currentDevice].systemVersion floatValue];
  
  
  if (systemVersion >= 8.0) {
    UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
    UIUserNotificationType type = settings.types;
    if (type == UIUserNotificationTypeNone) {
      callback(@[@(NO)]);
    } else {
      callback(@[@(YES)]);
    }
    
  } else if (systemVersion >= 10.0) {
    [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
      
      switch (settings.authorizationStatus)
      {
        case UNAuthorizationStatusDenied:
        case UNAuthorizationStatusNotDetermined:
          callback(@[@(NO)]);
          break;
        case UNAuthorizationStatusAuthorized:
          callback(@[@(YES)]);
          break;
      }
    }];
  }
}

我认为这个属于业务逻辑。既然你能找到,可以把它加到你的代码中,或者在你的工程里修改RN-JPush源码

wicked-tc130 avatar Oct 19 '19 03:10 wicked-tc130

@wicked-tc130 这是属于业务逻辑,但是这个业务逻辑与推送相关,不懂原生的RN开发者是依赖于封装好的库,我认为添加回这个api 有利于构建更好的RN的生态。RN里开发者可选择的消息推送的库不多,还是烦请您再考虑一下。

KingAmo avatar Oct 19 '19 03:10 KingAmo

@wicked-tc130 这是属于业务逻辑,但是这个业务逻辑与推送相关,不懂原生的RN开发者是依赖于封装好的库,我认为添加回这个api 有利于构建更好的RN的生态。RN里开发者可选择的消息推送的库不多,还是烦请您再考虑一下。

下个大版本会加上

wicked-tc130 avatar Oct 25 '19 08:10 wicked-tc130

等这个api添加上了再关闭吧 : )

KingAmo avatar Oct 25 '19 09:10 KingAmo

拥有这个功能的版本多久发布

ZHT131 avatar Oct 28 '19 10:10 ZHT131

如果我按你的之前的版本的方法拷贝过来可行吗?

ZHT131 avatar Oct 28 '19 11:10 ZHT131

这个功能什么时候会加上?

imaxshuai avatar Nov 29 '19 03:11 imaxshuai

@wicked-tc130 这是属于业务逻辑,但是这个业务逻辑与推送相关,不懂原生的RN开发者是依赖于封装好的库,我认为添加回这个api 有利于构建更好的RN的生态。RN里开发者可选择的消息推送的库不多,还是烦请您再考虑一下。

下个大版本会加上

请问加上去了吗,现在2022年12月了

CrazyMan2 avatar Dec 09 '22 07:12 CrazyMan2

所以获取应用列表,MAC地址,AndroidID啥的怎么让他在获取隐私权限后再搞?

Sissi-ok avatar Jan 12 '23 07:01 Sissi-ok