uni-app 小米商店发布提示在隐私政策之前获取了手机SERIALNO

发布于 1周前 作者 songsunli 来自 Uni-App

uni-app 小米商店发布提示在隐私政策之前获取了手机SERIALNO

操作步骤

小米审核

预期结果

通过审核

实际结果

未通过

bug描述

小米发布应用商店审核,暴「存在隐私违规问题」,在同意隐私政策之前,去读取了手机的SERIALNO。 隐私政策用的androidPrivacy.json,在隐私弹窗前没有做任何操作。 堆栈信息为 硬件序列号 发生时间:2024-11-11 17:07:32 违规md5:md5=FA5A6D00470F168FC12D43E62335AF1C, 违规动作:action=android.permission.READ_PHONE_STATE_SERIALNO, 违规详情:content=JAVA反射读取Build.SERAIL,callstack:java.lang.Class.getField:1605;io.dcloud.e.f.a$b.f:1;io.dcloud.e.f.a$b.e:6;io.dcloud.e.f.a$b.<clinit>:1;io.dcloud.e.f.a$b.b:1;io.dcloud.e.f.a.a:65;io.dcloud.e.f.a.a:22;io.dcloud.e.f.b.a:10;io.dcloud.e.f.b.<init>:6;io.dcloud.e.f.b.a:4;io.dcloud.feature.gg.dcloud.AolFeatureImpl.doForFeature:136;io.dcloud.feature.gg.AolFeatureImplMgr.doForFeature:5;io.dcloud.a.a:16;io.dcloud.b$a.run:5;android.os.Handler.handleCallback:873;android.os.Handler.dispatchMessage:99;android.os.Looper.loop:193;android.app.ActivityThread.main:7175;java.lang.reflect.Method.invoke:-2;com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run:493;com.android.internal.os.ZygoteInit.main:858;

开发环境与版本信息

项目创建方式 HBuilderX
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 Windows 10 企业版
HBuilderX类型 正式
HBuilderX版本号 4.29
手机系统 Android
手机系统版本号 Android 12
手机厂商 小米
手机机型 小米
页面类型 vue
vue版本 vue2
打包方式 离线

37 回复

一样的,小米也是提示了违规动作:action=android.permission.READ_PHONE_STATE_SERIALNO,还没点隐私弹窗的按钮,就说提前获取了,导致上架不了


隐私弹窗拒绝退出应用,可以通过商店自动化检测了。

如果配置了原生隐私弹框,这个堆栈就是在点击同意之后进入应用的堆栈。可以检查一下,弹框的文案是不是配反了。检测没问题可以发一下包

隐私弹窗配置了,https://www.pgyer.com/app/qrcode/4hoC 这是下载的二维码,可以帮忙看看。

刚问了小米,他这个检测也可能是点了不同意后继续进入页面拿到的堆栈信息,想问一下uniapp,在不同意隐私政策后,什么情况下会调用到获取SERIALNO,uni.getStorageSync或者uni.getSystemInfoSync()这种方法会吗?

回复 uniapp_hikha: 不会。uni的api不涉及访问SERIALNO

回复 DCloud_heavensoft: 只看堆栈信息,具体能看见是哪个方法调用到了吗?

回复 uniapp_hikha: 我看了一下,点击不同意怎么能进入应用呢?进入应用肯定代表了同意隐私协议。

回复 DCloud_Android_zl: 目前应用没有做不同意退出的逻辑,我们不同意也可以进入应用。

回复 uniapp_hikha: 如果不同意隐私协议也可以进入应用,应该走游客模式,游客模式下不会获取隐私信息。

请问有解决吗,我们也是被拒了一摸一样的原因,也是用的androidPrivacy.json

临时方案,隐私弹窗拒绝退出应用,可以过审,其他不行。

回复 uniapp_hikha: 是因为不同意进入程序时,某个api调用的?

回复 天青一色: 不清楚,官方也没回复我,还在研究。

回复 uniapp_hikha: 好的好的,谢谢大佬

可以发一下包

回复 uniapp_hikha: 请教下 隐私弹窗拒绝退出应用 是如何实现的。

回复 shb: 可以了, 隐私弹窗拒绝退出应用,可以通过商店自动化检测了。

目前这个问题有解决方案吗?

可以参考文档中上架和隐私章节对照是否配置有问题:https://uniapp.dcloud.net.cn/tutorial/android-store.html

一般出现这类问题是因为开启了游客模式,进入应用之后调用了隐私相关的API。游客模式参考文档:https://uniapp.dcloud.net.cn/tutorial/app-disagreemode.html

用户如果不同意隐私政策的情况下应该进入游客模式。游客模式适配参考第一条

配置隐私弹窗时一定要配置使用template模式。否则无法上架应用市场。应用内部自己实现的隐私弹窗也不行。

目前这个问题有解决方案吗?

可以参考文档中上架和隐私章节对照是否配置有问题:https://uniapp.dcloud.net.cn/tutorial/android-store.html

一般出现这类问题是因为开启了游客模式,进入应用之后调用了隐私相关的API。游客模式参考文档:https://uniapp.dcloud.net.cn/tutorial/app-disagreemode.html

用户如果不同意隐私政策的情况下应该进入游客模式。游客模式适配参考第一条

配置隐私弹窗时一定要配置使用template模式。否则无法上架应用市场。应用内部自己实现的隐私弹窗也不行。

请问这个问题有解决方案了吗,小米官方有给答复吗

可以参考文档中上架和隐私章节对照是否配置有问题:https://uniapp.dcloud.net.cn/tutorial/android-store.html

一般出现这类问题是因为开启了游客模式,进入应用之后调用了隐私相关的API。游客模式参考文档:https://uniapp.dcloud.net.cn/tutorial/app-disagreemode.html

用户如果不同意隐私政策的情况下应该进入游客模式。游客模式适配参考第一条

配置隐私弹窗时一定要配置使用template模式。否则无法上架应用市场。应用内部自己实现的隐私弹窗也不行。

这个问题大家都是怎么解决的哦,直接配置拒绝就退出应用吗

是的, 隐私弹窗拒绝退出应用,可以通过商店自动化检测了。

在处理 uni-app 应用在小米商店发布时遇到的“在隐私政策之前获取了手机 SERIALNO(序列号)”的提示时,通常意味着应用在用户同意隐私政策之前就已经尝试访问了设备的敏感信息,如设备的序列号。这违反了许多应用商店对于用户隐私保护的规定。为了解决这个问题,你需要在用户同意隐私政策之后再获取设备的 SERIALNO。

以下是一个简单的示例代码,展示了如何在用户同意隐私政策后再获取 SERIALNO。请注意,由于 Android 10(API 级别 29)及更高版本对访问设备标识符(如 SERIALNO)施加了更严格的限制,你可能需要使用其他方法来唯一标识设备,或者确保你的应用具有必要的权限。

示例代码

  1. manifest.json 中声明权限(注意:获取 SERIALNO 的权限在 Android 10+ 上可能不再有效):
"mp-weixin": {
    // ...
},
"app-plus": {
    "distribute": {
        // ...
    },
    "permission": {
        "READ_PHONE_STATE": {
            "desc": "需要读取设备信息以便提供更好的服务"
        }
    }
}
  1. 在用户同意隐私政策后获取 SERIALNO
// 假设你有一个按钮用于显示隐私政策,用户点击后同意
document.getElementById('privacyPolicyButton').addEventListener('click', function() {
    // 显示隐私政策页面(这里可以是弹窗或者跳转到新页面)
    showPrivacyPolicy();
});

function showPrivacyPolicy() {
    // 假设这是一个异步操作,用户同意后调用 onPrivacyPolicyAccepted
    // 这里用 setTimeout 模拟异步操作
    setTimeout(() => {
        onPrivacyPolicyAccepted();
    }, 3000); // 假设用户3秒后同意
}

function onPrivacyPolicyAccepted() {
    if (plus.os.name === 'Android') {
        // 注意:在 Android 10+ 上,获取 SERIALNO 可能不再有效
        let serialno = plus.device.serialnumber;
        console.log('Device Serial Number:', serialno);
    } else {
        console.log('This feature is only available on Android.');
    }
}

注意

  • 在实际开发中,你应该使用更合适的方式来处理用户同意隐私政策的逻辑,比如使用弹窗的回调函数或者页面导航的回调。
  • 由于 SERIALNO 在 Android 10+ 上可能无法获取,你可能需要考虑使用其他设备标识符,如广告 ID(Advertising ID),或者生成一个唯一的设备 ID 存储在本地。
  • 确保你的应用符合所有相关的隐私法规和标准,如 GDPR 和 CCPA。
回到顶部