uni-app怎么获取手机通讯录并搜索 uni-app读取联系人方法【技巧】

星枫姑娘_9641

星枫姑娘_9641

2026-04-02

197人浏览

原创

uni.chooseContact是最稳的选人方式,仅返回用户手动选择的一个联系人;全量读取需用plus.contacts,但iOS与Android实现差异大,且需注意权限配置、字段兼容性及搜索需自行实现。

uni-app怎么获取手机通讯录并搜索 uni-app读取联系人方法【技巧】

uni.chooseContact 是最稳的“选人”方式,但不是“读全量通讯录”

想让用户点一下从系统通讯录里挑一个联系人?uni.chooseContact 是官方推荐、跨平台兼容性最好的方案。它不申请 READ_CONTACTS 权限,也不需要处理 iOS 的 CNContactStore 或 Android 的 ContactsContract,直接唤起原生选择器,返回姓名和电话(部分平台还带邮箱、头像)。

但它有明确边界:只返回用户手动点选的那一个联系人,无法拿到全部列表、不能搜索、不能分组、不能过滤。如果你要的是“通讯录通讯录管理”或“联系人搜索框”,这条路走不通。

  • 适用场景:邀请好友、快速填写收货人、一键拨号前确认联系人
  • 失败常见原因:scope.contact 未授权、iOS 未在 manifest.json 中配置 NSContactsUsageDescription、Android 12+ 未声明 READ_CONTACTS 权限(即使不用全量读取,部分厂商仍会校验)
  • 调用后返回对象结构简单:{ name: '张三', mobile: '138****1234' },注意 mobile 字段在 iOS 和某些安卓定制系统中可能为空,需 fallback 到 value 或遍历 phoneNumbers

全量读取必须用 plus.contacts,但 iOS 和 Android 写法完全不同

要真正“获取手机通讯录全部联系人并支持搜索”,必须绕过 uni.* 封装,直连 plus.contacts API。这不是 bug,是设计使然——uni-app 把跨平台抽象留给了上层业务,底层能力则暴露给原生扩展。

iOS 和 Android 在字段结构、权限粒度、甚至联系人来源(手机/SIM/账户)上差异极大,硬写成一套逻辑极易崩溃。

  • iOS 必须先调 plus.ios.requestAuthorization,传 plus.ios.AUTHORIZATION_CONTACTS;Android 则用 plus.android.requestPermissions(['android.permission.READ_CONTACTS'])
  • 字段获取不能写死:displayName 在 iOS 是字符串,在 Android 可能是数组;phoneNumbers 在 iOS 是 CNPhoneNumber 对象,Android 返回的是字符串数组,需用 .value 或正则清洗空格
  • 性能敏感:全量读取几百个联系人时,iOS 的 enumerateContactsWithFetchRequestErrorUsingBlock 是同步阻塞的,建议加 loading + 节流,避免白屏卡顿

manifest.json 权限配置漏一项,真机就静默失败

很多开发者在 HBuilderX 里勾选了“通讯录”权限,却忘了看生成的 manifest.json 底层配置,结果打包后 iOS 提示“无权限”,Android 直接回调 fail 且不报错——因为权限没真正注入到原生包里。

  • iOS 必须在 "app-plus".distribute.ios.privacyDescription 下写 "NSContactsUsageDescription",值不能为空字符串,否则 App Store 审核被拒
  • Android 不只要 "android.permission.READ_CONTACTS",还得加上 "android.permission.GET_ACCOUNTS"(尤其对华为、小米等机型,否则 plus.contacts.getAddressBook 返回 undefined)
  • 别信“H5 模式也能读通讯录”:浏览器受同源策略和安全限制,plus 对象在非 app 环境下为 undefined,必须走 app 端调试

搜索功能得自己实现,别指望原生接口支持关键词过滤

plus.contacts.find 或 findAll 只支持按字段名预取(如 ['displayName', 'phoneNumbers']),不接受 SQL 式 where 条件。所谓“搜索”,本质是把全量联系人 load 进内存,再用 JS 做模糊匹配。

这带来两个现实问题:一是首次加载慢(尤其联系人超 500 条),二是中文搜索易出错(拼音首字母、多音字、空格干扰)。

  • 建议预处理:在 onLoad 里一次性读取并缓存到 this.contacts,后续搜索直接 filter,避免重复 IO
  • 搜索逻辑别只用 includes:对 displayName 做 pinyin.get(…).slice(0, keyword.length) 匹配首字母,再 fallback 到全文 indexOf
  • SIM 卡联系人默认不包含在 ADDRESSBOOK_PHONE 中,要读 SIM 需显式调 plus.contacts.ADDRESSBOOK_SIM,且 Android 多数厂商已禁用该接口,iOS 根本不支持——别为这个需求投入开发时间

实际项目里,90% 的“通讯录搜索”需求,其实只需要 uni.chooseContact + 后端模糊查询补全。真要本地全量+搜索,就得接受 iOS/Android 两套逻辑、权限反复调试、以及用户对首次加载延迟的容忍。这些不是框架缺陷,而是移动操作系统对隐私的刚性约束。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2823

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

6163

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

7090

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6898

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

983

5

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

0

18

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

2026.11.03

0

11

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

2026.11.03

0

11

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

0

17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习