在iOS开发中,使用`NFCNDEFReaderSession`进行NFC标签读取时,除了在代码中正确初始化会话外,还需在Info.plist文件中配置相应的权限。常见的问题是:**如何正确配置NFC权限以确保应用能够正常启动NFCNDEFReaderSession?**
开发者常常忽略在Info.plist中添加`com.apple.developer.nfc.readersession.formats`这一关键权限声明,导致会话无法启动并抛出异常。此外,还需在Xcode的Signing & Capabilities中启用“Near Field Communication Tag Reading”功能。
因此,一个常见的技术问题是:“**为什么调用NFCNDEFReaderSession时会话无法启动,并提示‘This app has not been configured to use NFC’错误?**”
1条回答 默认 最新
Nek0K1ng 2025-07-10 02:40关注1. 问题背景与常见现象
在iOS开发中,使用
NFCNDEFReaderSession进行 NFC 标签读取是一项常见的功能需求。然而,很多开发者在集成该功能时遇到一个经典错误:This app has not been configured to use NFC
这个错误通常出现在调用
NFCNDEFReaderSession初始化会话时,系统检测到应用未正确配置 NFC 权限。尽管代码逻辑看似无误(如正确导入框架、实现委托方法等),但往往忽略了两个关键配置点:
- 在 Xcode 的 Signing & Capabilities 中启用“Near Field Communication Tag Reading”能力;
- 在 Info.plist 文件中添加必要的权限声明,尤其是
com.apple.developer.nfc.readersession.formats。
2. 配置步骤详解
2.1 启用 NFC 功能(Xcode Capabilities)
在 Xcode 中打开项目后,进入 “Signing & Capabilities” 页面,点击 “+ Capability”,选择 “Near Field Communication Tag Reading”。这一步会自动修改工程的 entitlements 文件并请求相关权限。
操作步骤 说明 1. 打开项目设置 选中目标 target,切换到 "Signing & Capabilities" 2. 添加 NFC 能力 点击 "+" 号 → 搜索 "Near Field Communication Tag Reading" → 添加 2.2 Info.plist 中添加 NFC 权限声明
即使启用了 NFC 能力,若未在 Info.plist 文件中声明支持的 NFC 数据格式,则仍然无法正常启动会话。
需要在 Info.plist 中添加以下键值对:
<key>com.apple.developer.nfc.readersession.formats</key> <array> <string>NDEF</string> <string>TAG</string> </array>- NDEF:表示支持读取 NDEF 格式的 NFC 标签;
- TAG:表示支持非 NDEF 格式的原始标签数据。
3. 异常分析与调试建议
3.1 错误信息解析
当出现如下错误提示时:
This app has not been configured to use NFC
这意味着系统检测到当前应用未满足 NFC 使用的条件。可能原因包括:
- Xcode Capabilities 中未启用 NFC Tag Reading 功能;
- Info.plist 中缺少
com.apple.developer.nfc.readersession.formats声明; - 设备不支持 NFC 或 iOS 版本过低(iOS 11 及以上才支持);
- Entitlements 文件未正确配置或签名失败。
3.2 排查流程图
```mermaid graph TD A[启动 NFCNDEFReaderSession] --> B{是否启用 NFC Capability?} B -- 是 --> C{Info.plist 是否包含 NFC 权限声明?} C -- 是 --> D[NFC 会话成功启动] C -- 否 --> E[抛出异常: This app has not been configured to use NFC] B -- 否 --> F[抛出异常: NFC 未授权] ```4. 完整示例代码与验证方式
4.1 示例代码片段
```swift import CoreNFC class NFCManager: NSObject, NFCNDEFReaderSessionDelegate { var session: NFCNDEFReaderSession? func startNFCSession() { guard NFCNDEFReaderSession.readingAvailable else { print("当前设备不支持 NFC") return } session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true) session?.begin() } func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) { print("NFC 会话结束: $error.localizedDescription)") } func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) { for message in messages { for record in message.records { print("读取到记录内容: $record.payload)") } } } } ```4.2 验证配置是否生效
- 运行应用前确保真机连接且支持 NFC;
- 尝试读取一张 NFC 标签,观察控制台输出;
- 如果仍报错,请检查 Xcode 的 build 日志是否有 entitlements 相关警告。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报