SKStoreReviewControllerでアプリ内レビュー依頼を実装した後、以前から気になっていたCore NFCによるNFCタグ読み取り機能に挑戦しました。実機を持っていなかったこともあり、想定以上につまずくことになりました。
1. シミュレータで動作確認できると思い込んでいた
最初、他のフレームワークと同じ感覚でシミュレータ上で動作確認しようとしていました。
let session = NFCTagReaderSession(pollingOption: .iso14443, delegate: self)
session?.begin()
コードを書いてシミュレータで実行しても、NFCの読み取り画面自体がまったく表示されませんでした。調べてみると、Core NFCはハードウェアのNFCリーダーに依存する機能のため、シミュレータでは一切動作せず、実機での確認が必須だと分かりました。
2. Info.plistへの説明文追加を忘れていた
実機に切り替えて試したところ、今度はアプリがクラッシュしてしまいました。
クラッシュログ:
NFCReaderUsageDescriptionキーが見つからない
他の権限系機能と同様、NFC読み取りの目的をユーザーに説明する文言をInfo.plistに追加する必要があることを見落としていました。NFCReaderUsageDescriptionキーを追加し、読み取りの目的を明記したところ、正しく読み取り画面が起動するようになりました。
3. 読み取りセッションがすぐ終了してしまう
読み取り自体はできるようになったものの、タグにかざした直後にセッションが終了してしまい、続けて別のタグを読み取れない挙動に困惑しました。
session.invalidate()
調べてみると、NFCTagReaderSessionは1回のセッションで1つのタグを読み取ると自動的に終了する設計になっていました。連続して複数のタグを読み取りたい場合は、都度新しいセッションを生成してbegin()し直す必要があると分かり、読み取りボタンを押すたびに新規セッションを作る実装に変更しました。
4. タグの種類によって読み取り方法が異なることに気づかず苦労した
いくつか手元のNFCタグで試したところ、あるタグは正常に読み取れるのに、別のタグではエラーになってしまいました。
エラー内容:
サポートされていないタグの種類
NFCタグにはISO14443やISO15693など複数の規格があり、pollingOptionで指定した規格に対応するタグしか検出できない仕組みだと理解しました。手元のタグの規格を確認し、複数の規格を並べて指定することで、より多くの種類のタグに対応できるようになりました。
まとめ
- Core NFCはハードウェア依存のため、シミュレータでは動作せず実機確認が必須
- 他の権限系機能と同様、Info.plistへの利用目的の説明文追加を忘れずに行う
NFCTagReaderSessionは1回の読み取りで終了する設計のため、連続読み取りには都度セッションを再生成する- NFCタグには複数の規格があり、
pollingOptionで対応する規格を正しく指定する必要がある
普段あまり意識しないNFCという技術も、実際に実装してみるとハードウェアならではの制約や設計思想が見えてきて、良い学びになりました。
本記事は生成AI(Claude)を活用して執筆・編集しています。内容は実体験に基づき、執筆者本人が確認・監修しています。


コメント