asdf211
asdf211
  • 发布:2025-07-30 10:41
  • 更新:2025-07-30 15:40
  • 阅读:187

vivo审核被拒驳回,提前向用户弹窗申请开启通讯录、定位、短信、录音、相机、日历等权限

分类:uni-app

被拒驳回场景:

场景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”。
哪位大神麻烦帮忙解答一下。感谢。

2025-07-30 10:41 负责人:DCloud_Android_zl 分享
已邀请:
夏夜今晨

夏夜今晨

不是,使用Intent.ACTION_DIAL是打开了拨号界面,同时拨号号码是直接显示在那的,但不会拨出去,需要用户手动点击拨打的那个绿键才会正式通话,所以不需要拨号权限。客服的意思是要用这种。

你那种方式,是直接拨出去了

  • asdf211 (作者)

    谢谢,那我尝试改用Intent.ACTION_DIAL试试。

    我用小米手机安装 apk,使用 uni.makePhoneCall({ phoneNumber: '15912345678'}); 进行拨号时,也是跳转到拨号盘,上面显示15912345678手机号,但不会自动拨出,需要点击“拔号”键才会拨出。

    2025-07-30 11:47

DCloud_Android_zl

DCloud_Android_zl

提供一下录屏信息,可能是其他权限导致的。

要回复问题请先登录注册