您如何从 web-nfc API 获取权限?

Posted

技术标签:

【中文标题】您如何从 web-nfc API 获取权限?【英文标题】:How do you obtain permissions from web-nfc API? 【发布时间】:2020-12-13 00:32:43 【问题描述】:

我正在尝试让 Web NFC 通过Web NFC API 工作,但我无法通过NotAllowedError: NFC permission request denied. 的错误消息来处理它

我在 Windows 10 计算机上的 Chrome 89 Dev 上使用它,源代码正在本地运行。

我也尝试了互联网上发布的示例,包括Google sample,但它返回相同的错误。我不担心它在这一点上是实验性的,因为提到 this 确实表明它已经成功通过了必要的测试,包括权限。

我正在使用的 html/JS 代码如下,我已经阅读了specification point 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>

【问题讨论】:

【参考方案1】:

来自https://web.dev/nfc/#security-and-permissions

Web NFC 仅适用于***框架和安全浏览上下文(仅限 HTTPS)。 Origins 在处理用户手势(例如单击按钮)时必须首先请求“nfc”权限。如果之前未授予访问权限,则 NDEFReader scan() 和 write() 方法会触发用户提示。

我猜你是从file:// URL 运行的,正如你所说的“本地”,这是不受支持的。 您需要使用 https:// URL 从本地 Web 服务器托管它

一旦在正确的范围内尝试扫描或写入应该会触发用户提示。

您也可以查看权限查看https://web.dev/nfc/#check-for-permission

更新: 所以我尝试了示例页面https://googlechrome.github.io/samples/web-nfc/

这适用于我在启用了“实验性 Web 平台功能”的 android Chrome 87 上

当您点击扫描按钮时,会弹出一个询问权限的对话框。

将此示例中的代码与您的代码进行比较,我发现确实如此:-

ndef.addEventListener("reading" , ( message, serialNumber ) =>  ...

和你一样:-

ndef.onreading = event =>  ...

我不知道是样式设置在 Event 上发生了什么还是其他什么(嘿,这都是实验性的)

更新2 回答来自桌面支持的 cmets 的问题。

因此,您目前应该是一些桌面/浏览器组合,并且将来可能会有更广泛的支持,因为这不再是实验性标准。显然,正如您的测试链接所建议的那样,Linux 桌面上的 Chrome 应该可以工作,因为这与 Android 支持非常相似,所有 NFC 设备处理都由 libnfc 完成,浏览器只需要知道这个库而不是每种类型的 usb 或其他NFC 的设备。

从 Windows 上的 NFC 支持来看,其中大部分都集中在通过 USB 直接控制 NFC 阅读器作为另一个 USB 设备,而 Windows.Networking.Proximity API 中有一个等效的 libnfc 我没有遇到任何 NFC读者说他们支持这个或任何使用它的人。

对于 Mac Deskstop,鉴于 Apple 在 ios 中的 NFC 支持方面落后,我认为他们的桌面支持将更加落后,即使它可能类似于 Linux。

【讨论】:

好的,所以我已经集成了权限代码并将其托管到 tina.rf.gd (检查页面的源代码),现在我不确定发生了什么,因为我什至不能让它在控制台或用户提示中显示任何内容。 更新了答案,因为我能够让其他一些示例代码工作。 搞乱了代码,我终于让它与您的代码更改一起工作;谢谢你!你认为这些结果可以在桌面浏览器上重复吗?我已经看到桌面 Chrome 支持的许多成功(例如wpt.fyi/results/…),但我不确定为什么它没有以相同的方式处理它,即使使用连接的 NFC 阅读器:// 添加了关于桌面支持的更新,因为测试结果的链接显示 Linux 上的 Chrome 支持应该和 Android 上的一样好(因为引擎盖它们真的是一回事) 嘿@andrew 我刚刚读回你关于在 Linux 上运行的 libnfc 的最新答案;似乎您对如何有机会在浏览器中链接 libnfc 有粗略的想法?我让它在终端上独立工作,我正在试图弄清楚如何将它整合到 Web 应用程序中,那么你有什么建议吗?【参考方案2】:

正如您在 https://web.dev/nfc/#browser-support 上看到的那样,Web NFC 目前仅支持 Android,这就是您在 Windows 上收到 "NotAllowedError: NFC permission request denied." 错误的原因。

【讨论】:

很高兴知道,谢谢!-- Windows 支持和 API 是否正在进行任何试验? 暂时没有。

以上是关于您如何从 web-nfc API 获取权限?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取 Azure AD 应用程序的 Graph API 权限指南?

握手API网关調用 API 网关 暴露的 开放 API

如何获取 Facebook 公共页面内容访问权限只是为了提取数据?

使用 API 获取用户域组列表,无需管理员权限

您如何从 Azure Active Directory 中获取搭建的 Weather Forecast Api 将接受的访问令牌?

winform如何从DataGridView中从右键菜单获取一行数据