Flutter 错误:NDEF 标签在 ios 上不包含任何 NDEF 消息

问题描述

我尝试构建一个 NFC 应用程序,它仍然可以正常工作 - 除了一个大问题。当我想用我的应用描述新购买的 NFC 标签时,这不适用于错误代码错误:NDEF 标记不包含任何 NDEF 消息。 但是,如果我从 AppStore 打开另一个 NFC 应用程序,它可以与标签完美配合。 同样奇怪的是,一旦我使用另一个 NFC 应用向标签写入文本,我的应用现在可以完美运行,我现在可以写入标签

所以我的问题是,为什么我只能使用已经包含消息的应用编写 NFC 标签

我也很想知道如何对我的应用程序进行编程,以便它也可以写入空标签。由于这也适用于 AppStore 中的其他应用程序,因此在 iOS 上一定可以。

非常感谢所有花时间解决我的问题的人。

Future<void> writetoTag()async{
  try {

    final result = await InternetAddress.lookup('google.com');

    if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
      

      if (Platform.isAndroid) {
        showDialog(
          context: context,builder: (context) => AlertDialog(
            title: const Text("Halten Sie Ihr Gerät an den Chip,den Sie lesen                  möchten"),actions: <Widget>[
              FlatButton(
                child: const Text("Cancel"),onpressed: () {
                  _stream?.cancel();
                  Navigator.pop(context);
                },),],);
      }



      List <NDEFRecord> my = [NDEFRecord.type("Chip",_random)];
      NDEFMessage Message = NDEFMessage.withRecords(my);

      await NFC.writeNDEF(Message,once: true).first;
      funktinoiert.year = true;

      setState(() {
        isloading = true;
      });

      int time = DateTime.Now().millisecondsSinceEpoch;


      Map<String,dynamic> data = {
        "random" : _random,"Time" : time,};

      await Firestore.instance
          .collection("NFC")
          .document(_random)
          .setData(data)
          .catchError((e) {
        funktinoiert.year = false;
        print(e);
      });

      await Firestore.instance
          .collection("Anzahl")
          .document("Prototyp")
          .updateData({"NFC": FieldValue.increment(1)})
          .catchError((e) {
        print(e);
      });
    }

  }
  on FirebaseException catch (e) {
    newEntryFehlermeldung("$e \n\n Bitte versuchen Sie es erneut. Sollten Sie den Fehler nicht beheben können hilft unser Team Ihnen gerne weiter.");
    funktinoiert.year = false;
  } on PlatformException {
    newEntryFehlermeldung("Es ist ein Fehler aufgetreten,bitte versuchen Sie es erneut");
    funktinoiert.year = false;
  } on NFCUserCanceledSessionException {
    funktinoiert.year = false;
    return null;
  } on NFCSessionTerminatedUnexpectedlyException {
    newEntryFehlermeldung("Es ist ein Fehler aufgetreten,bitte versuchen Sie es erneut");
    funktinoiert.year = false;
  } on NFCSessionTimeoutException {
    newEntryFehlermeldung("Es ist ein Fehler aufgetreten,bitte versuchen Sie es erneut");
    funktinoiert.year = false;
  } on NFCTagNotWritableException {
    newEntryFehlermeldung("Es sieht so aus,als wäre der Chip nicht beschreibbar. Bitte versuchen Sie es erneut.");
    funktinoiert.year = false;
  } on NFCTagSizetooSmallException {
    newEntryFehlermeldung("Es ist ein Fehler aufgetreten,bitte versuchen Sie es erneut");
    funktinoiert.year = false;
  } on NFCTagUnwritableException {
    newEntryFehlermeldung("Es ist ein Fehler aufgetreten,bitte versuchen Sie es erneut");
    funktinoiert.year = false;
  } on NFCTagUnavailableException {
    newEntryFehlermeldung("Es ist ein Fehler aufgetreten,bitte versuchen Sie es erneut");
    funktinoiert.year = false;
  } on NFCSystemIsBusyException {
    newEntryFehlermeldung("Es ist ein Fehler aufgetreten,bitte versuchen Sie es erneut");
    funktinoiert.year = false;
  } on Exception catch (exception) {
    newEntryFehlermeldung("$exception \n\n Bitte versuchen Sie es erneut. Sollten Sie den Fehler nicht beheben können hilft unser Team Ihnen gerne weiter.");
    funktinoiert.year = false;
    Navigator.pushReplacementNamed(context,"/home");
    print(exception);
  } catch (e) {
    funktinoiert.year = false;
    newEntryFehlermeldung("Es besteht keine Verbindung zum Internet. Bitte versuchen Sie es erneut. Sollten Sie den Fehler nicht beheben können hilft unser Team Ihnen gerne weiter.");
  }


  if(funktinoiert.year == true){
    newEntry();
    funktinoiert.year = false;
  } else{
    newEntryFehlermeldung("Es ist ein Fehler aufgetreten,bitte versuchen Sie es erneut");
  }


  setState(() {
    isloading = false;
  });

  Navigator.pushReplacementNamed(context,"/home");
}

解决方法

好的,标签来自工厂已经为 NDef 格式化(这意味着它是一个类型 2 标签,如果有一个能力容器并包含一个空的 Ndef 消息 TLV 块)

问题在于我想说的是 Flutter 插件无法解决 iOS 中的错误(插件中的错误也是如此)。

问题是该插件仅在包含 NDEF 消息的标签时要求 iOS 得到通知,iOS 将此解释为负载数据大于 0 字节的 NDEF 消息,而此类标签的 NFC 规范表示检测包括零长度 NDEF 消息。

其他 iOS 应用程序的工作原理是它们可能是解决此 iOS 错误的本机应用程序,通过要求 iOS 在任何类型的标签进入范围时得到通知,然后在写入非空标签之前检查它是否具有 Ndef 能力NDef 消息给他们。

如何为您修复它很困难,请尝试其他一些 NFC flutter 插件或自己编写。

我至少会为 NFC flutter 插件提出错误/功能请求,以使其处理这种情况。

对于 iOS,这可能是因为它只能读取 NDef 消息而无法写入它们,因为 iOS 中的 NFC 支持很差。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...