Swift:初探NFC
NFC(近場通訊)在生活中有很多使用場景,最常見的就是支付,除了剛開始的Apple Pay,到現在的交通卡,一些智慧門鎖等,都是利用了NFC的技術,可以說NFC的應用極大地提高了生活效率。但是iPhone上的NFC開放給開發者使用的時間稍晚了一點,僅在iPhone 7及其以上的機型並且iOS+11/">iOS 11及其以上的系統開發者才有許可權使用NFC,而且目前也只是初步的開放,僅支援NFC Tags(標籤)的讀取。好了,話不多說,進入正題。
這個NFC應用大致原理是掃描含有NFC晶片的卡片,在iPhone的螢幕上,能顯示觀眾隨機抽取的卡片對應的圖片。自己在開發過程中也是遇到了一些坑,網上的相關資料也不是很多,在此分享一下心得。
首先需要像推送一樣開啟Capabilities裡面的NFC開關,然後在plist檔案裡新增使用許可權說明,在使用NFC時需要匯入NFC框架,同時遵守 NFCNDEFReaderSessionDelegate:
import CoreNFC class ShowViewController: UIViewController, NFCNDEFReaderSessionDelegate
定義一個NFC會話Session的變數:
var nfcSession: NFCNDEFReaderSession?
在viewDidLoad()方法裡初始化這個變數並開啟會話:
/// invalidateAfterFirstRead 屬性表示是否需要識別多個NFC標籤,如果是true,則會話會在第一次識別成功後終止; /// 不過有一種例外情況,就是如果響應了協議中失敗的方法,不管是true還是false,會話都會被終止 nfcSession = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false) nfcSession?.begin()
最後實現協議方法,協議方法有兩個,一個是成功,一個是失敗:
/// 讀取失敗 func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {} /// 讀取成功 func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {}
在成功回撥方法裡面,有一個引數message,這個引數是一個數組,數組裡的物件是NFCNDEFMessage型別,這個型別有一個屬性是records,這個屬性也是一個數組,但是裡面的物件是NFCNDEFPayload型別,掃描晶片的內容就在這裡,所以這裡遍歷取出掃描的內容:
for myPayload:NFCNDEFPayload in (messages.first?.records)! { let data = myPayload.payload imageName = String(data: data, encoding: .utf8) ///此處省略邏輯程式碼 } session.invalidate()
注意:exclamation:️:exclamation:️:exclamation:️
1、這裡的payload是Data型別,如果需要字串等其他型別,要進行相應的轉換。
2、關於卡片讀取,這裡的卡片一定要支援NDEF格式
3、會話可以讀取一個或多個標籤,在讀取單個標籤的時候,讀取完成後會話自動終止。如果讀取多個標籤,會話會一直持續直到程式主動終止會話或者60秒後(60秒是一個最大的節點)。