uni-app 使用HTML5+的plus.contacts.getAddressBook方法会导致App闪退

uni-app 使用HTML5+的plus.contacts.getAddressBook方法会导致App闪退

开发环境 版本号 项目创建方式
Mac macOS 10.15.4 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Mac

HBuilderX类型:正式

HBuilderX版本号:2.8.11

手机系统:iOS

手机系统版本号:IOS 14

手机厂商:苹果

手机机型:iPhone xs

页面类型:vue

打包方式:云端

示例代码:

const _self = this  

// 获取存储在系统的通讯录  
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressBook) {  

    addressBook.find("", function(contacts) {  
        if (contacts.length > 0) {  
            _self.$refs.phonePopup.closeModel()  
        }  
        // 赋值通讯录信息  
        _self.setPhone(contacts)      
        // 开始备份  
        _self.startBackupPhone()  

    })  

}, function(e) {  
    if (e.code == "20") {  
        _self.$utils.showToast('请同意权限获取!', 2000)  
    }  
})

操作步骤:

  1. App第一次调用plus.contacts.getAddressBook,会弹出授权弹窗,同意通讯录授权后,即可正确获得通讯录信息
  2. 再次调用plus.contacts.getAddressBook,之前已经同意授权,所以不会再弹出授权弹窗,而是App直接闪退

也就是说:在给了通讯录获取权限后,App再次调用plus.contacts.getAddressBook,就会闪退 iOS系统版本:14.3 iPhone 12 pro,iPhone XS,iPhone 12都复现了这个闪退问题

预期结果: 预期结果为正确获得通讯录信息

实际结果: 实际结果为,调用方法时,App闪退

bug描述: App第一次调用plus.contacts.getAddressBook方法,会弹出通讯录授权提示,如果点击确定授权,那么可以正确读到通讯录信息 然后第二次调用plus.contacts.getAddressBoo,由于之前已经给了权限,所以这次调用,不会再弹出授权的弹窗,而是直接闪退,100%能复现


更多关于uni-app 使用HTML5+的plus.contacts.getAddressBook方法会导致App闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

请问问题解决了吗,我也遇见了这个问题,求大佬指教呀

更多关于uni-app 使用HTML5+的plus.contacts.getAddressBook方法会导致App闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html


什么问题?写一个新的ASK以及可复现的DEMO把

这是一个已知的iOS权限问题。当使用plus.contacts.getAddressBook方法时,在iOS 14+系统上需要特别注意权限处理。

问题原因:

  1. iOS 14加强了隐私保护,对通讯录访问有更严格的限制
  2. 在已授权状态下再次调用getAddressBook可能导致权限检查异常

解决方案:

  1. 在调用前先检查权限状态:
plus.ios.requestPermission("contacts", function(){
    // 已授权时再调用getAddressBook
    plus.contacts.getAddressBook(...)
}, function(){
    // 处理未授权情况
});
  1. 或者使用条件判断:
if(plus.ios.hasPermission("contacts")){
    plus.contacts.getAddressBook(...)
} else {
    // 请求权限
}
  1. 确保在manifest.json中配置了正确的权限声明:
"ios": {
    "permissions": {
        "Contacts": {
            "description": "需要访问通讯录"
        }
    }
}
回到顶部