被拒驳回场景:
场景7:APP首次打开或运行中,未见使用权限对应的相关功能或服务时,提前向用户弹窗申请开启通讯录、定位、短信、录音、相机、日历等权限
改进建议:
APP业务功能所需的权限最好在对应业务功能执行时动态申请,在用户未触发相关业务功能时,不提前申请与当前业务功能无关的权限。
=====================
以上是vivo隐私测试时的报告内容。
目前app里面有用到拔打电话和定位(暂时取消定位功能, 为了测试具体是由电话还是定位引起的被拒)。
电话权限
点击“电话”图标时, 使用以下代码拔打电话,核心代码是:uni.makePhoneCall({phoneNumber: '15912345678'});
export default {
// 电话图标点击事件
async handleCall(phone) {
// 1. 先检查是否已有权限
// console.log('handleCall')
const status = await this.checkPhonePermission();
// console.log('status',status)
if (status === 'granted') {
// 已有权限,直接拨号
this.makeCall(phone);
} else if (status === 'denied') {
// 2. 无权限时再动态申请
const res = await this.requestPhonePermission();
if (res === 'authorized') {
this.makeCall(phone);
} else {
uni.showToast({ title: '需要电话权限才能拨打', icon: 'none' });
}
}
},
// 检查权限状态
checkPhonePermission() {
return new Promise((resolve) => {
plus.android.requestPermissions(
['android.permission.CALL_PHONE'],
(result) => {
resolve(result.granted.length > 0 ? 'granted' : 'denied');
},
(error) => {
console.log('error',error)
resolve('denied')
}
);
});
},
// 动态申请权限
requestPhonePermission() {
return new Promise((resolve) => {
plus.android.requestPermissions(
['android.permission.CALL_PHONE'],
(result) => {
resolve(result.granted.length > 0 ? 'authorized' : 'denied');
},
(error) => resolve('denied')
);
});
},
// 执行拨号
makeCall(phone) {
uni.makePhoneCall({
phoneNumber: phone
});
}
}
定位权限
点击“定位”图标时,使用附件中的getLocation.js获取当前的城市名,核心代码是:uni.getLocation({type: 'wgs84',.....
fetchLocation({state,commit}){
uni.showLoading({
title: '定位获取中...'
});
uni.getLocation({
type: 'wgs84',
success: (result) => {
uni.hideLoading();
uni.request({
url: 'https://api.map.baidu.com/reverse_geocoding/v3/?ak=6HAxA2JFoR20c3GEIYi5axtxceUqKHpn&output=json&coordtype=wgs84ll&location=' + result.latitude + ',' + result.longitude,
data: {},
header: {'Content-Type': 'application/json'},
success: function(res) {
if (res.data.status === 0) {
var city = res.data.result.addressComponent.city;
//城市获取成功
} else {
uni.showToast({
title: '获取位置信息失败',
icon:"error",
duration: 2000
});
// console.error('获取位置信息失败:' + res.data.status);
}
},
fail: function(err) {
uni.showToast({
title: '请求失败',
icon:"fail",
duration: 2000
});
console.error('请求失败:' + err);
}
});
},fail(err) {
uni.hideLoading();
console.error('定位失败:' + err);
}
});
}
联系了vivo客服(非技术),说是:“拨打电话不需要申请电话权限,建议App采用其他不需要权限的替代方案来实现相关功能,例如使用Intent.ACTION_DIAL通过startActivity拉起系统拨号盘的方式进行拨号。”
客服的意思是唤起拔号键盘,让用户手工输入我们的联系电话。
自测:
通过HBuilder X4.75用数据线连接小米手机,进行真机测试的时候,进入首页前会提示申请电话的权限。
但打包成apk,安装到小米手机上,首次进入时不会有申请权限的弹窗,只有在点击电话图标拔打电话时,才会有弹窗申请。
同时使用vivo开发者后台的“云真机”安装测试,首次进入app,也不会有申请电话权限的弹窗。
manifetest权限配置:
manifetest.json中关于权限的配置信息如下:
"android" : {
"permissionExternalStorage" : {
"request" : "none",
"prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
},
"permissionPhoneState" : {
"request" : "none",
"prompt" : "温馨提示:为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"
},
"permissions" : [ "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>" ],
"autoSdkPermissions" : false,
"targetSdkVersion" : 30
},
另外配置了androidPrivacy.json,template模式。
求助
1、难道真要如vivo客服说的那样,使用Intent.ACTION_DIAL通过startActivity拉起系统拨号盘,用户手动输入我们的电话进行拔打?同行及其它行业的APP,点击电话图标后,自动切换到拔号盘,app端的联系方式在上面显示。
2、要怎么排除是哪里出了问题?
我尝试个新建home.vue,并作为启动首页,只放着一个电话图标,点击图标调用handleCall('15912345678')进行拔打电话。
app.vue页面只引用uview-ui.scss等样式文件,
main.js只引用以下代码:
import Vue from 'vue'
import App from './App'
import store from "./store"
Vue.prototype.$store = store
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()
使用云端证书进行在线打包成apk,提交vivo进行隐私测试,照样被拒驳回,理由还是“场景7”。
哪位大神麻烦帮忙解答一下。感谢。
asdf211 (作者)
谢谢,那我尝试改用Intent.ACTION_DIAL试试。
我用小米手机安装 apk,使用 uni.makePhoneCall({ phoneNumber: '15912345678'}); 进行拨号时,也是跳转到拨号盘,上面显示15912345678手机号,但不会自动拨出,需要点击“拔号”键才会拨出。
2025-07-30 11:47