Flutter NFC

Posted After life

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter NFC相关的知识,希望对你有一定的参考价值。

一:介绍下futter的一些NFC插件

1:nfc_in_flutter
这一个插件也是我第一次需要用到NFC功能时使用的。

优点:集成快,后续扫描基本没Bug
缺点:写法较累赘。最主要的是只能扫描标准的NDEF格式的卡片。而的NFC-B 这种的就无法扫描了。所以有很大的局限性。

2:nfc_manager
这款插件好评最多。我也在ios上尝试集成过。但扫描出来的 tag 的 “identity”是一个字节数组。我尝试解码过,没有解出来,好像需要根据NFC的格式来进行专门的解密的吧。有懂的小伙伴可以私聊下我,共同学习下~

3:flutter_nfc_reader 和flutter_nfc
只在ios上尝试过,扫描出来的 nfcId 和其他内容都是空,所以就没用这两款

4:flutter_nfc_kit: ^2.2.0
我目前在使用这款插件,比较好用,可以扫描的NFC的格式较多,基本可以满足用户需求,下面介绍的也是这款插件的使用方法

上面的版本如果不适合您的项目的话可以上官方网址搜索下flutter_nfc_kit

二:在android上使用前需要进行的步骤

需要在项目路径的android/app/src/main/AndroidMainfest.xml 里面写入

    <uses-permission android:name="android.permission.NFC" />

三:在ios上使用前需要进行的步骤

1:在项目的根路径下面打开 ios/Runner/Info.plist 文件
在里面填写(注意对齐!)

	<key>NFCReaderUsageDescription</key>
	<string>App需要您的同意,才能使用NFC功能</string>
	<key>com.apple.developer.nfc.readersession.felica.systemcodes</key>
	<array>
		<string>8005</string>
		<string>8008</string>
		<string>0003</string>
		<string>fe00</string>
		<string>90b7</string>
		<string>927a</string>
		<string>86a7</string>
	</array>
	<key>com.apple.developer.nfc.readersession.formats</key>
	<array>
		<string>NDEF</string>
		<string>TAG</string>
	</array>
	<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
	<array>
		<string>A0000002471001</string>
		<string>A000000003101001</string>
		<string>A000000003101002</string>
		<string>A0000000041010</string>
		<string>A0000000042010</string>
		<string>A0000000044010</string>
		<string>44464D46412E44466172653234313031</string>
		<string>D2760000850100</string>
		<string>D2760000850101</string>
		<string>00000000000000</string>
	</array>

2:打开Xcode,找到 General 右边的 Singing & Capablilities,之后点击左上角的 Capability。在里面找到 Nera Field C communication Tag Reading ,双击它,就添加完成了。

四:代码部分,注意Android和ios系统需要区别判断来写

注意:ios端使用的话会自动跳出扫码页面,是不要我们编写的。Android端的话需要编写个页面或弹窗来进行提示过度下。有需要的小伙伴可以私聊我,在这里就不写入了。

1:编写nfc_util.dart

import 'dart:convert';
import 'dart:io';
import 'package:flutter_nfc_kit/flutter_nfc_kit.dart';

class NFCUtil 
  static Future getNFCId() async 
  	//判断权限
    var availability = await FlutterNfcKit.nfcAvailability;
    if (availability != NFCAvailability.available) 
    ///主要Android进行提示,这里会报错,根据自身项目的提示方法来替换
      //Toast.showToast('当前设备不支持NFC');
    

	//timeout:只对android有效,ios的控制不了
	//iosAlertMessage是ios扫码界面的提示,可设置为空。
    var tag = await FlutterNfcKit.poll(timeout: Duration(seconds: 60), iosAlertMessage: "请将NFC卡片靠近手机背面");
    /*
    *在此判断的主要原因是:android平台最好不要使用 FlutterNfcKit.finish函数
    *因为使用该函数的话每次扫描都会跳出空标签页面,所以该函数只在ios端使用即可
    */
    if(Platform.isIOS)
      if (null != tag) 
        await FlutterNfcKit.finish(iosAlertMessage: "扫描成功");
       else 
        await FlutterNfcKit.finish(iosErrorMessage: "扫描失败");
      
    
    print(jsonEncode(tag));

	//返回扫描得到的id
    return tag.id;
  


2:如何使用NFCUtil

NFCUtil.getNFCId().then((id) 
      if (id != null && id != '') 
       //在这里编写 业务
       
       else 
      	//只是个提示,可根据您个人项目来进行替换
        Toast.showError('扫描失败,ID为空!');
      
    );

以上是关于Flutter NFC的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 上使用 NFC 将十六进制值存储在内存地址中?

使用 NFC (Flutter) 实现信用卡支付

全功能nfc使用教程

nfc的工作原理是啥?

RFID和NFC的区别?

华为Mate8支不支持NFC功能