Help us understand the problem. What is going on with this article?

iOS11のCoreNFCを使う

More than 1 year has passed since last update.

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

その他参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away