🔢

【iOS-Tips】Core NFCでNFCタグのシリアルナンバーを取得する

2024/04/13に公開

Core NFCを使用してNFCタグのシリアルナンバーを取得する方法についてのメモです。

NFCタグのスキャンを実施

NFCタグのスキャンはNFCTagReaderSession を使用します。NFCタグのシリアルナンバーを取得する時は、NDEFメッセージの読み書きを行う時でも、NFCNDEFReaderSession ではなく、NFCTagReaderSession を使用するのがポイントです。

シリアルナンバーを取得する

NFCISO7816TagNFCISO15693TagNFCMiFareTag オブジェクトが持つidentifier でNFCタグのシリアルナンバーを取得することができます。

続けてNFCタグの読み書きを行う時

Core NFCを使用してNFCタグにデータを読み書きする方法は、ネイティブでNFCタグにアクセスしてデータの読み書きを行う方法と、NDEFフォーマットを使用してデータの読み書きを行う方法があります。

ネイティブアクセス

取得したNFCISO7816TagNFCISO15693TagNFCMiFareTag オブジェクトが持つ、読み書きを行うためのメソッドを使用します。
例えば、NFCMiFareTag オブジェクトはsendMiFareCommand(commandPacket:completionHandler:) でデータの読み書きを行います。

NDEFフォーマット

NFCISO7816TagNFCISO15693TagNFCMiFareTag オブジェクトを、NFCNDEFTag オブジェクトへアップキャストします。

NFCMiFareTag プロトコルのソースを見てみると、NFCNDEFTag プロトコルを継承していることがわかります。

このことからNFCMiFareTag オブジェクトは、NFCNDEFTag オブジェクトへアップキャスト可能であることがわかります。

NFCNDEFTag オブジェクトを生成した後は、writeNDEF(_:completionHandler:)readNDEF(completionHandler:) でNDEFメッセージの読み書きを行うことができます。
NDEFメッセージの読み書きについては、以下の記事をご参照ください。
https://zenn.dev/naoya_maeda/articles/927aaf68dac33d
https://zenn.dev/naoya_maeda/articles/f2892d3165e2c1

当初、NFCTagReaderSession でNFCタグをスキャンして、シリアルナンバーを取得した後に、NFCNDEFReaderSession でNFCタグを再スキャンして、NDEFメッセージのやり取りを行っていました。

StackoverFlowでは別の方法が紹介されていました。こちらで紹介されていた方法は、リジェクトリスクが高いかつ煩雑な実装でした。
https://stackoverflow.com/questions/58407833/ios-getting-both-nfctag-hardware-id-and-ndef-message-in-one-reading-session

そんなことをする必要はなく、NFCISO7816TagNFCISO15693TagNFCMiFareTag オブジェクトを、NFCNDEFTag オブジェクトへアップキャストしてやればNFCタグのスキャンは一度で済ませることができます。

参考資料

・NFCISO7816Tag
https://developer.apple.com/documentation/corenfc/nfciso7816tag
・NFCISO15693Tag
https://developer.apple.com/documentation/corenfc/nfciso15693tag
・NFCMiFareTag
https://developer.apple.com/documentation/corenfc/nfcmifaretag
・identifier
https://developer.apple.com/documentation/corenfc/nfcmifaretag/3183038-identifier

Discussion