You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NativeScript 7/8下iOS NFC写入失效,queryNDEFStatusWithCompletionHandler未定义

问题根因

NativeScript 7及以上版本调整了iOS原生API的绑定逻辑,原有直接通过NFCNDEFTag.prototype调用实例方法的方式不再兼容,同时新版本对原生对象的类型转换规则也做了优化,代码中手动用interop.Reference包装tag实例的操作反而会导致方法绑定失效。

修复方案

1. 调整API调用方式

不需要通过原型链调用实例方法,直接在拿到的NDEF tag实例上调用对应原生方法即可,同时移除不必要的interop.Reference类型转换代码。

2. 确认基础配置

  • 插件的iOS最低支持版本设置为13.0及以上,queryNDEFStatusWithCompletionHandler是iOS13才新增的API
  • 项目Info.plist中已经正确配置NFCReaderUsageDescription权限声明

修改后参考代码

readerSessionDidDetectTags(
    session: NFCNDEFReaderSession,
    tags: NSArray<NFCNDEFTag> | NFCNDEFTag[]
  ): void {
    const tag = tags[0];
    session.connectToTagCompletionHandler(tag, (error: NSError) => {
      console.log("connectToTagCompletionHandler");

      if (error) {
        console.log(error);
        session.invalidateSessionWithErrorMessage("Error connecting to tag.");
        this.errorCallback(error);
        return;
      }

      try {
        // 直接调用实例方法,不需要走prototype,也不需要手动做引用转换
        tag.queryNDEFStatusWithCompletionHandler(
          (status: NFCNDEFStatus, number: number, error: NSError) => {
            console.log("queryNDEFStatusWithCompletionHandler");

            if (status == NFCNDEFStatus.NotSupported) {
              var errMessage = "Tag is not NDEF compliant.";
              session.invalidateSessionWithErrorMessage(errMessage);
            } else if (status === NFCNDEFStatus.ReadOnly) {
              var errMessage = "Tag is read only.";
              session.invalidateSessionWithErrorMessage(errMessage);
            } else if (status === NFCNDEFStatus.ReadWrite) {
              const ndefMessage = this._owner.get().message;
              // 写入方法同样直接调用实例方法
              tag.writeNDEFCompletionHandler(
                ndefMessage,
                (error: NSError) => {
                  if (error) {
                    console.log(error);
                    session.invalidateSessionWithErrorMessage("Write failed.");
                    this.errorCallback(error);
                  } else {
                    if (
                      ndefMessage.records[0].typeNameFormat ==
                      NFCTypeNameFormat.Empty
                    ) {
                      session.alertMessage = "Erased data from NFC tag.";
                    } else {
                      if (this.options.writeHint) {
                        session.alertMessage = this.options.writeHint;
                      }
                      this.resultCallback(NfcHelper.ndefToJson(ndefMessage));
                    }
                    session.invalidateSession();
                  }
                }
              );
            }
          }
        );
      } catch (e) {
        session.alertMessage = "error";
        console.log(e);
      }
    });
  }

验证步骤

修改代码后依次删除项目下的node_modules、platforms、hooks文件夹,重新执行依赖安装和构建操作,避免旧缓存的绑定代码影响功能。测试时优先使用空白可写的NDEF格式标签测试写入功能。

内容的提问来源于stack exchange,提问作者Han

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:48:03