【iOS-Tips】Core NFCでNFCタグのシリアルナンバーを取得する
Core NFCを使用してNFCタグのシリアルナンバーを取得する方法についてのメモです。
NFCタグのスキャンを実施
NFCタグのスキャンはNFCTagReaderSession を使用します。NFCタグのシリアルナンバーを取得する時は、NDEFメッセージの読み書きを行う時でも、NFCNDEFReaderSession ではなく、NFCTagReaderSession を使用するのがポイントです。
シリアルナンバーを取得する
NFCISO7816Tag 、NFCISO15693Tag 、NFCMiFareTag オブジェクトが持つidentifier でNFCタグのシリアルナンバーを取得することができます。
続けてNFCタグの読み書きを行う時
Core NFCを使用してNFCタグにデータを読み書きする方法は、ネイティブでNFCタグにアクセスしてデータの読み書きを行う方法と、NDEFフォーマットを使用してデータの読み書きを行う方法があります。
ネイティブアクセス
取得したNFCISO7816Tag 、NFCISO15693Tag 、NFCMiFareTag オブジェクトが持つ、読み書きを行うためのメソッドを使用します。
例えば、NFCMiFareTag オブジェクトはsendMiFareCommand(commandPacket:completionHandler:) でデータの読み書きを行います。
NDEFフォーマット
NFCISO7816Tag 、NFCISO15693Tag 、NFCMiFareTag オブジェクトを、NFCNDEFTag オブジェクトへアップキャストします。
NFCMiFareTag プロトコルのソースを見てみると、NFCNDEFTag プロトコルを継承していることがわかります。
このことからNFCMiFareTag オブジェクトは、NFCNDEFTag オブジェクトへアップキャスト可能であることがわかります。
NFCNDEFTag オブジェクトを生成した後は、writeNDEF(_:completionHandler:) やreadNDEF(completionHandler:) でNDEFメッセージの読み書きを行うことができます。
NDEFメッセージの読み書きについては、以下の記事をご参照ください。
当初、NFCTagReaderSession でNFCタグをスキャンして、シリアルナンバーを取得した後に、NFCNDEFReaderSession でNFCタグを再スキャンして、NDEFメッセージのやり取りを行っていました。
StackoverFlowでは別の方法が紹介されていました。こちらで紹介されていた方法は、リジェクトリスクが高いかつ煩雑な実装でした。
そんなことをする必要はなく、NFCISO7816Tag 、NFCISO15693Tag 、NFCMiFareTag オブジェクトを、NFCNDEFTag オブジェクトへアップキャストしてやればNFCタグのスキャンは一度で済ませることができます。
参考資料
・NFCISO7816Tag ・NFCISO15693Tag ・NFCMiFareTag ・identifier
Discussion