原文鏈接: http://fighting300.com...
大家可能聽過NFC這項功能,或者有可能你每天都在使用這個功能,比如當你在進出地鐵時閘機掃描地鐵卡就用到了NFC技術(shù)瘩欺。
簡單來說NFC就是可以讓智能手機的NFC模塊结胀,可以像讀卡器一般,讀取電子標簽的相關(guān)信息普监,實現(xiàn)NFC手機之間的數(shù)據(jù)交互或是讀取其他IC卡內(nèi)的數(shù)據(jù)贵试。NFC(機場通訊),其實由非接觸式射頻識別(RFID)演變而來凯正,是一種短距高頻的無線電技術(shù)毙玻,在13.56MHz頻率運行于20厘米距離內(nèi)。它的傳輸速度有106 Kbit/秒廊散、212 Kbit/秒或者424 Kbit/秒三種桑滩。目前NFC已通過成為ISO/IEC IS 18092國際標準、ECMA-340標準與ETSI TS 102 190標準允睹。
Core NFC介紹
或者你可能還吐槽過Apple怎么還不支持NFC呢运准,其實iPhone6已經(jīng)有NFC硬件了,已支持Apple Pay支付系統(tǒng)缭受,只是接口沒開放胁澳,終于在今年的WWDC,蘋果在iOS11系統(tǒng)上對開發(fā)者開放了NFC接口框架Core NFC米者,雖然目前權(quán)限只有只讀模式韭畸。
Apple的Core NFC可以用于檢測NFC(近場通訊)標簽和讀取包含NDEF(NFC Data Exchange Format)數(shù)據(jù)1到5類型的標簽信息宇智,只是該功能只支持iPhone 7和iPhone 7P及以上的機型。目前Core NFC其實同時有NFC和RFID的API存在胰丁,但是RFID可能沒有很高的安全性随橘,所以蘋果沒有推廣使用(或者還在開發(fā)中)。
NFC Data Exchange Format : NFC數(shù)據(jù)交換格式隘马,NFC組織約定的NFC tag中的數(shù)據(jù)格式太防。NDEF是輕量級的緊湊的二進制格式,可帶有URL酸员、vCard和NFC定義的各種數(shù)據(jù)類型蜒车。NDEF的由各種數(shù)據(jù)記錄組成,而各個記錄由報頭(Header)和有效載荷(Payload)組成幔嗦,其中NDEF記錄的數(shù)據(jù)類型和大小由記錄載荷的報頭注明酿愧,這里的報頭包含3部分,分別為Length邀泉、Type和Identifier嬉挡。
iOS集成開發(fā)
項目配置
首先需要讓你的AppID添加對NFC的支持,選中NFC Tag Reading后更新Provisioning Profiles即可汇恤。
其次在項目中打開Targets->Capabilities下的Near Field Communication Tag Reading選項庞钢,Xcode會自動幫你創(chuàng)建NFC entitlement文件。然后你需要在entitlements文件下添加如下內(nèi)容(該內(nèi)容新版Xcode已經(jīng)自動添加并配置完成):
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>
隨后需要在info.plist中添加隱私標簽Privacy - NFC Scan Usage Description
因谎。
<key>NFCReaderUsageDescription</key>
<string>NFC Import</string>
集成Core NFC
集成Core NFC需要用到NFCNDEFReaderSession
類基括,其為NFCReaderSession的子類,但是基類不能實例化财岔。
和iOS的其他Session一樣通過其協(xié)議NFCReaderSessionProtocol
方法來處理信息回調(diào)的結(jié)果风皿。這最重要的一個代理回調(diào)是func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages:[NFCNDEFMessage])
方法,用以處理檢測到的NDEF消息匠璧,messages是一個NFCNDEFMessage的數(shù)組桐款,其有一個records數(shù)組,包含NFCNDEFPayload對象夷恍,該對象存放了真正的數(shù)據(jù)內(nèi)容魔眨。
import CoreNFC
class MessagesTableViewController: UITableViewController, NFCNDEFReaderSessionDelegate {
// MARK: NFCNDEReaderSessionDelegate
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
// Check invalidation reason from the returned error. Session will be invalidated after the function returns. New session instance is required to restart tag scanning.
}
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages:[NFCNDEFMessage]) {
// Process read NFCNDEFMessage objects.
for message in messages {
print(" - \(message.records.count) Records:")
for record in message.records {
print("\t- TNF (TypeNameFormat): \(record.typeNameFormat)")
print("\t- Payload: \(String(data: record.payload, encoding: .utf8)!)")
print("\t- Type: \(record.type)")
print("\t- Identifier: \(record.identifier)\n")
}
}
}
// MARK: - Actions
@IBAction func beginScanning(_ sender: Any) {
let session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidatedAfterFirstRead:true)
session.alertMessage = "You can scan NFC-tags by holding them behind the top of your iPhone."
session.begin()
}
NFCReaderSession
還有NFCISO15693ReaderSession
的子類,用于RFID的讀取處理裁厅,其使用流程和NFCNDEFReaderSession
基本一致冰沙,只是代理方法不同,ISO15693是一種特殊的RFID標簽执虹,它擁有自己的協(xié)議和數(shù)據(jù)API(NFCISO15693Tag)拓挥。但是該類不起作用。袋励。侥啤〉卑龋可能Apple工程師還在開發(fā)中吧
Tips
- 注意同時只能實例化一個讀取session(系統(tǒng)會把其他的session放在隊列里序列化執(zhí)行)
- Core NFC目前只支持前臺掃描,切換到后臺會失效
- NFCNDEFReaderSession最大每次掃描60s盖灸,超時需要重啟
- 可以配置單一Tag或者多Tag讀取模式
- 使用提示信息即alertMessage會顯示在當前APP的彈出浮層中
獲取成功后蚁鳖,即可以根據(jù)獲取到的信息進行之后的業(yè)務(wù)流程了。
[相關(guān)代碼地址]:https://github.com/fighting300/iOS11-Example.git