在Swift中使用CoreNFC构建NFC扫描仪应用

近场通信(NFC)是一种技术,它可以在一定距离(通常约4厘米)内的两个设备之间实现非接触式通信。

如今,NFC已用于非接触式支付系统,电子身份证,电子票证中,并用于共享信息,例如联系人,照片,视频或URL。 可以用于使用NFC读取信息的此类标签或卡称为NFC标签。

根据维基百科,在完整的NFC设备中可以执行3种通信模式:

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

NFC读/写器
使启用NFC的设备能够读取存储在标签或智能海报中嵌入的廉价NFC标签上的信息。

NFC对等
使两个启用NFC的设备相互通信,以特定方式交换信息。

iOS中NFC的当前状态

iOS中的NFC始于2014年的Apple Pay发行。iPhone7和iPhone 7 Plus是第一批内置NFC硬件的设备,可用于使用Apple Pay执行非接触式支付。 但是,除了Apple Pay功能之外,Apple没有提供任何API供第三方开发人员使用NFC功能。

苹果最终在iOS 11中引入了CoreNFC框架,该框架使第三方开发人员能够在其应用程序中读取NFC标签。 当应用程序在前台运行时,该API仅支持读取NFC标签。

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

截至目前,CoreNFC还无法写入NFC标签。 我真的希望iOS 13将为第三方应用程序提供写入标签的功能,因为执行写入所需的硬件已经存在。

我们将建立什么

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

  1. 该应用程序将扫描NFC标签并获取关联的URL,以检索产品SKU ID;
  2. 然后,该应用会使用特定的SKU ID搜索其本地数据存储;
  3. 如果找到,该应用程序将显示产品的详细信息,例如名称,图像,描述,价格和可用性;
  4. 使用Apple Universal Link和Firebase托管无需运行应用程序即可扫描NFC标签。

开始项目

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

alfianlosari / NFCScanneriOSStarter
NFC产品扫描仪iOS演示应用程序的入门项目– alfianlosari / NFCScanneriOSStarter github.com

入门项目包含所有自定义表格视图单元格,将在应用程序UI中使用的资产以及Product模型。

产品型号和本地数据存储

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

 结构产品{ 

let id:字符串
命名:字符串
让描述:字符串
售价:字符串
让库存:布尔
让图像:UIImage?
}

接下来,让我们创建ProductStore类。 这是一个Singleton对象,用于将硬编码产品数组存储在内存中。 它提供了接口来获取具有给定SKU ID的关联产品。 如果需要,您可以使用Core Data,SQLite甚至从网络检索产品,将产品存储在本地存储中。

主屏幕仅包含单个UILabelUIButton ,供用户点击并开始NFC扫描会话。 主屏幕的所有代码都编写在MainViewController 。 稍后,我们将在scanTapped:方法内添加处理程序以开始扫描会话。

产品详细信息屏幕UI

产品详细信息屏幕是UITableViewController的子类。 它将使用从呈现视图控制器传递的产品填充行。 屏幕显示产品的名称,图像,描述和可用性。 该代码包含在ProductViewController类中。

准备具有相关SKU ID的NFC标签

要执行此步骤,您需要购买可用于写入的NFC标签。 要将数据写入标签,可以使用具有NFC功能的Android手机。 您可以使用Google Play商店中的各种应用将SKU ID写入标签。 这是我使用的应用程序的链接:

NFC工具– Google Play上的应用
NFC工具是一款应用程序,可让您读取,写入和编程NFC标签和其他RFID兼容芯片上的任务… play.google.com

您需要以以下格式编写SKU:

  https://example.com/$SKU_ID 

该应用程序将读取包含URI格式的有效负载的标签。 然后,它将获取URI的最后路径。 在这种情况下,最后一个路径将是产品的SKU ID。 使用上述产品之一的SKU ID作为测试。

使用Core NFC API开始扫描会话

让我们开始编写实际的代码以开始NFC扫描会话。 使用SDK,您会惊讶于在iOS应用中实现NFC如此简单。 这是示例代码:

使用Apple Universal Link实施后台NFC扫描

要实施后台NFC扫描,您需要具有一个托管AASA (apple-app-site-association)文件的有效URL域。 该文件将用于将您的网站域与该应用程序关联。 该文件将包含应用程序的Bundle ID和允许应用程序访问的路径。

这是文件的格式,它使用JSON结构。 请记住将以下appID替换为Bundle ID 。 前缀JFGXEWXTeam ID 。 为了进行测试,我们只允许该应用使用通配符“ *”访问所有路径。

  { 
“应用链接”:{
“应用”: [],
“细节”: [
{
“ appID”:“ JFGXEWX.com.alfianlosari.NFCProductScanner”,
“路径”:[
“ *”
]
}
]
}
}

下一步是通过将文件上传到服务器来将文件托管在您的域中。 将文件放在https://<>/apple-app-site-associationhttps://<>/.well-known/apple-app-site-association https://<>/apple-app-site-association 。 确保您的域支持https并且您上传的文件没有json扩展名。 您可以使用免费的域托管服务(如Firebase托管,GitHub托管)或许多其他免费选项来托管文件。

最后一步是在项目的“ Xcode功能”选项卡中添加关联的域。

关联域的格式为applinks:YOUR_DOMAIN

在App委托中处理NFC的后台读取

您可以使用NFC标签测试背景扫描。 确保已将URL的格式写为https://YOUR_DOMAIN/SKU_ID

在主屏幕中,点击NFC标签,它会显示一个可以点击的通知横幅。 系统将使用我们之前设置的Apple Universal Link将其自动重定向到您的应用程序。

该应用程序将仅显示主用户界面,而不执行任何操作。 为了让应用程序能够从后台扫描中正确响应,我们需要重写AppDelegatecontinueUserActivity方法:

结论

恭喜你! 我们终于完成了NFC产品扫描仪iOS应用的构建。 当您想轻松地通信和传递数据时,此技术非常有用。 对于商业业务,支付系统以及许多其他行业很有用。 希望苹果公司在今年晚些时候增加在iOS 13中写入NFC标签的功能。 雨后春笋😋!

这是GitHub存储库上项目的完整源代码。

alfianlosari / CoreNFCScanneriOS
使用Core NFC扫描产品SKU的演示。 通过创建一个 github.com 来为alfianlosari / CoreNFCScanneriOS开发做出贡献