yanjinhua

V1

2023/02/19阅读:29主题:蓝莹

一个跨平台的 NFC 插件

一个跨平台的 NFC 插件

Plugin.NFC

作者:franckbour

原文链接[1]:https://github.com/franckbour/Plugin.NFC

鸣谢 吉浩然

跨平台 NFC(近场通信)插件,可轻松在 Xamarin Forms.NET MAUI 应用程序中读取和写入 NFC 标签。

此插件使用 NDEFNFC 数据交换格式)以实现 NFC 设备、标签类型和操作系统之间的最大兼容性。

Package Build NuGet MyGet
Plugin.NFC Build status Nuget MyGet

CI Feed : https://www.myget.org/F/plugin-nfc/api/v3/index.json

支持的平台

Platform Version Tested on
Android 4.4+ Google Nexus 5, Huawei Mate 10 Pro, Google Pixel 4a, Google Pixel 6a
iOS 11+ iPhone 7, iPhone 8

目前不支持 Windows、Mac 和 Linux。 欢迎请求请求!

设置

Android

  • 在你的 AndroidManifest.xml 中添加 NFC 权限 android.permission.NFCNFC 功能 android.hardware.nfc
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="false" />
  • 在你的 OnCreate() 中添加 CrossNFC.Init(this) 如下:
protected override void OnCreate(Bundle savedInstanceState)
{
    // Plugin NFC: Initialization before base.OnCreate(...) (Important on .NET MAUI)
    CrossNFC.Init(this);

    base.OnCreate(savedInstanceState);
    [...]
}
  • OnResume() 中添加 CrossNFC.OnResume() 如下:
protected override void OnResume()
{
    base.OnResume();

    // Plugin NFC: Restart NFC listening on resume (needed for Android 10+) 
    CrossNFC.OnResume();
}
  • Add the line CrossNFC.OnNewIntent(intent) in your OnNewIntent()
protected override void OnNewIntent(Intent intent)
{
    base.OnNewIntent(intent);

    // Plugin NFC: Tag Discovery Interception
    CrossNFC.OnNewIntent(intent);
}

iOS

需要 iOS 13+

需要 iPhone 7+iOS 11+ 才能在 iOS 设备上使用 NFC

  • 在您的 Entitlements.plist 中添加近场通信标签读取功能
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
    <string>NDEF</string>
    <string>TAG</string>
</array>
  • 在信息列表中添加 NFC 功能描述
<key>NFCReaderUsageDescription</key>
<string>NFC tag to read NDEF messages into the application</string>
  • 如果要与 ISO 7816 兼容标签进行交互,请在 Info.plist 中添加这些行
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<string>com.apple.developer.nfc.readersession.iso7816.select-identifiers</string>

*如果您想与 Mifare Desfire EV3兼容标签进行交互,请在Info.plist中添加这些行

<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
    <string>com.apple.developer.nfc.readersession.iso7816.select-identifiers</string>
    <string>D2760000850100</string>
</array>

iOS 注意事项

如果您在阅读 Mifare Classic 1K卡时遇到问题 - 问题可能不在于此库,而在于 AppleAPI

iOS 11上,Apple发布了仅使用NfcNdefReaderSession API读取NFC NDEF数据的功能(https://developer.apple.com/documentation/corenfc/nfcndefreadersession)[2]

Mifare Classic 1K 卡将扫描其上是否有有效的 NDEF 记录。空白卡无法扫描。

iOS 11中,无法从NFC标签/卡获取CSN(序列号/身份)。

iOS 13中,随之而来的是写入NDEF数据和读取序列号的能力。然而,苹果没有改编NfcNdefReaderSession API,而是创建了一个名为NfcTagReaderSession(https://developer.apple.com/documentation/corenfc/nfctagreadersession)[3]的新API,并保留了旧的NfcNdefReaderSession API

iOS 13 中新的 NfcTagReaderSession API 不再支持 Mifare Classic 1K 卡。不知道为什么 - 但如果你看看苹果的开发者论坛,很多人都发现了同样的事情。

因此,即使您有一张Mifare Classic 1K卡,可以使用旧的iOS 11 NfcNdefReaderSession API读取,该卡甚至无法使用iOS 13NfcTagReaderSession API进行扫描。

如果您需要从Mifare Classic 1K卡中读取NDEF数据,则可以:

  • 使用此库的版本 0.1.11,因为它是使用 NfcNdefReaderSession API 编写的。
  • 0.1.20+ 开始使用,它允许您在 NfcTagReaderSessionNfcNdefReaderSession 之间即时切换。CrossNFC.Legacy.

不幸的是,即使使用iOS 13,似乎也无法从Mifare Classic 1K卡中读取序列号/ CSN

接口用法

在使用插件之前,请使用 检查平台是否支持 NFC 功能。CrossNFC.IsSupported

要获取插件的当前平台实现,请调用 CrossNFC.Current:

  • 检查 CrossNFC.Current.IsAvailable 以验证 NFC 是否可用。
  • 检查 CrossNFC.Current.IsEnabled 以验证 NFC 是否已启用。
  • Register events:
// Event raised when a ndef message is received.
CrossNFC.Current.OnMessageReceived += Current_OnMessageReceived;
// Event raised when a ndef message has been published.
CrossNFC.Current.OnMessagePublished += Current_OnMessagePublished;
// Event raised when a tag is discovered. Used for publishing.
CrossNFC.Current.OnTagDiscovered += Current_OnTagDiscovered;
// Event raised when NFC listener status changed
CrossNFC.Current.OnTagListeningStatusChanged += Current_OnTagListeningStatusChanged;

// Android Only:
// Event raised when NFC state has changed.
CrossNFC.Current.OnNfcStatusChanged += Current_OnNfcStatusChanged;

// iOS Only: 
// Event raised when a user cancelled NFC session.
CrossNFC.Current.OniOSReadingSessionCancelled += Current_OniOSReadingSessionCancelled;

在 Android 上检测到兼容标签时启动应用

Android 中,您可以在 MainActivity 上使用 IntentFilter 属性来初始化标签监听。

[IntentFilter(new[] { NfcAdapter.ActionNdefDiscovered }, Categories = new[] { Intent.CategoryDefault }, DataMimeType = "application/com.companyname.yourapp")]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
{
    ...
}

要启动/打开带有标签的应用程序,记录的 TypeFormat 必须设置为 NFCNdefTypeFormat.Mime 并且 MimeType 应设置为与 IntentFilter.DataMimeType 相同的值(例如 application/com.companyname。 你的应用程序):

var record = new NFCNdefRecord {
    TypeFormat = NFCNdefTypeFormat.Mime,
    MimeType = "application/com.companyname.yourapp",
    Payload = NFCUtils.EncodeToByteArray(_writePayload)
};

读取标签

  • 使用 CrossNFC.Current.StartListening() 开始收听。
  • 当收到 NDEF 消息时,将引发事件 OnMessageReceived

编写标签

  • 要编写标签,请调用CrossNFC.Current.StartPublishing()
  • 然后,当引发OnTagDiscovered事件时,CrossNFC.Current.PublishMessage(ITagInfo)
  • 编写标签后,不要忘记调用 CrossNFC.Current.StopPublishing()

清除标记

  • 要清除标签,请调用CrossNFC.Current.StartPublishing(clearMessage: true)
  • 然后当事件引发时。CrossNFC.Current.PublishMessage(ITagInfo)OnTagDiscovered
  • 清除标签后不要忘记致电。CrossNFC.Current.StopPublishing()

有关更多示例,请参阅存储库中的示例应用程序。

自定义 UI 消息

  • 将新对象设置为 with 方法,如下所示 NfcConfigurationCrossNFC.CurrentSetConfiguration(NfcConfiguration cfg)
// Custom NFC configuration (ex. UI messages in French)
CrossNFC.Current.SetConfiguration(new NfcConfiguration
{
    Messages = new UserDefinedMessages
    {
        NFCSessionInvalidated = "Session invalidée",
        NFCSessionInvalidatedButton = "OK",
        NFCWritingNotSupported = "L'écriture des TAGs NFC n'est pas supporté sur cet appareil",
        NFCDialogAlertMessage = "Approchez votre appareil du tag NFC",
        NFCErrorRead = "Erreur de lecture. Veuillez rééssayer",
        NFCErrorEmptyTag = "Ce tag est vide",
        NFCErrorReadOnlyTag = "Ce tag n'est pas accessible en écriture",
        NFCErrorCapacityTag = "La capacité de ce TAG est trop basse",
        NFCErrorMissingTag = "Aucun tag trouvé",
        NFCErrorMissingTagInfo = "Aucune information à écrire sur le tag",
        NFCErrorNotSupportedTag = "Ce tag n'est pas supporté",
        NFCErrorNotCompliantTag = "Ce tag n'est pas compatible NDEF",
        NFCErrorWrite = "Aucune information à écrire sur le tag",
        NFCSuccessRead = "Lecture réussie",
        NFCSuccessWrite = "Ecriture réussie",
        NFCSuccessClear = "Effaçage réussi"
    }
});

感谢Saamer Mansoor(@saamerm[4])在Medium上写了这篇关于Plugin.NFC以及如何使用它的优秀文章,请查看它!

他还制作了这个视频: 视频地址[5]

参考资料

[1]

原文链接: https://github.com/franckbour/Plugin.NFC

[2]

(https://developer.apple.com/documentation/corenfc/nfcndefreadersession): https://developer.apple.com/documentation/corenfc/nfcndefreadersession

[3]

(https://developer.apple.com/documentation/corenfc/nfctagreadersession): https://developer.apple.com/documentation/corenfc/nfctagreadersession

[4]

saamerm: https://github.com/saamerm

[5]

视频地址: https://www.youtube.com/watch?v=STfzU18v7gE

分类:

后端

标签:

C#

作者介绍

yanjinhua
V1