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 タグ読み取りサービスがオンになっていることを確認します。
次に、このアプリ 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
コンストラクターのパラメーターは次のとおりです。
delegate
–INFCNdefReaderSessionDelegate
の実装。 サンプル コードでは、デリゲートがテーブル ビュー コントローラーに実装されているため、this
はデリゲート パラメーターとして使用されます。queue
– コールバックが処理されるキュー。null
である場合、ユーザー インターフェイス コントロールの更新時には (サンプルに示すように)DispatchQueue.MainQueue
を使用してください。invalidateAfterFirstRead
–true
の場合、スキャンが最初に成功した後にスキャンが停止します。false
の場合、スキャンは続行され、スキャンが取り消されるか、60 秒のタイムアウトに達するまで複数の結果が返されます。
3.スキャン セッションをキャンセルする
ユーザーは、ユーザー インターフェイスのシステム提供のボタンを使用して、スキャン セッションをキャンセルできます。
アプリは、次の InvalidateSession
メソッドを呼び出すことによって、プログラムによってスキャンを取り消すことができます。
Session.InvalidateSession();
どちらの場合も、デリゲートの DidInvalidate
メソッドが呼び出されます。
まとめ
CoreNFC を使用すると、アプリは NFC タグからデータを読み取ります。 ここでは、さまざまなタグ形式 (NDEF 型 1 から 5) の読み取りがサポートされていますが、書き込みまたは書式設定はサポートされていません。