WWDC2017で発表のあったCoreNFCを使ってみました。テストした範囲ではNDEF(NFC Data Exchange Format)が読み込めるようです。FelicaID読み取りはできないようです。
- CoreNFC
動作環境
- XCode Version 9.0 beta (9M136h)
- iOS11(Build 15A5278f)
サンプルコード
作りかけですが動作しているサンプルコードを以下に置いておきます。
https://github.com/bellx2/ios11NFCTest/
※provisioningファイルの設定が必要です。
設定方法
CoreNFCを利用するためには、以下のような設定が必要です。正式版になれば他の機能拡張と同じくXCodeのCapabilitiesで設定するだけ1.2は不要になるはずです。
1.ADCサイトでProvisioningファイルのNFC Readingを有効にします。
このprovsioningファイルを利用します。
2.entitlementsファイルにNFCの設定を入れます
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
</array>
entitlementsファイルが生成されていない場合にはCapabiritiesから「Siri」などを選ぶと生成されます。
3.Info.plistに「NFCReaderUsageDescription」を追加します(ダイアログに表示されます)
<key>NFCReaderUsageDescription</key>
<string>NFCのカードをかざしてください</string>
4.プロジェクトにCoreNFCを追加します
プログラム解説
NFCNDEFReaderSessionDelegateを設定します。
class ViewController: UIViewController, NFCNDEFReaderSessionDelegate{
....
}
NFCNDEFReaderSessionを生成します。invalidateAfterFirstReadをfalseにするとNFCを複数回読みます。trueの場合は1回スキャンすると終了します。
let session:NFCNDEFReaderSession = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: true)
session.begin()
begin()するとダイアログが出てきて読み出しモードとなります。
値が取得できるとreaderSession(_ ,didDetectNDEFs)にてデータが返ります。
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
for message in messages{
for payload in message.records {
print ("Payload Data: \(payload.payload)")
}
}
}
エラーもしくは終了の場合はreaderSession(_ , didInvalidateWithError)が呼ばれます。
func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
print("Error: \(error.localizedDescription)")
}
}
注意点
- 実機もしくはGenericDeviceを選択しないと「No Such module 'CoreNFC'」と出てコンパイルできません。オートコンプリートなども効きません。
- provisioningに設定がされていない場合は以下のようなエラーがでます。
- entitlementsファイルが設定がされていない場合は202エラー、Info.plistにNFCReaderUsageDescriptionエントリーが無い場合はサクッと落ちます...。