共用方式為


Xamarin.iOS 中的核心 NFC

使用 iOS 11 讀取近距離通信 (NFC) 標記

CoreNFC 是 iOS 11 中的新架構,可讓您存取 近場通信 (NFC) 無線電,以從應用程式內讀取標記。 CoreNFC 適用於 i 電話 7、i 電話 7 Plus、i 電話 8、i 電話 8 Plus、i 電話 X、i 電話 XS 和 i 電話 11 模型(雖然 i 電話 6 和 i 電話 6 Plus 模型具有 NFC 付款功能,但它們不支援 CoreNFC)。

iOS 裝置中的 NFC 標記讀取器支援包含 NFC 資料交換格式 (NDEF) 資訊的所有 NFC 標記類型 1 到 5

有一些限制需要注意:

  • CoreNFC 僅支援標記讀取(而非寫入或格式化)。
  • 卷標掃描必須由使用者起始,並在 60 秒後逾時。
  • 應用程式必須顯示在前景以進行掃描。
  • CoreNFC 只能在實際裝置上進行測試(而不是在模擬器上)。

此頁面描述使用 CoreNFC 所需的設定,並示範如何使用 API。

組態

若要啟用 CoreNFC,您必須在項目中設定三個專案:

  • 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>

佈建設定檔

建立新的 應用程式識別碼並確定已勾選 NFC 標籤讀取 服務:

開發人員入口網站 已選取 NFC 標籤讀取的 [新增應用程式識別符] 頁面

然後,您應該為此應用程式識別碼建立新的布建配置檔,然後在您的開發 Mac 上下載並加以安裝。

讀取標籤

設定項目之後,請將 新增 using CoreNFC; 至檔案頂端,並遵循下列三個步驟來實作NFC 標籤讀取功能:

1. 實作 INFCNdefReaderSessionDelegate

介面有兩個要實作的方法:

  • 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來設定的(如步驟 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),但不支援寫入或格式化。