LoginSignup
43
30

More than 5 years have passed since last update.

iOS11のCoreNFCを使う

Last updated at Posted at 2017-06-06

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

IMG_1362.PNG IMG_0121.PNG

  • 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エントリーが無い場合はサクッと落ちます...。

その他参考

43
30
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
30