Flutterで作成した iOS アプリから NFCタグを読み込むのに、 nfc-manager パッケージを利用してみました。
読み込むタグの種類としては両方のOSで読み込むことができる NDEF(NFC Data Exchange Format)を対象としました。
nfc-manager の説明によると、
- Near Field Communication Tag Reader Session Formats Entitlements を追加
- NFCReaderUsageDescription を Info.plist に追加
- com.apple.developer.nfc.readersession.felica.systemcodes と com.apple.developer.nfc.readersession.iso7816.select-identifiers を Info.plist に追加(必要なら)
と書いてあります。
今回は NDEF のみが対象なので、3つ目は不要かと思っていましたが、これが無いと NFCタグ読み込みのポップアップが表示されません。
実装のポイント
Entitlements
com.apple.developer.nfc.readersession.formats を .entitlements ファイルに追加するのですが、xcode UI からは複数の選択肢があります。
今回は NDEFが対象なので、"NDEF" を値として設定すれば良いかと思ったら、読み込みポップアップが表示せず・・・ "TAG" を値として設定しなければならないようです。
以下の Apple のサイトを見ると、有効な値は "TAG" しか書かれてません。。。
https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_nfc_readersession_formats
ということで com.apple.developer.nfc.readersession.formats には ”TAG” を指定しましょう!
com.apple.developer.nfc.readersession.* の Info.plist への追加
色々と検索すると、felica.systemcodes と iso7816.select-identifiers を追加しないといけないと書かれています。それぞれのキーには多くの値が書かれていて、意味もよくわからないので、本当に必要か疑問でした。
様々なフォーマット(タグ?カード?)に対応するのであれば、その対応する値を書かないといけないようなのですが、今回対応したいのは NDEF のみです。
調べた結果、 felica.systemcodes キーのみ、かつ値も1つあれば読み取ることができるとわかりました。(対象のNFCタグによっては不足する可能性は高いですが・・・)
<key>com.apple.developer.nfc.readersession.felica.systemcodes</key>
<array>
<string>12fc</string>
</array>
ちなみに、値の "12fc" は、ソニーのドキュメントによると
NFC Forum が規定する NFC Data Exchange Format (NDEF)が格納されたシステム
とのこと。ただ、それ以外の値でも問題なさそうでした。
このキーがあることが必要なのかもしれません。
ということで、NDEFを読み込むだけであれば、最低条件として com.apple.developer.nfc.readersession.felica.systemcodes キーを追加。値は最低一つ。となりました。
後記
Android では割とすんなりと読み込めましたが、iOS は手こずりました。
対応するNFCの種類によって、色々と対応が異なるようで難しいですね。
追記(2023/1/9)
実装のポイントで書いた2点は、nfc-manager パッケージの中で NFCTagReaderSession を使っているためのようです。
com.apple.developer.nfc.readersession.formats に "NDEF" を指定した場合は、多分 NFCNDEFReaderSession を使うのではないかと。