我试图让Web通过Web NFC API工作,但我无法通过NotAllowedError: NFC permission request denied.的错误消息
我在Windows 10计算机上的Chrome89Dev上使用这个程序,源代码正在本地运行。
我也尝试过在互联网上发布的例子,包括Google样本,但它返回相同的错误。在这里,我并不担心它是实验性的,因为引用这确实表明它已经成功地通过了必要的测试,包括权限。
我正在使用的HTML/JS代码如下所示,我已经阅读了规格点9.3,但是我无法理解将它写成代码,那么这里是否有一个指导算法可以帮助解决这个问题呢?
async function readTag() {
if ("NDEFReader" in window) {
const reader = new NDEFReader();
try {
await reader.scan();
reader.onreading = event => {
const decoder = new TextDecoder();
for (const record of event.message.records) {
consoleLog("Record type: " + record.recordType);
consoleLog("MIME type: " + record.mediaType);
consoleLog("=== data ===\n" + decoder.decode(record.data));
}
}
} catch(error) {
consoleLog(error);
}
} else {
consoleLog("Web NFC is not supported.");
}
}
async function writeTag() {
if ("NDEFWriter" in window) {
const writer = new NDEFWriter();
try {
await writer.write("helloworld");
consoleLog("NDEF message written!");
} catch(error) {
consoleLog(error);
}
} else {
consoleLog("Web NFC is not supported.");
}
}
function consoleLog(data) {
var logElement = document.getElementById('log');
logElement.innerHTML += data + '\n';
};<!DOCTYPE html>
<html>
<head>
<script src="webnfc.js"></script>
</head>
<body>
<p>
<button onclick="readTag()">Test NFC Read</button>
<button onclick="writeTag()">Test NFC Write</button>
</p>
<pre id="log"></pre>
</body>
</html>
发布于 2020-12-13 00:58:41
来自https://web.dev/nfc/#security-and-permissions
Web仅适用于顶级框架和安全浏览上下文(仅限HTTPS)。源必须在处理用户手势时首先请求"nfc“权限(例如按钮单击)。如果之前未授予访问权限,则NDEFReader扫描()和write()方法将触发用户提示。
我想您是从file:// URL运行的,正如您所说的“本地”不支持的那样。
您需要使用https:// URL从本地web服务器托管它。
一旦进入正确的范围,尝试扫描或写入应该会触发用户提示。
还可以检查权限(请参阅https://web.dev/nfc/#check-for-permission )。
更新:
所以我尝试了示例页面https://googlechrome.github.io/samples/web-nfc/
这对我来说适用于Android Chrome 87,并启用了“试验性Web平台功能”
当你按下扫描按钮时,会弹出一个请求许可的对话框。
将此示例中的代码与您的代码进行比较,我注意到:-
ndef.addEventListener("reading" , ({ message, serialNumber }) => { ...如你所做的:-
ndef.onreading = event => { ...我不知道这是什么风格设置发生在事件或其他什么(嘿,这都是实验性的)
Update2从桌面支持的评论中回答这个问题。
所以你现在应该是一些桌面/浏览器的组合,将来可能会有更广泛的支持,因为这不再是实验性的标准。显然,正如您的测试链接所示,Linux上的Chrome应该能正常工作,因为这与Android的支持非常相似,所有的NFC设备处理都是由libnfc完成的,浏览器只需要了解这个库,而不是每种类型的usb或其他设备,而不是NFC。
从Windows上所看到的NFC支持来看,大部分关注的焦点是通过USB直接控制NFC读取器,将其作为另一种USB设备,而在Windows.Networking.Proximity API中也有类似的libnfc,我没有遇到任何NFC读取器说他们支持这个阅读器或任何使用它的人。
对于Mac来说,考虑到苹果在iOS支持NFC方面落后,我觉得他们的桌面支持会落后得更远,尽管它可能类似于Linux。
发布于 2020-12-15 11:27:20
正如您可以在https://web.dev/nfc/#browser-support上看到的那样,Web目前只支持Android,这就是为什么在"NotAllowedError: NFC permission request denied."上出现错误的原因。
https://stackoverflow.com/questions/65271299
复制相似问题