Core NFCの整理記事(3)
前回の記事ではNFCタグをScanするまでの実装を整理しました。
今記事では実際に書き込んだり、書き込んだ文字列を読み取る実装の整理を行なっていきます。
検証で使用するタグは以下の通り。
・IOS 14443
・Ntag213
購入先
1. 文字列を書き込んでみる
Write an NDEF Messageで書き込むためのサンプルコードが掲載されていますのでここを見つつ理解をしていきます。
上から順にポイントを抽出して理解した部分を整理していきます。
if tags.count > 1
ここではタグを複数検知してしまった場合に意図しないタグへ書き込みを行わないようにタグが複数検知されればsession.alertMessageに文言を表示させています。またNFCタグを再度読み取りをスタートする実装もされており、再度読み取りを行うまでの遅延として500msが定義されています。
ただ複数のNFCタグを近くに置いて再現を試みましたがうまくいきませんでした。(複数重ねたりして検証しましたが重ねているいずれかのタグを読み込んだり書き込んだりしました)
session.connect(to: tag, completionHandler: { (error: Error?) in
ここではNFCタグtagに接続を試みています。
このメソッドは非同期に動作するため、接続が完了した時点でcompletionHandlerが呼ばれます。
tag.queryNDEFStatus(completionHandler: { (ndefStatus: NFCNDEFStatus, capacity: Int, error: Error?) in
ここではNFCタグのNDEFのステータスを問い合わせています。
queryNDEFStatusメソッドは、タグの現在のNDEFステータスと、タグが保持できる最大のNDEFメッセージサイズ(バイト数)を返します。
ndefStatus: タグのNDEFステータスを示すNFCNDEFStatus型の値で、タグがNDEFに対応しているか、読み取り専用か、読み書き可能かを示します。
notSupported → 対応してない
readOnly → 読み取りのみ
readWrite → 読み書きOK
capacity: タグが保持できるNDEFメッセージの最大サイズを示す整数です。
以上の理解で文字列を書き込みする最低限の理解は整理できました。
ここからはreadWrite時に書き込みの処理を行ってみます。
let string = "hoge"
let data = string.data(using: .utf8)!
let payload = NFCNDEFPayload(format: .nfcWellKnown, type: Data("T".utf8), identifier: Data(), payload: data)
let message = NFCNDEFMessage(records: [payload])
4行のコードでNFCタグに文字を書く準備ができましたので後はwriteNDEFの引数にmessageを渡せば書き込みすることができます。
tag.writeNDEF(message, completionHandler: { (error: Error?)
2. 書き込んだ文字列を読み取る
一旦書き込んだ文字列を読み取る実装をreaderSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage])内で行います。以下サンプルコードです。
ここから先は
¥ 200
いいねと思えたらよろしくお願いします😋