浅记react-native开发时遇到的android应用市场审核问题

1,289 阅读4分钟

前言

不知道各位有没有这种感觉,由于工业和信息化部发布的新规定,现在国内各大android应用市场的审核变的越来越严格,动不动就审核不通过,给你打回,让你整改,对开发者及其不友好。但换个角度想想,这对于消费者变的更友好,而且审核问题基本上只要改一次就行,只是很多审核平台并没有给出具体的修改方案,所以这里给各位提供一下本人的踩坑记录,以供参考。

本人平日上架的平台有小米,华为,应用宝。其它平台估计也差不多吧。

正文

1. 需要提供ICP证书

触发条件

如果你的应用有支付购买商品相关的功能,就需要去申请ICP证书。

解决方案

这玩意要钱。你可以选择放弃在这个平台上线或者按要求申请完ICP成后提供相关证明。

影响范围

应用宝和小米会需要提供ICP,华为暂时没要求。

2. 个性化推送

触发条件

  1. 如果应用有个性化推送的功能。
  2. 如果没有相关功能,在隐私协议中却有些(很多小公司的隐私协议可能都是复制其它公司的)

解决方案

  1. 一定要加入关闭推荐的功能,并且在隐私政策中写明白如何关闭。
  1. 有个性化推送的字眼都删掉。

影响范围

华为,感觉华为是真的把隐私协议完全看了一遍。

3. 注销账号

触发条件

有登录功能的应用

解决方案

一定要加入注销账号、或删除账号的功能

影响范围

所有平台,包括苹果。苹果审核还是很好过的,除这个必须要其它都不用管。

4. 个人隐私以及和权限相关的部分

触发条件

应用获取ANDROID_ID、定位、IMEI、设备MAC等等需要涉及个人隐私的信息。

解决方案

  1. 一定要在用户点击同意隐私协议之后再获取相关信息,或弹出需要xx权限的提示框。
  2. 隐私协议要说明为什么需要这些信息,这些信息的用途,在哪里需要获取什么信息,保证不会泄露之类的。
  3. 请求xx权限,用户选择拒绝之后,下次进来之后不要再次请求。
  4. 如果第三方有隐私协议,把它的连接粘贴到自己的隐私协议里。

可以参考腾讯开放平台的文档,写的还是挺详细的。

第三方库

另外很多第三方库可能会获取一些隐私信息,这里要保证这些库都是在用户同意隐私政策之后再获取。

下面提供一下常见第三方库的解决方案:

  1. react-native-device-info

    这个库会获取ANDROID_ID之类的,别在用户同意隐私协议之前import

  2. 阿里云推送

    也会获取隐私信息,具体是啥忘了,初始化的方法要放在同意隐私协议之后调用,可以写一个桥接方法,在js端调用。其它第三方sdk初始化也能这么做。

    代码大概如下所示:

    package com.cooker.reactnative;
    ​
    import android.util.Log;
    ​
    import com.alibaba.sdk.android.push.CloudPushService;
    import com.alibaba.sdk.android.push.CommonCallback;
    import com.alibaba.sdk.android.push.noonesdk.PushServiceFactory;
    import com.facebook.react.bridge.Callback;
    import com.facebook.react.bridge.ReactApplicationContext;
    import com.facebook.react.bridge.ReactContext;
    import com.facebook.react.bridge.ReactContextBaseJavaModule;
    import com.facebook.react.bridge.ReactMethod;
    ​
    ​
    public class PushModule extends ReactContextBaseJavaModule {
        private static ReactContext context;
    ​
        public PushModule(ReactApplicationContext reactContext) {
            super(reactContext);
            context = reactContext;
        }
    ​
        public static ReactContext getContext() {
            return context;
        }
    ​
        @Override
        public String getName() {
            return "MPush";
        }
    ​
        /**
         * 初始化阿里云推送
         */
        @ReactMethod
        public void init(){
            PushServiceFactory.init(getContext().getApplicationContext());
            final String TAG = "初始化阿里云推送";
            CloudPushService pushService = PushServiceFactory.getCloudPushService();
          
            pushService.register(getContext().getApplicationContext(), new CommonCallback() {
                @Override
                public void onSuccess(String response) {
                    Log.d(TAG, "init cloudchannel success");
                }
    ​
                @Override
                public void onFailed(String errorCode, String errorMessage) {
                    Log.d(TAG, "init cloudchannel failed -- errorcode:" + errorCode + " -- errorMessage:" + errorMessage);
                }
            });
        }
    }
    ​
    
  3. react-native-code-push

    这个库使用的时候一定要把根组件包起来,所以不能在同意用户协议之后再导入进行初始化。经过查看相关资料,发现这个库获取ANDROID_ID并只是获取,没有也不影响使用。所以在源码里面注释掉相关代码再打包就行了。

    源码位置:node_modules/react-native-code-push/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java

    搜索mClientUniqueId,把相关代码都注释掉,就是下面三行:

    private String mClientUniqueId = null;
    mClientUniqueId = Settings.Secure.getString(reactContext.getContentResolver(), Settings.Secure.ANDROID_ID);
    configMap.putString("clientUniqueId", mClientUniqueId);

影响范围

应用宝,华为。

❤️支持

如果本文对你有帮助,点赞👍支持下我吧,你的「赞」是我创作的动力。