Xamarin.iOS 中的核心 NFC
使用 iOS 11 读取近场通信 (NFC) 标记
CoreNFC 是 iOS 11 中的一个新框架,它提供对近场通信 (NFC) 无线电的访问权限,用于读取应用中的标记。 CoreNFC 适用于 iPhone 7、iPhone 7 Plus、iPhone 8、iPhone 8 Plus、iPhone X、iPhone XS 和 iPhone 11 型号(虽然 iPhone 6 和 iPhone 6 Plus 型号具有 NFC 支付功能,但它们不支持 CoreNFC)。
iOS 设备中的 NFC 标记读取器支持包含 NFC 数据交换格式 (NDEF) 信息的所有 NFC 标记类型,从 1 到 5。
需要注意以下一些限制:
- CoreNFC 仅支持标记读取(不支持写入或格式化)。
- 标记扫描必须由用户发起,并在 60 秒后超时。
- 应用必须在前台可见才能进行扫描。
- CoreNFC 只能在实际设备上(而不是模拟器上)进行测试。
本页介绍使用 CoreNFC 所需的配置,并演示如何使用 API。
配置
若要启用 CoreNFC,必须在项目中配置三个项:
- Info.plist 隐私键。
- Entitlements.plist 条目。
- 具有 NFC 标记读取功能的预配配置文件。
Info.plist
添加 NFCReaderUsageDescription 隐私键和文本,在扫描发生时会向用户显示它。 使用适合你的应用程序的消息(例如,解释扫描的目的):
<key>NFCReaderUsageDescription</key>
<string>NFC tag to read NDEF messages into the application</string>
Entitlements.plist
应用必须使用 Entitlements.plist 中的以下键/值对请求近场通信标记读取功能:
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>
设置配置文件
创建新的应用 ID 并确保勾选 NFC 标记读取服务:
然后,应为此应用 ID 创建新的预配配置文件,然后在你的开发 Mac 上下载并安装它。
读取标记
配置完项目后,请将 using CoreNFC;
添加到文件顶部,并按照以下三个步骤实现 NFC 标记读取功能:
1.实现 INFCNdefReaderSessionDelegate
该接口有两个方法要实现:
DidDetect
– 成功读取标记时调用。DidInvalidate
– 发生错误或达到 60 秒超时时调用。
DidDetect
在示例代码中,每个扫描的消息都会添加到表视图中:
public void DidDetect(NFCNdefReaderSession session, NFCNdefMessage[] messages)
{
foreach (NFCNdefMessage msg in messages)
{ // adds the messages to a list view
DetectedMessages.Add(msg);
}
DispatchQueue.MainQueue.DispatchAsync(() =>
{
this.TableView.ReloadData();
});
}
如果会话允许多次读取标记,则可以多次调用此方法(可能会传入一个消息数组)。 这是使用 Start
方法的第三个参数设置的(如步骤 2 中所述)。
DidInvalidate
无效的出现有多个原因:
- 扫描时出错。
- 应用不再处于前台。
- 用户选择取消扫描。
- 扫描已由应用取消。
下面的代码演示如何处理错误:
public void DidInvalidate(NFCNdefReaderSession session, NSError error)
{
var readerError = (NFCReaderError)(long)error.Code;
if (readerError != NFCReaderError.ReaderSessionInvalidationErrorFirstNDEFTagRead &&
readerError != NFCReaderError.ReaderSessionInvalidationErrorUserCanceled)
{
// some error handling
}
}
会话失效后,必须创建一个新的会话对象才能再次扫描。
2.启动 NFCNdefReaderSession
扫描应从用户请求开始,例如按下按钮。 以下代码会创建并启动扫描会话:
Session = new NFCNdefReaderSession(this, null, true);
Session?.BeginSession();
NFCNdefReaderSession
构造函数的参数如下所示:
delegate
–INFCNdefReaderSessionDelegate
的实现。 在示例代码中,委托在表视图控制器中实现,因此this
用作委托参数。queue
– 处理回调的队列。 它可以是null
,在这种情况下,请确保在更新用户界面控件时使用DispatchQueue.MainQueue
(如示例中所示)。invalidateAfterFirstRead
–true
时,首次成功扫描后会停止扫描;false
时,扫描将继续,并返回多个结果,直到取消被扫描或达到 60 秒超时。
3.取消扫描会话
用户可以通过用户界面中系统提供的按钮取消扫描会话:
应用可以通过调用 InvalidateSession
方法以编程方式取消扫描:
Session.InvalidateSession();
在这两种情况下,都将调用委托的 DidInvalidate
方法。
总结
CoreNFC 使应用能够从 NFC 标记读取数据。 它支持读取各种标记格式(NDEF 类型 1 到 5),但不支持写入或格式化。