头图

前言

不知道各位有没有这种感觉,由于工业和信息化部发布的新规定,现在国内各大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);
    ​

影响范围

应用宝,华为。

❤️支持

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


wcly
153 声望2 粉丝

用已知解决未知