Flutter使用NFC_MANAGER插件报设备NFC不可用异常求助
报错触发原因
PlatformException(unavailable, NFC is not available for device., null, null)是nfc_manager插件初始化NFC会话时抛出的可用性校验失败异常,触发场景包含以下几类:
- 设备无NFC硬件:包括所有iOS模拟器、部分低端安卓机型、未搭载NFC模块的旧款iPhone/平板设备
- 系统NFC开关未开启:安卓端用户手动关闭了NFC功能,iOS端NFC模块临时异常被系统限制调用
- 项目原生配置缺失:未声明NFC相关权限、未配置对应系统能力,导致插件无权限调用NFC接口
- 系统版本不满足要求:安卓系统版本低于API 19(Android 4.4)、iOS系统版本低于13.0,不支持插件依赖的NFC基础接口
- 特殊场景限制:设备处于飞行模式、NFC模块被其他系统/应用占用、部分定制ROM默认禁用第三方应用NFC调用权限
修复方案
按以下步骤逐一排查处理:
- 调用NFC逻辑前先做可用性判断
所有NFC相关操作执行前,必须先调用插件自带的可用性检查接口,从根源避免异常抛出,参考代码:import 'package:nfc_manager/nfc_manager.dart'; // 前置校验 final bool nfcAvailable = await NfcManager.instance.isAvailable(); if (!nfcAvailable) { // 弹出提示告知用户当前设备不支持NFC或NFC未开启,终止后续NFC流程 return; } - 补全双端原生配置
- 安卓端:打开项目路径下的
android/app/src/main/AndroidManifest.xml文件,在<manifest>节点下添加NFC权限声明:
同时打开<uses-permission android:name="android.permission.NFC" />android/app/build.gradle,将defaultConfig下的minSdkVersion修改为19及以上。如果需要监听NFC标签唤起,还要在主Activity的<intent-filter>节点下补充NFC发现的action配置。 - iOS端:打开项目路径下的
ios/Runner/Info.plist文件,添加NFC权限说明和读取能力配置:
注意iOS端必须使用真机调试,模拟器不支持NFC能力,同时需要在苹果开发者后台给对应App ID开启<key>NFCReaderUsageDescription</key> <string>应用需要使用NFC读取标签信息</string> <key>com.apple.developer.nfc.readersession.formats</key> <array> <string>NDEF</string> <string>TAG</string> </array>NFC Tag Reading能力。
- 安卓端:打开项目路径下的
- 增加异常兜底逻辑
所有NFC读写、扫描相关的逻辑都要用try-catch包裹,单独处理unavailable类型的异常,避免闪退:try { // 自定义NFC业务逻辑 } on PlatformException catch (e) { if (e.code == 'unavailable') { // 单独处理NFC不可用场景,比如弹提示、跳设置页 } // 其余异常的统一处理 } - 引导用户开启NFC
对于硬件支持NFC但功能未开启的用户,可以配合系统跳转插件直接引导用户跳转到NFC设置页开启功能,iOS端由于系统限制,需要弹窗提示用户手动进入设置开启。
内容的提问来源于stack exchange,提问作者хэлоу
相关产品推荐
相关产品推荐

