iOS NFC后台读取未被应用捕获问题排查咨询
调试iOS NFC后台读取时通用链接跳转到Safari的问题
看起来你遇到的问题和那个Stack Exchange帖子里的情况一致——NFC后台扫描后只唤起Safari而不是你的APP,核心原因大概率是通用链接(Universal Link)的匹配逻辑没生效,或者NFC标签的URL配置有问题。下面是一套一步步的调试方案,帮你定位问题:
一、先确认通用链接本身是否正常工作
NFC后台读取完全依赖通用链接的匹配,所以先把这个基础问题排除:
- 测试通用链接的基础跳转:打开Safari,输入你NFC标签里的完整URL(比如
https://www.example.com/nfc/tag),长按这个链接,如果看不到「在[你的APP名称]中打开」的选项,说明通用链接本身的配置就有问题,和NFC无关。 - 校验
apple-app-site-association文件:- 确保文件放在
https://www.example.com/.well-known/目录下,文件名就是apple-app-site-association(不能加.json后缀) - 文件内容要准确对应你的APP信息,比如:
{ "applinks": { "apps": [], "details": [ { "appID": "你的TeamID.你的BundleID", "paths": ["*", "/nfc/*"] // 根据你NFC标签的URL路径调整 } ] } } - 用苹果开发者网站的App Search验证工具检查这个文件是否合法,确保没有格式错误或信息不匹配。
- 确保文件放在
- 核对APP的关联域名配置:
打开Xcode的Signing & Capabilities面板,确认Associated Domains里确实添加了applinks:www.example.com,TeamID和BundleID必须和apple-app-site-association里的完全一致,不能有拼写错误。
二、针对NFC后台读取的特定排查
通用链接没问题的话,再聚焦NFC的配置:
- 检查NFC标签的NDEF数据:
确保标签里的NDEF记录是URL类型,并且URL完全匹配你通用链接配置的路径(比如不能多一个斜杠、大小写错误,或者额外的未配置参数)。之前那个用户就是调整了URL的格式才解决问题,所以仔细核对标签URL和你配置的路径是否完全契合。 - 确认后台NFC的权限配置:
Info.plist里必须添加NFCReaderUsageDescription,填写用户能理解的权限说明文案;Signing & Capabilities里要开启Near Field Communication Tag Reading权限;- 后台读取需要开启
Background Modes里的NFC Tag Reading,对应Info.plist的UIBackgroundModes数组要包含nfc-tag-reading。
- 先测试前台NFC读取:
在APP前台状态下扫描NFC标签,确认能正确识别URL并跳转到APP内的对应页面。如果前台都无法正常跳转,那后台肯定也不行,先解决前台的问题再看后台。
三、检查“URL捕获”功能是否正常的实用方法
- 用Xcode控制台看日志:
把设备连接到Xcode,打开Window > Devices and Simulators,选中你的设备后点击Open Console,过滤关键词swcd(负责通用链接的系统进程)、nfc或者你的APP Bundle ID。扫描标签时,日志会告诉你系统是否找到了匹配的APP:- 如果看到
No matching app found for URL,说明通用链接没匹配上; - 如果看到
Redirecting to app但APP没打开,可能是APP的后台状态有问题。
- 如果看到
- 用
swcutil命令行工具检查缓存:
在Mac终端运行swcutil show,可以查看设备上缓存的通用链接配置,找到你的APP对应的条目,确认applinks:www.example.com已经被正确缓存。如果没找到,运行swcutil reset重置缓存,然后重新打开APP触发配置更新。 - 检查通知的跳转选项:
扫描NFC后出现通知时,不要直接点击,长按通知查看是否有「在[你的APP名称]中打开」的选项:- 如果有,说明系统已经识别到通用链接,但默认跳转被设为了Safari;
- 如果没有,说明通用链接完全没匹配上。
四、容易踩的坑
- URL大小写敏感:通用链接的路径是大小写敏感的,标签里的URL和配置里的路径必须完全一致;
- HTTPS证书问题:
apple-app-site-association文件必须通过合法的HTTPS访问,自签名证书在非测试设备上会失效; - 签名配置问题:测试设备上的APP必须用包含关联域名权限的Provisioning Profile签名,否则配置不会生效。
内容的提问来源于stack exchange,提问作者sk2212




