yanjinhua
2023/02/19阅读:29主题:蓝莹
一个跨平台的 NFC 插件
一个跨平台的 NFC 插件
Plugin.NFC
作者:franckbour
原文链接[1]:https://github.com/franckbour/Plugin.NFC
鸣谢 吉浩然
跨平台 NFC
(近场通信)插件,可轻松在 Xamarin Forms
或 .NET MAUI
应用程序中读取和写入 NFC
标签。
此插件使用 NDEF(NFC
数据交换格式)以实现 NFC
设备、标签类型和操作系统之间的最大兼容性。
Package | Build | NuGet | MyGet |
---|---|---|---|
Plugin.NFC |
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.NFC
和NFC
功能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 yourOnNewIntent()
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
卡时遇到问题 - 问题可能不在于此库,而在于 Apple
的 API
。
在 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 13
的NfcTagReaderSession API
进行扫描。
如果您需要从Mifare Classic 1K
卡中读取NDEF
数据,则可以:
-
使用此库的版本 0.1.11
,因为它是使用NfcNdefReaderSession API
编写的。 -
从 0.1.20+
开始使用,它允许您在NfcTagReaderSession
和NfcNdefReaderSession
之间即时切换。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]
参考资料
原文链接: 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
作者介绍