iOS 13のCore NFC
技術書同人誌博覧会というイベントで出そうかなと思っているiOS 13本の下書きというかメモ書き的なもの。なお、NDAに配慮し、ベータ版iOSやXcodeのスクリーンキャプチャは使用せず、Appleによる公開資料の範囲で記述する。
おさらい:Core NFCの基本的な実装方法
NFCを介してNDEF(NFC Data Exchange Format)というデータフォーマットを読み取るには、`.entitlements`ファイルに次の項目を追加する。
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>
CoreNFCをimportして、
import CoreNFC
NFCNDEFReaderSessionというのを初期化して、beginでセッションを開始すると、
let session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false)
session.begin()
例のハーフモーダルなNFCスキャン画面が立ち上がる。
ここで、次のようにNFCNDEFReaderSessionDelegateプロトコルに準拠した実装をしておけば、
extension ViewController: NFCNDEFReaderSessionDelegate {
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
// do something
}
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
// do something
}
}
NFCタグを読み取った際にNFCNDEFMessageオブジェクト(またはエラー)を受け取ることができる。
幻のNFCISO15693ReaderSession
iOS 11から`NFCISO15693ReaderSession`というクラスと`NFCReaderSessionDelegate`プロトコルは用意されていたが、`.entitlements`ファイルへの定義が存在しなかったため、実質的に利用不可だった。
iOS 12になってもこのクラスは使えないままだった。
〜iOS 12まで書き込み不可
また、書き込む機能も提供されていなかったので、読み取るためのNDEFデータをNFCタグに書き込むために、別途Android端末等が必要だった。
iOS 12になっても、書き込み機能は提供されず。
iOS 13での追加機能
iOS 13のCore NFCでは、多くのNFCタグを読めるようになった。
- ISO 7816
- ISO 14443
- ISO 15693
- FeliCa (= ISO 18092 ?)
(ちなみにiOS 11から存在はしていたが使えなかったクラスNFCISO15693ReaderSessionはdeprecatedになった)
またついに書き込み機能が提供されるようになった。
実装: Suica/PASMOを読む
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/