次の方法で共有


Xamarin.iOS のコア NFC

iOS 11 を使用した近距離無線通信 (NFC) タグの読み取り

CoreNFC は、アプリ内からタグを読み取る近距離無線通信 (NFC) へのアクセスを提供する、iOS 11 の新しいフレームワークです。 CoreNFCは、iPhone 7、iPhone 7 Plus、iPhone 8、iPhone 8 Plus、iPhone X、iPhone XS、iPhone 11 の各モデルで動作します (iPhone 6 および iPhone 6 Plus モデルは NFC 決済機能を搭載していますが、CoreNFC には対応していません)。

iOS デバイスの NFC タグ リーダーは、NFC データ変換形式(NDEF) 情報を含むすべての NFC タグの種類 1 から 5 をサポートしています。

次のようないくつかの制約があることに注意してください。

  • CoreNFC では、タグの読み取りのみがサポートされます (書き込みまたは書式設定はサポートされません)。
  • タグ スキャンは、ユーザーが開始する必要があり、60 秒後にタイムアウトします。
  • スキャンするには、アプリがフォアグラウンドに表示されている必要があります。
  • CoreNFC は、実際のデバイスでのみテストできます (シミュレーターではテストできません)。

このページでは、CoreNFC を使うために必要な構成について説明し、API を使う方法を示します。

構成

CoreNFC を有効にするには、プロジェクトで次の 3 つの項目を構成する必要があります。

  • Info.plist プライバシー キー。
  • Entitlements.plist エントリ。
  • NFC タグ読み取り機能を備えたプロビジョニング プロファイル。

Info.plist

NFCReaderUsageDescription プライバシー キーとテキストを追加します。これらは、スキャンの発生中にユーザーに表示されます。 アプリケーションに適したメッセージを使用します (例: スキャンの目的の説明)。

<key>NFCReaderUsageDescription</key>
<string>NFC tag to read NDEF messages into the application</string>

Entitlements.plist

アプリでは、Entitlements.plist で次のキーと値のペアを使用して、近距離無線通信タグの読み取り機能を要求する必要があります。

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

プロファイルのプロビジョニング

新しいアプリ ID を作成し、NFC タグ読み取りサービスがオンになっていることを確認します。

[NFC タグ読み取り] がオンになっている開発者ポータルの [新しいアプリ ID] ページ

次に、このアプリ ID 用に新しいプロビジョニング プロファイルを作成し、開発用 Mac にダウンロードしてインストールします。

タグの読み取り

プロジェクトが構成されたら、using CoreNFC; をファイルの先頭に追加し、次の 3 つの手順に従って NFC タグの読み取り機能を実装します。

1.INFCNdefReaderSessionDelegate を実装する

インターフェイスには、次の 2 つのメソッドがあります。

  • DidDetect – タグが正常に読み取られたときに呼び出されます。
  • DidInvalidate – エラーが発生するか、60 秒のタイムアウトに達したときに呼び出されます。

DidDetect

サンプル コードでは、スキャンされた各メッセージがテーブル ビューに追加されます。

public void DidDetect(NFCNdefReaderSession session, NFCNdefMessage[] messages)
{
    foreach (NFCNdefMessage msg in messages)
    {  // adds the messages to a list view
        DetectedMessages.Add(msg);
    }
    DispatchQueue.MainQueue.DispatchAsync(() =>
    {
        this.TableView.ReloadData();
    });
}

セッションで複数のタグ読み取りが許可されている場合は、このメソッドを複数回呼び出すことができます (メッセージの配列が渡される場合もあります)。 これは、Start メソッドの 3 番目のパラメーターを使用して設定されます (手順 2 で説明します)。

DidInvalidate

無効化は、次のようなさまざまな原因によって発生します。

  • スキャン中にエラーが発生しました。
  • アプリがフォアグラウンドに表示されなくなりました。
  • ユーザーがスキャンをキャンセルすることを選択しました。
  • アプリによってスキャンが取り消されました。

次のコードは、エラーを処理する方法を示しています。

public void DidInvalidate(NFCNdefReaderSession session, NSError error)
{
    var readerError = (NFCReaderError)(long)error.Code;
    if (readerError != NFCReaderError.ReaderSessionInvalidationErrorFirstNDEFTagRead &&
        readerError != NFCReaderError.ReaderSessionInvalidationErrorUserCanceled)
    {
      // some error handling
    }
}

セッションが無効になったら、再度スキャンするために新しいセッション オブジェクトを作成する必要があります。

2.NFCNdefReaderSession を開始する

スキャンは、ボタンを押すなどのユーザー要求で開始する必要があります。 次のコードにより、スキャン セッションが作成されて開始されます。

Session = new NFCNdefReaderSession(this, null, true);
Session?.BeginSession();

NFCNdefReaderSession コンストラクターのパラメーターは次のとおりです。

  • delegateINFCNdefReaderSessionDelegate の実装。 サンプル コードでは、デリゲートがテーブル ビュー コントローラーに実装されているため、this はデリゲート パラメーターとして使用されます。
  • queue – コールバックが処理されるキュー。 null である場合、ユーザー インターフェイス コントロールの更新時には (サンプルに示すように) DispatchQueue.MainQueue を使用してください。
  • invalidateAfterFirstReadtrue の場合、スキャンが最初に成功した後にスキャンが停止します。false の場合、スキャンは続行され、スキャンが取り消されるか、60 秒のタイムアウトに達するまで複数の結果が返されます。

3.スキャン セッションをキャンセルする

ユーザーは、ユーザー インターフェイスのシステム提供のボタンを使用して、スキャン セッションをキャンセルできます。

スキャン中の [キャンセル] ボタン

アプリは、次の InvalidateSession メソッドを呼び出すことによって、プログラムによってスキャンを取り消すことができます。

Session.InvalidateSession();

どちらの場合も、デリゲートの DidInvalidate メソッドが呼び出されます。

まとめ

CoreNFC を使用すると、アプリは NFC タグからデータを読み取ります。 ここでは、さまざまなタグ形式 (NDEF 型 1 から 5) の読み取りがサポートされていますが、書き込みまたは書式設定はサポートされていません。