在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将为第三方应用程序提供写入标签的功能,因为执行写入所需的硬件已经存在。
我们将建立什么
在本教程中,我们将构建一个充当产品扫描程序的简单应用程序。 这是该应用程序的主要功能:
- 该应用程序将扫描NFC标签并获取关联的URL,以检索产品SKU ID;
- 然后,该应用会使用特定的SKU ID搜索其本地数据存储;
- 如果找到,该应用程序将显示产品的详细信息,例如名称,图像,描述,价格和可用性;
- 使用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甚至从网络检索产品,将产品存储在本地存储中。
主屏幕仅包含单个UILabel
和UIButton
,供用户点击并开始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
。 前缀JFGXEWX
是Team ID
。 为了进行测试,我们只允许该应用使用通配符“ *”访问所有路径。
{
“应用链接”:{
“应用”: [],
“细节”: [
{
“ appID”:“ JFGXEWX.com.alfianlosari.NFCProductScanner”,
“路径”:[
“ *”
]
}
]
}
}
下一步是通过将文件上传到服务器来将文件托管在您的域中。 将文件放在https://<>/apple-app-site-association
或https://<>/.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将其自动重定向到您的应用程序。
该应用程序将仅显示主用户界面,而不执行任何操作。 为了让应用程序能够从后台扫描中正确响应,我们需要重写AppDelegate
的continueUserActivity
方法:
结论
恭喜你! 我们终于完成了NFC产品扫描仪iOS应用的构建。 当您想轻松地通信和传递数据时,此技术非常有用。 对于商业业务,支付系统以及许多其他行业很有用。 希望苹果公司在今年晚些时候增加在iOS 13中写入NFC标签的功能。 雨后春笋😋!
这是GitHub存储库上项目的完整源代码。
alfianlosari / CoreNFCScanneriOS
使用Core NFC扫描产品SKU的演示。 通过创建一个 github.com 来为alfianlosari / CoreNFCScanneriOS开发做出贡献