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 標籤讀取 服務:
然後,您應該為此應用程式識別碼建立新的布建配置檔,然後在您的開發 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),但不支援寫入或格式化。