原稿:Building a NFC Scanner App with CoreNFC in Swift
原文:使用CoreNFC和Swift构建NFC扫描器


近场通信(NFC)是在一定距离(通常约4厘米)内实现两个设备之间无接触通信的技术。
如今,NFC正被用于非接触式支付系统、电子身份证、电子票证,以及共享联系人、照片、视频或网址等信息。这种标签或卡片可以使用NFC用来阅读信息,被称为NFC标签。

根据维基百科描述,有三种通信模式可以在全NFC设备中执行:

  • NFC卡仿真(NFC card emulation)
    使支持NFC的设备(如智能手机)像智能卡一样工作,允许用户执行支付或票务等交易。

  • NFC读写器(NFC reader/writer)
    使支持NFC的设备能够读取嵌入标签或智能海报中的廉价NFC标签上存储的信息。

  • NFC点对点(NFC peer-to-peer)
    使两个支持NFC的设备能够相互通信,以临时方式交换信息。

iOS中NFC的现状

NFC是苹果公司在2014年发布苹果支付时接入iOS系统的。iPhone 6s和iPhone 6s Plus是第一款内置NFC硬件的设备,可以使用苹果支付进行无接触支付。然而,苹果没有为第三方开发者提供任何应用编程接口来使用苹果支付功能之外的NFC功能。

iOS 11中,苹果最终引入了CoreNFC框架,使第三方开发者能够在他们的应用程序中读取NFC标签。该应用程序接口仅支持在前台运行时读取NFC标签。

iOS 12中,随着苹果新苹果手机Xr、Xs、Xs、Max的发布,苹果最终引入了扫描NFC标签的功能,而无需使用这些设备运行应用程序。它还使用苹果Universal Link机制处理将扫描重定向到相关应用程序。

到目前为止,CoreNFC还没有能力写入NFC标签。我真的希望iOS 13能够为第三方应用程序提供写标签的能力,因为执行写操作所需的硬件已经存在。

接下来

在本教程中,我们将构建一个充当产品扫描仪的简单应用程序。该应用程序的主要功能如下:

  • 该应用程序将扫描NFC标签,并获取相关联的网址,以检索产品SKU身份证;
  • 然后,应用程序用特定的SKU身份证搜索其本地数据存储;
  • 如果找到,应用程序将显示产品的详细信息,如名称、图像、描述、价格和可用性;
  • 使用苹果Universal LinkFirebase Hosting扫描NFC标签,而不运行该应用程序。

开始编码

您可以从下面的GitHub存储库中克隆初始项目源代码:

起始项目包含所有自定义表格视图单元格和将在UI中使用的资产以及产品model。

产品模型和本地数据存储

我们使用一个具有几个属性的产品模型来表示一个产品。请记住,产品的id是每个产品的唯一标识符,商店将使用它来查找产品。

1
2
3
4
5
6
7
8
struct Product {
let id: String
let name: String
let description: String
let price: String
let inStock: Bool
let image: UIImage?
}

接下来,让我们创建ProductStore类。这是一个单例对象,它将硬编码产品数组并存储在内存中。它提供了获取指定SKU标识产品的接口。如果需要,您可以使用Core Data、SQLite将产品存储在本地存储中,甚至从网络拉取数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct ProductStore {
static let shared = ProductStore()
private init() {}

func product(withID id: String) -> Product? {
return products.first { $0.id.lowercased() == id.lowercased() }
}

let products = [
Product(id: "SKU-RES2-982019", name: "RESIDENT EVIL 2", description: """
The action centers around rookie cop Leon Kennedy and college student Claire Redfield as they fight to survive a mysterious viral outbreak within Raccoon City.
""", price: "$60.00", inStock: true, image: UIImage(named: "res2")),
Product(id: "SKU-KH3-0119", name: "KINGDOM HEARTS 3", description: """
KINGDOM HEARTS III tells the story of the power of friendship as Sora and his friends embark on a perilous adventure.
""", price: "$60.00", inStock: true, image: UIImage(named: "kh3")),
Product(id: "SKU-IPXSM-2018", name: "iPhone Xs Max", description: """
The smartest, most powerful chip in a smartphone. And a breakthrough dual-camera system.
""", price: "$999.00", inStock: false, image: UIImage(named: "xsmax"))
]
}

主界面

主屏幕仅包含一个UILabelUIButton用于点击并开始NFC扫描会话。主屏幕的所有代码都写在MainViewController中。稍后,我们将在scanTapped:方法中添加代码来处理扫描会话。