答案是否定的,uni-app本身不提供跨端读取联系人的原生api;h5无权限,app端需用原生插件(如uni-contact),小程序仅支持用户主动选择(如wx.choosecontact)。

uni-app 能否直接读取手机联系人?答案是否定的
uni-app 本身不提供 getContacts 或类似原生 API 的跨端接口,H5 环境完全无权限,App 端(iOS/Android)需调用原生模块,小程序端则受限于平台策略:微信小程序仅支持通过 openContact 打开联系人界面,不返回数据;支付宝、QQ 小程序暂不开放读取能力。所谓“获取通讯录名单”,实际只能走原生扩展或用户主动授权选择。
App 端读取联系人必须用 native plugin(非 plus.contacts)
plus.contacts 是旧版 5+ SDK 接口,在当前 uni-app 3.x(基于 Vue 3 + nvue 或 vue 页面)中已失效,调用会报 undefined is not an object。正确路径是:
- 使用 DCloud 官方提供的
uni-contact插件(需在 插件市场 下载并配置) - 或自行封装原生 Android/iOS 模块(Android 需动态申请
READ_CONTACTS权限,iOS 需在Info.plist添加NSContactsUsageDescription) - 调用时必须先检查权限:
uni.getSystemInfoSync().platform === 'app'再执行,否则 H5 或小程序会静默失败
示例(使用 uni-contact 插件):
const contact = uni.requireNativePlugin('uni-contact');
contact.getContacts({
fields: ['name', 'mobile']
}, res => {
if (res.code === 0) {
console.log('联系人列表', res.data);
} else {
console.warn('读取失败', res.msg);
}
});
微信小程序里“选联系人”是唯一合规方式
微信明确禁止自动读取通讯录,但允许用户点击后调起系统选择器——这属于用户主动行为,符合隐私规范。对应 API 是 wx.chooseContact,uni-app 中需用条件编译:
// #ifdef MP-WEIXIN
uni.chooseContact({
success: res => {
console.log('选中的联系人', res);
// res 包含 name、mobilePhoneNumber(需用户授权且非加密)
}
});
// #endif
注意:mobilePhoneNumber 在 iOS 上可能为空,Android 需用户开启“读取手机号”授权;若用户取消或拒绝,fail 回调不会抛错,而是返回 { errMsg: 'chooseContact:fail cancel' },需主动判断。
常见错误:把 H5 伪实现当真实读取
有人用 input[type="tel"] + 通讯录导入按钮模拟“读取”,或依赖用户手动粘贴——这不是获取联系人,只是 UI 诱导。还有人误用 uni.getProvider 查 contact,但该接口只返回是否支持某服务(如分享、支付),与通讯录无关。
真正需要批量导入场景(如企业 OA),应引导用户导出 vCard 文件上传,或对接企业微信/钉钉 SDK 的通讯录同步能力,而非执着于“本地读取”。
权限、平台限制、用户授权链路断点,这三个地方漏掉任何一个,都会让“读联系人”变成不可用功能。别跳过 uni.authorize 的显式调用,也别在未判断平台时直接调原生插件。











