无法在 NativeScript 7 或 8 上进行 NFC 写入工作
Cannot get NFC write work on NativeScript 7 or 8
我 fork 了插件 nativescript-nfc 并为 iOS 实现了 NFC 写入功能,它在使用 NativeScript 6 时运行良好。但是如果我将插件升级到 7 或 8,写入就不会了'不起作用,NFCNDEFTag.prototype.queryNDEFStatusWithCompletionHandler
总是未定义的。
写入NFC的实现如下图
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;
}
const ndefTag: NFCNDEFTag = new interop.Reference<NFCNDEFTag>(
interop.types.id,
tag
).value;
try {
NFCNDEFTag.prototype.queryNDEFStatusWithCompletionHandler.call(
ndefTag,
(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;
NFCNDEFTag.prototype.writeNDEFCompletionHandler.call(
ndefTag,
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";
}
});
}
我不确定我是否以正确的方式为 NativeScript 7 或 8 实现它,但至少它适用于 6,我实际上不认为这是 NativeScript 7 和 8 中的错误。我们曾经为了使用这个插件而长期使用 6,但为了其他功能,确实需要升级到 7 或 8。
如有任何帮助、建议或评论,我们将不胜感激!
下面是不同 NativeScript 版本的代码库和分支。
回购:https://github.com/nordsense/nativescript-nfc
分支feature/upgrade-nativescript
:这是NativeScript 8,只读作品
分支nordsense
:这是NativeScript 6,读写都可以工作
你可以使用demo工程来测试,set ndef listener
是read,write Text
是write
我设法让它在 NS 8 上运行。参考下面的代码片段,如果在第 2 行之前访问 NFCNDEFTag.prototype
,就像第 1 行中的代码或使用 console.dir(NFCNDEFTag.prototype)
,行3 将转储属于正确协议 NFCNDEFTag
的正确数据,其余代码也运行良好;如果注释掉第 1 行,第 3 行将转储属于其他 protocols/objects 的不正确数据,例如 NSKeyValueCoding
和 UIAccessibilityAction
。我仍然不知道为什么会这样,感觉像是 NativeScript 问题,我在这里提交了一个问题 https://github.com/NativeScript/NativeScript/issues/9609
我重新构建了插件并在此处发布了包 https://github.com/cloudhx/nativescript-plugins
readerSessionDidDetectTags(session: NFCNDEFReaderSession, tags: NSArray<NFCNDEFTag> | NFCNDEFTag[]): void {
const prototype = NFCNDEFTag.prototype; // Line 1
const tag = (<NSArray<NFCNDEFTag>>tags).firstObject; // Line 2
console.dir(NFCNDEFTag.prototype); // Line 3
session.connectToTagCompletionHandler(tag, (error: NSError) => {
console.log('connectToTagCompletionHandler');
if (error) {
console.log(error);
session.invalidateSessionWithErrorMessage('Unable to connect to tag.');
this.errorCallback(error);
return;
}
const ndefTag: NFCNDEFTag = new interop.Reference<NFCNDEFTag>(interop.types.id, tag).value;
try {
NFCNDEFTag.prototype.queryNDEFStatusWithCompletionHandler.call(ndefTag, (status: NFCNDEFStatus, number: number, error: NSError) => {
console.log('queryNDEFStatusWithCompletionHandler');
// Code omitted for brevity
我 fork 了插件 nativescript-nfc 并为 iOS 实现了 NFC 写入功能,它在使用 NativeScript 6 时运行良好。但是如果我将插件升级到 7 或 8,写入就不会了'不起作用,NFCNDEFTag.prototype.queryNDEFStatusWithCompletionHandler
总是未定义的。
写入NFC的实现如下图
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;
}
const ndefTag: NFCNDEFTag = new interop.Reference<NFCNDEFTag>(
interop.types.id,
tag
).value;
try {
NFCNDEFTag.prototype.queryNDEFStatusWithCompletionHandler.call(
ndefTag,
(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;
NFCNDEFTag.prototype.writeNDEFCompletionHandler.call(
ndefTag,
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";
}
});
}
我不确定我是否以正确的方式为 NativeScript 7 或 8 实现它,但至少它适用于 6,我实际上不认为这是 NativeScript 7 和 8 中的错误。我们曾经为了使用这个插件而长期使用 6,但为了其他功能,确实需要升级到 7 或 8。
如有任何帮助、建议或评论,我们将不胜感激!
下面是不同 NativeScript 版本的代码库和分支。
回购:https://github.com/nordsense/nativescript-nfc
分支feature/upgrade-nativescript
:这是NativeScript 8,只读作品
分支nordsense
:这是NativeScript 6,读写都可以工作
你可以使用demo工程来测试,set ndef listener
是read,write Text
是write
我设法让它在 NS 8 上运行。参考下面的代码片段,如果在第 2 行之前访问 NFCNDEFTag.prototype
,就像第 1 行中的代码或使用 console.dir(NFCNDEFTag.prototype)
,行3 将转储属于正确协议 NFCNDEFTag
的正确数据,其余代码也运行良好;如果注释掉第 1 行,第 3 行将转储属于其他 protocols/objects 的不正确数据,例如 NSKeyValueCoding
和 UIAccessibilityAction
。我仍然不知道为什么会这样,感觉像是 NativeScript 问题,我在这里提交了一个问题 https://github.com/NativeScript/NativeScript/issues/9609
我重新构建了插件并在此处发布了包 https://github.com/cloudhx/nativescript-plugins
readerSessionDidDetectTags(session: NFCNDEFReaderSession, tags: NSArray<NFCNDEFTag> | NFCNDEFTag[]): void {
const prototype = NFCNDEFTag.prototype; // Line 1
const tag = (<NSArray<NFCNDEFTag>>tags).firstObject; // Line 2
console.dir(NFCNDEFTag.prototype); // Line 3
session.connectToTagCompletionHandler(tag, (error: NSError) => {
console.log('connectToTagCompletionHandler');
if (error) {
console.log(error);
session.invalidateSessionWithErrorMessage('Unable to connect to tag.');
this.errorCallback(error);
return;
}
const ndefTag: NFCNDEFTag = new interop.Reference<NFCNDEFTag>(interop.types.id, tag).value;
try {
NFCNDEFTag.prototype.queryNDEFStatusWithCompletionHandler.call(ndefTag, (status: NFCNDEFStatus, number: number, error: NSError) => {
console.log('queryNDEFStatusWithCompletionHandler');
// Code omitted for brevity