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
相关产品推荐
相关产品推荐

