乐趣区

关于前端:浅记reactnative开发时遇到的android应用市场审核问题

前言

不晓得各位有没有这种感觉,因为工业和信息化部公布的新规定,当初国内各大 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);
    ​

影响范畴

利用宝,华为。

❤️反对

如果本文对你有帮忙,点赞👍反对下我吧,你的「赞」是我创作的能源。

退出移动版