uni-app上架荣耀隐私检测不通过

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

uni-app上架荣耀隐私检测不通过

违规场景

场景5:APP向用户明示SDK的收集使用规则,未经用户同意,SDK存在收集IMEI、设备MAC地址和软件安装列表、通讯录和短信等信息的行为。

风险信息

APP向用户明示SDK的收集使用规则,未经用户同意,SDK存在收集((SDK: 数字天堂uni-AD原生广告) 读取传感器列表)的行为。

风险详情

2025-01-09 12:43:52.313 -> [测试动作] 启动史宾格隐私合规检测
2025-01-09 12:44:21.865 -> (SDK: 数字天堂uni-AD原生广告) 读取传感器列表
2025-01-09 12:44:48.241 -> 弹出隐私政策

强烈建议UNIAPPX的隐私政策弹窗显示在启动界面,不然UNI-AD出来就隐私不通过了。


10 回复

uni.getDeviceInfo部分属性会获取传感器信息,建议在用户同意隐私协议之后调用,或者按需获取需要的信息,参考
uni.getDeviceInfo({filter:[“brand”]}) 文档地址。


但是这个在组件或者首页要调用到啊,希望你们能把隐私弹窗可以弄在启动界面那样的话应该就不会影响了吧

回复 赢无翳: uni-app x中隐私弹框你们可以自定义,你只需要保证这个在同意了隐私弹框之后调用就可以了。隐私弹框相关API

应用是怎么实现隐私政策提示框的? 是因为统一隐私政策前显示了开屏广告吗?按目前的逻辑同意隐私政策前不会显示开屏广告的。

我连开屏广告都没有勾选,uni-ad模块去了都还隐私过不了,隐私弹窗实现是在app.uvue里弹出的隐私弹窗。

我隐私弹窗是在项目APP.uvue里这样实现的,把 “uni-ad” : {}模块去掉重新云打包提交审核还是这样隐私不通过呢。 export default {
onLaunch: function () {
console.log(‘App Launch’)
uni.getPrivacySetting({
success: (res) => {
if(res.needAuthorization){
uni.openDialogPage({
url: ‘/pages/privacy/privacy’,
})
}
},
fail: (err) => {
console.log(err)
}
})
setTimeout(() => {
if(state.user.uid == 0) {
let userdata = $ux.Store.get(‘User’)
let appdata = $ux.Store.get(‘Appmsg’)
let apptime = $ux.Store.get(‘Today’)
console.log(userdata);
console.log(appdata);
if(apptime != null) {
state.today = JSON.parse<Today>(JSON.stringify(apptime))!
}
if(userdata != null) {
state.user = JSON.parse<User>(JSON.stringify(userdata))!
state.appmsg = JSON.parse<Appmsg>(JSON.stringify(appdata))!
}
}
}, 100)
},
onShow: function () {
console.log(‘App Show’)
},
onHide: function () {
console.log(‘App Hide’)
},
// #ifdef APP-ANDROID
onLastPageBackPress: function () {
console.log(‘App LastPageBackPress’)
if (firstBackTime == 0) {
uni.showToast({
title: ‘再按一次退出应用’,
position: ‘bottom’,
})
firstBackTime = Date.now()
setTimeout(() => {
firstBackTime = 0
}, 2000)
} else if (Date.now() - firstBackTime < 2000) {
firstBackTime = Date.now()
uni.exit()
}
},
// #endif
onExit: function () {
console.log(‘App Exit’)
},
methods: {
getRedirectUrl(scheme : string | null, ulink : string | null) : string | null {
//解析scheme或universal link启动直达页面:
//scheme格式:uniappx://redirect/pages/component/view/view?key=value //其中redirect后为页面路径
//universal link格式:https://uniappx.dcloud.net.cn/ulink/redirect.html?url=%2Fpages%2Fcomponent%2Fview%2Fview%3Fkey%3Dvalue //通用链接路径需固定,?后面的url参数为直达页面路径,注意url字段值需做url编码(可使用encodeURIComponent方法)
let url : string | null = null;
if (null != scheme && scheme.length > 0) {
const PATHPRE = ‘redirect’;
let parts : string | null = null;
let pos = scheme.search(’//’);
if (pos > 0) {
parts = scheme.substring(pos + 2);
}
if (null != parts && parts.startsWith(PATHPRE)) {
url = parts.substring(PATHPRE.length);
}
} else if (null != ulink && ulink.length > 0) {
const PATH = ‘ulink/redirect.html’;
let parts = ulink.split(’?’);
if (parts.length > 1 && parts[0].endsWith(PATH) && parts[1].length > 0) {
parts[1].split(’&’).forEach((e) => {
let params = e.split(’=’);
if (params.length > 1 && params[0].length > 0 && params[1].length > 0) {
if (‘url’ == params[0]) {
if (null == url) {
url = decodeURIComponent(params[1]);
}
}
}
});
}
}
return url;
}
}
}

请官方看看这是怎么回事啊。急

提供一下完整的调用堆栈

at android.hardware.SensorManager.getSensorList()
at uts.sdk.modules.DCloudUniGetDeviceInfo.EmulatorCheckUtil.getSensorNumber(index.kt:269)
at uts.sdk.modules.DCloudUniGetDeviceInfo.EmulatorCheckUtil.emulatorCheck(index.kt:101)
at uts.sdk.modules.DCloudUniGetDeviceInfo.DeviceUtil$Companion.isSimulator(index.kt:397)
at uts.sdk.modules.DCloudUniGetDeviceInfo.IndexKt.getBaseInfo(index.kt:666)
at uts.sdk.modules.DCloudUniGetDeviceInfo.IndexKt$getDeviceInfo$1.invoke(index.kt:626)
at uts.sdk.modules.DCloudUniGetDeviceInfo.IndexKt$getDeviceInfo$1.invoke(index.kt:596)
at uni.UNIEEB0C9F.GenUniModulesUxFrameComponentsUxUpgradeUxUpgrade$Companion$setup$1$needNotificationProgress$1.invoke(ux-upgrade.kt:71)
at uni.UNIEEB0C9F.GenUniModulesUxFrameComponentsUxUpgradeUxUpgrade$Companion$setup$1$needNotificationProgress$1.invoke(ux-upgrade.kt:70)
at io.dcloud.uniapp.vue.ReactiveEffect.invokeFn(index.kt:342)
at io.dcloud.uniapp.vue.ReactiveEffect.access$invokeFn(index.kt:322)
at io.dcloud.uniapp.vue.ReactiveEffect$run$1.invoke(index.kt:366)
at io.dcloud.uniapp.vue.ComputedRefImpl.getValue(index.kt:1485)
at uni.UNIEEB0C9F.GenUniModulesUxFrameComponentsUxUpgradeUxUpgrade$Companion$setup$1$1.invoke(ux-upgrade.kt:252)
at java.lang.reflect.Method.invoke(Native Method)
at io.dcloud.uniapp.vue.shared.IndexKt$callFunction$invoke$1.invoke(index.kt:720)
at io.dcloud.uniapp.vue.shared.IndexKt.callFunction(index.kt:731)
at io.dcloud.uniapp.vue.IndexKt.callWithErrorHandling(index.kt:3002)
at io.dcloud.uniapp.vue.IndexKt.callWithAsyncErrorHandling(index.kt:3011)
at io.dcloud.uniapp.vue.IndexKt.callWithAsyncErrorHandling$default(index.kt:3009)
at io.dcloud.uniapp.vue.IndexKt$injectHook$1.invoke(index.kt:7174)
at java.lang.reflect.Method.invoke(Native Method)
at io.dcloud.uniapp.vue.shared.IndexKt$callFunction$invoke$1.invoke(index.kt:720)
at io.dcloud.uniapp.vue.shared.IndexKt.callFunction(index.kt:731)
at io.dcloud.uniapp.vue.shared.IndexKt.invokeArrayFns(index.kt:741)
at io.dcloud.uniapp.vue.shared.IndexKt.invokeArrayFns$default(index.kt:736)
at io.dcloud.uniapp.vue.IndexKt.unmountComponent(index.kt:6187)
at io.dcloud.uniapp.vue.IndexKt.unmount(index.kt:6036)
at io.dcloud.uniapp.vue.IndexKt$unmountChildren$1.invoke(index.kt:6765)
at io.dcloud.uniapp.vue.IndexKt$unmountChildren$1.invoke(index.kt:6760)
at io.dcloud.uniapp.vue.IndexKt.unmount(index.kt:6046)
at io.dcloud.uniapp.vue.IndexKt.unmountComponent(index.kt:6192)
at io.dcloud.uniapp.vue.IndexKt.unmount(index.kt:6036)
at io.dcloud.uniapp.vue.IndexKt.render(index.kt:6295)
at io.dcloud.uniapp.framework.BaseApp$$init$3.invoke(index.kt:3857)
at java.lang.reflect.Method.invoke(Native Method)
at io.dcloud.uts.UniCallbackWrapper.invoke(UniCallbackWrapper.kt:111)
at l.d.a(SourceFile:6)
at l.d.a(SourceFile:5)
at j.b.onClosed(Unknown Source:16)
at j.a.b(Unknown Source:14)
at io.dcloud.uniapp.appframe.activity.UniActivityManager.finishAllActivity$lambda$6(Unknown Source:8)
at io.dcloud.uniapp.appframe.activity.UniActivityManager.$r8$lambda$HK3lAZeHiBBDjM-616VUoX0zLbg(Unknown Source:0)
at io.dcloud.uniapp.appframe.activity.UniActivityManager$$ExternalSyntheticLambda4.run(Unknown Source:0)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at j.a.a(SourceFile:2)
at j.a$$ExternalSyntheticLambda3.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6554)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:558)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810)

针对您提到的uni-app上架荣耀应用市场时隐私检测不通过的问题,这通常涉及到应用对用户隐私数据的处理是否符合相关政策和规范。以下是一些可能的原因及相应的代码调整建议,以帮助您解决这一问题。请注意,具体解决方案需要根据荣耀的隐私检测反馈进行针对性调整。

1. 检查并修改权限申请

确保您的应用只申请必要的权限,并在申请时提供充分的理由。例如,如果您的应用不需要访问用户的通话记录,那么就不应该在manifest.json中申请该权限。

示例代码(修改manifest.json)

"permissions": {
    "android.permission.READ_PHONE_STATE": {
        "desc": "用于识别设备唯一标识,以便提供更好的服务"
    },
    // 确保只保留必要的权限
    // "android.permission.READ_CALL_LOG": {} // 如果不需要,则删除此行
}

2. 动态权限申请与说明

对于Android 6.0及以上版本,使用动态权限申请,并在用户授予权限前明确告知权限用途。

示例代码(动态权限申请)

if (uni.getSystemInfoSync().platform === 'android') {
    uni.authorize({
        scope: 'scope.userInfo',
        success() {
            console.log('用户已授权');
        },
        fail() {
            console.log('用户未授权');
            uni.showModal({
                title: '提示',
                content: '为了提供更好的服务,需要您授权访问某些信息',
                showCancel: false,
                success(res) {
                    if (res.confirm) {
                        // 引导用户去设置中手动授权
                        uni.openSetting();
                    }
                }
            });
        }
    });
}

3. 隐私政策与用户协议

确保您的应用有明确的隐私政策和用户协议,并在应用中提供访问链接。这有助于用户了解应用将如何处理他们的数据。

示例代码(在首页添加隐私政策链接)

<view class="privacy-policy">
    <text>隐私政策</text>
    <navigator url="/pages/privacyPolicy/privacyPolicy">查看</navigator>
</view>

4. 清理不必要的个人信息收集

检查代码中是否有不必要的个人信息收集逻辑,如未经用户同意就收集敏感信息。如果有,请立即移除或修改。

5. 提交复审

在修改完成后,重新打包应用并提交复审。确保在复审过程中提供详细的修改说明,以便审核人员快速理解您的改动。

请注意,以上代码仅为示例,具体实现需根据您的应用实际情况进行调整。同时,务必仔细阅读荣耀应用市场的隐私政策,确保您的应用完全符合要求。

回到顶部