案件でNFCタグをアプリを起動せずに読み込めるかどうかを検証したので、
備忘録として。
動作環境
- Xcode10.1
- iPhoneXS
iPhoneXS以降
URLタイプのNFCタグであればアプリがなくてもタグを読み込むことが可能。
Universal Linksを使うことで特定のアプリを開くことも可能なので
いろいろなことができそう。
ただし、端末がOFFのとき・カメラが起動されているときは
NFCタグを読み込むことができない。
iPhone7 ~ iPhoneXまで
NFCタグを読み込むためには、アプリが必要。
下記サンプルソースでログにNFCタグに書き込んだ内容を取得することが可能。
サンプルソース
import UIKit
import CoreNFC
final class ViewController: UIViewController {
private var session: NFCNDEFReaderSession?
override func viewDidLoad() {
super.viewDidLoad()
// NFCの利用制限確認
if NFCNDEFReaderSession.readingAvailable {
// invalidateAfterFirstReadは連続でNFCタグを読み込むかどうか(true : 一回 false: 複数回)
self.session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false)
self.session?.alertMessage = "NFCタグをiPhoneに近づけてください"
// 読み取り開始
self. session?.begin()
} else {
print("❎端末的に使えないよ❎")
}
}
}
extension ViewController: NFCNDEFReaderSessionDelegate {
/// 読み取りエラーが起こった時呼ばれる。ユーザーがキャンセルボタンを押すか、タイムアウトしたときに呼ばれる。
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
print("Error: \(error.localizedDescription)")
print("🙅♂️エラー")
}
/// 読み取りに成功したら呼ばれる。
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
for message in messages{
for record in message.records {
print(String(data: record.payload, encoding: .utf8))
print("👌読み取ったよ")
}
}
}
}
まとめ
iPhoneXS以降の端末であればアプリを起動していなくても、URLタイプのみNFCタグを読み込むことができるが、
画面がオンの状態じゃないといけないのが難点かもしれない。
また、iPhone7~iPhoneXまでは別途アプリが必要なので、今のところはバックグラウンドでNFCタグを読み込むのは
限定的すぎて現実的ではなさそうでした。