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 所需的配置,并演示如何使用 "NFCTagReader" 示例代码使用 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 标记读取服务:

Developer Portal New App ID page with NFC Tag Reading selected

然后,应为此应用 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 构造函数的参数如下所示:

  • delegateINFCNdefReaderSessionDelegate 的实现。 在示例代码中,委托在表视图控制器中实现,因此 this 用作委托参数。
  • queue – 处理回调的队列。 它可以是 null,在这种情况下,请确保在更新用户界面控件时使用 DispatchQueue.MainQueue(如示例中所示)。
  • invalidateAfterFirstReadtrue 时,首次成功扫描后会停止扫描;false 时,扫描将继续,并返回多个结果,直到取消被扫描或达到 60 秒超时。

3.取消扫描会话

用户可以通过用户界面中系统提供的按钮取消扫描会话:

Cancel button while scanning

应用可以通过调用 InvalidateSession 方法以编程方式取消扫描:

Session.InvalidateSession();

在这两种情况下,都将调用委托的 DidInvalidate 方法。

总结

CoreNFC 使应用能够从 NFC 标记读取数据。 它支持读取各种标记格式(NDEF 类型 1 到 5),但不支持写入或格式化。