北京时间2017.6.6日凌晨1点,新一届的WWDC召开,苹果在大会上发布了iOS11的beta版,虽然正式版还有一段时间才会推送,不过其中有项功能引起我的注意,即苹果官方开放了NFC的部分开发接口。虽然从iphone6开始苹果手机就已经有NFC硬件了,但是开发接口一直没有开放,苹果官方的Apple Pay应用则使用了NFC功能。现在看来苹果在iOS11将NFC接口对开发者开放了,虽然从文档开来目前只开放了NFC读数据而没有开放NFC写数据的接口,但是这也算是一个好的开始了。
苹果将这个库称为Core NFC:苹果官方文档地址
Core NFC
用于检测NFC(近场通讯) 标签和读取包含NDEF数据的信息。
SDK要求iOS 11.0+
概述
你的app可以通过NFC读取标签,从而给予用户提供更多有关其物理环境和真实世界的对象内容信息。比如:你的app可能可以给用户提供商店里的商品信息或者是他们在博物馆参观时的陈列品的信息。
注意
目前只有iPhone 7 and iPhone 7 Plus支持读取NFC NDEF标签
使用Core NFC,你可以读取到包含NDEF (NFC数据交换格式)格式数据的1到5类型的NFC 标签。你的app可以通过创建一个NFC NDEF reader session对象同时提供一个delegate代理来读取标签。当一个正在运行的reader session对象发现了一个包含NDEF信息的标签后,就会将这个信息传递给它的delegate代理。这个delegate代理除了能读取消息还能处理session变为无效的情况。
要使你的app能检测NFC标签,请查阅Certificates, Identifiers, and Profiles
Core NFC
Core NFC包含以下内容
Reader Sessions
Class NFCNDEFReaderSession
用于检测NFC NDEF标签的reader session类
Protocol NFCNDEFReaderSessionDelegate
此delegate为包含了关于reader session的状态消息和发现标签时有关NDEF消息回调方法的集合
Protocol NFCReaderSessionProtocol
定义了与reader session交互的通用接口
Protocol NFCReaderSessionDelegate
此delegate为包含了提供关于NFC reader状态的消息 回调方法的集合
Class NFCReaderSession
用于描述一个用来检测NFC标签的reader session的抽象类
NFC Tags
Protocol NFCTags
定义了NFC或RFID(Radio Frequency Identification,射频识别)标签的属性
Class NFCTagCommandConfiguration
此类提供了一组的参数可以让你用来配置NFC标签命令
NDEF Messages
Class NFCNDEFMessage
NFC NDEF消息类,由一组payload记录组成
Class NFCNDEFPayload
此类表示在NFC NDEF消息里的一个payload记录
Enum NFCTypeNameFormat
NFC类型名称格式枚举,它是NFC NDEF消息payload的一部分
Error
struct NFCReaderError
小结
从文档看来只有最纯粹的读没有写,即全傻瓜式的检测。
总结来说使用方法就是创建一个NFCNDEFReaderSession对象,然后让你的比如说控制器VC成为他的delgate代理,实现代理方法之后就等待系统检测到了nfc消息回调
最重要的一个代理回调方法就是检测到NDEF消息:func readerSession(NFCNDEFReaderSession, didDetectNDEFs: [NFCNDEFMessage])
消息内容NDEFs:[NFCNDEFMessage] 是个NFCNDEFMessage对象的数组
NFCNDEFMessage类只有一个属性records : [NFCNDEFPayload],records又是存放NFCNDEFPayload对象的数组
也就是真正存放数据的就是NFCNDEFPayload对象
NFCNDEFPayload对象有四个属性var identifier: Data,var payload: Data,var type: Data,var typeNameFormat: NFCTypeNameFormat
可以看到payload就是真正的数据内容,类型是二进制Data格式,所以具体读出来是什么样的数据只有测试过才知道
示例代码
由于当前我还没有iphone7或者iphone7s,所以无法真实的使用CoreNFC,等迟些使用之后再来做更多的使用方法和经验分享。