前言
不知道各位有没有这种感觉,由于工业和信息化部发布的新规定,现在国内各大android应用市场的审核变的越来越严格,动不动就审核不通过,给你打回,让你整改,对开发者及其不友好。但换个角度想想,这对于消费者变的更友好,而且审核问题基本上只要改一次就行,只是很多审核平台并没有给出具体的修改方案,所以这里给各位提供一下本人的踩坑记录,以供参考。
本人平日上架的平台有小米,华为,应用宝。其它平台估计也差不多吧。
正文
1. 需要提供ICP证书
触发条件
如果你的应用有支付购买商品相关的功能,就需要去申请ICP证书。
解决方案
这玩意要钱。你可以选择放弃在这个平台上线或者按要求申请完ICP成后提供相关证明。
影响范围
应用宝和小米会需要提供ICP,华为暂时没要求。
2. 个性化推送
触发条件
- 如果应用有个性化推送的功能。
- 如果没有相关功能,在隐私协议中却有些(很多小公司的隐私协议可能都是复制其它公司的)
解决方案
- 一定要加入关闭推荐的功能,并且在隐私政策中写明白如何关闭。
<!---->
- 有个性化推送的字眼都删掉。
影响范围
华为,感觉华为是真的把隐私协议完全看了一遍。
3. 注销账号
触发条件
有登录功能的应用
解决方案
一定要加入注销账号、或删除账号的功能
影响范围
所有平台,包括苹果。苹果审核还是很好过的,除这个必须要其它都不用管。
4. 个人隐私以及和权限相关的部分
触发条件
应用获取ANDROID_ID、定位、IMEI、设备MAC等等需要涉及个人隐私的信息。
解决方案
- 一定要在用户点击同意隐私协议之后再获取相关信息,或弹出需要xx权限的提示框。
- 隐私协议要说明为什么需要这些信息,这些信息的用途,在哪里需要获取什么信息,保证不会泄露之类的。
- 请求xx权限,用户选择拒绝之后,下次进来之后不要再次请求。
- 如果第三方有隐私协议,把它的连接粘贴到自己的隐私协议里。
可以参考腾讯开放平台的文档,写的还是挺详细的。
第三方库
另外很多第三方库可能会获取一些隐私信息,这里要保证这些库都是在用户同意隐私政策之后再获取。
下面提供一下常见第三方库的解决方案:
-
react-native-device-info
这个库会获取ANDROID_ID之类的,别在用户同意隐私协议之前
import
。 -
阿里云推送
也会获取隐私信息,具体是啥忘了,初始化的方法要放在同意隐私协议之后调用,可以写一个桥接方法,在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); } }); } }
-
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);
影响范围
应用宝,华为。
❤️支持
如果本文对你有帮助,点赞👍支持下我吧,你的「赞」是我创作的动力。