iOS11のCoreNFCを使う

  • 29
    いいね
  • 1
    コメント

WWDC2017で発表のあったCoreNFCを使ってみました。テストした範囲ではNDEF(NFC Data Exchange Format)が読み込めるようです。FelicaID読み取りはできないようです。

IMG_1362.PNG IMG_0121.PNG

  • CoreNFC

https://developer.apple.com/documentation/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を有効にします。

スクリーンショット 2017-06-06 23.44.53.png

このprovsioningファイルを利用します。

2.entitlementsファイルにNFCの設定を入れます

スクリーンショット 2017-06-07 00.00.38.png

<key>com.apple.developer.nfc.readersession.formats</key>
    <array>
        <string>NDEF</string>
    </array>

entitlementsファイルが生成されていない場合にはCapabiritiesから「Siri」などを選ぶと生成されます。

3.Info.plistに「NFCReaderUsageDescription」を追加します(ダイアログに表示されます)

スクリーンショット 2017-06-07 00.01.50.png

<key>NFCReaderUsageDescription</key>
    <string>NFCのカードをかざしてください</string>

4.プロジェクトにCoreNFCを追加します

スクリーンショット 2017-06-06 19.31.23.png

プログラム解説

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'」と出てコンパイルできません。オートコンプリートなども効きません。

スクリーンショット 2017-06-06 23.47.53.png

  • provisioningに設定がされていない場合は以下のようなエラーがでます。

スクリーンショット 2017-06-07 00.05.00.png

  • entitlementsファイルが設定がされていない場合は202エラー、Info.plistにNFCReaderUsageDescriptionエントリーが無い場合はサクッと落ちます...。

その他参考