Как вы получаете разрешения от web-nfc API?

Я пытаюсь заставить Web NFC работать через Web NFC API, но не могу получить сообщение об ошибке NotAllowedError: NFC permission request denied.

Я использую это в Chrome 89 Dev на компьютере с Windows 10, и исходный код запускается локально.

Я также пробовал примеры, размещенные в Интернете, в том числе пример 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>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
2 766
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

От https://web.dev/nfc/#security-and-permissions

Web NFC доступен только для фреймов верхнего уровня и безопасных контекстов просмотра (только HTTPS). Origins должен сначала запросить разрешение «nfc» при обработке пользовательского жеста (например, нажатия кнопки). Методы NDEFReader scan() и write() запускают запрос пользователя, если доступ не был ранее предоставлен.

Я предполагаю, что вы работаете с URL-адреса file://, как вы сказали, «локально», который не поддерживается.
Вам необходимо разместить его на локальном веб-сервере, используя URL-адрес https://.

После того, как вы попали в нужную область, попытка сканирования или записи должна вызвать запрос пользователя.

Вы также можете проверить разрешения, см. https://web.dev/nfc/#check-for-permission

Обновление:
Поэтому я попробовал пример страницы https://googlechrome.github.io/samples/web-nfc/

И это работает для меня на Android Chrome 87 с включенными «Экспериментальными функциями веб-платформы».

Когда вы нажмете кнопку сканирования, появится диалоговое окно с запросом разрешения.

Сравнивая код в этом образце с вашим, я заметил, что он делает: -

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

Где, как у вас: -

ndef.onreading = event => { ...

Я не знаю, то ли это настройка стиля, что происходит на событии, или что-то еще (Эй, это все экспериментально)

Обновление2 Чтобы ответить на вопрос из комментариев службы поддержки Desktop.

Таким образом, на данный момент вы должны использовать некоторые из комбинаций рабочего стола / браузера, и, возможно, в будущем будет более широкая поддержка, поскольку это больше не экспериментальные стандарты. Очевидно, что ваша тестовая ссылка предполагает, что Chrome на рабочем столе Linux должен работать, поскольку это действительно похоже на поддержку Android, при этом вся обработка устройств NFC выполняется libnfc, и браузер просто должен знать об этой библиотеке, а не о каждом типе USB или другом устройстве, чем может сделать NFC.

Из того, что видно из поддержки NFC в Windows, большая часть этого сосредоточена на прямом управлении считывателем NFC через USB как просто еще одним USB-устройством, в то время как в Windows.Networking.Proximity API есть эквивалент libnfc. Я не встречал ни одного считывателя NFC, говорящего, что они поддерживают это или кто-нибудь, кто его использует.

Что касается Mac Desktop, учитывая, что Apple отстает от поддержки NFC в iOS, я чувствую, что их поддержка настольных компьютеров будет еще дальше, хотя она может быть похожа на Linux.

Итак, я интегрировал код разрешений и разместил его на tina.rf.gd (проверьте страницу на наличие исходных кодов), и теперь я не уверен, что происходит, поскольку я даже не могу получить его. отображать что-либо в консоли, ни приглашение пользователя.

rxm 13.12.2020 04:49

Обновил ответ, так как мне удалось заставить работать другой пример кода.

Andrew 13.12.2020 16:00

Возился с кодом, и я, наконец, заставил его работать с вашим изменением кода; Спасибо! Как вы думаете, можно ли повторить эти результаты в десктопном браузере? Я видел много успехов в поддержке настольного Chrome (например, wpt.fyi/results/…), но я не уверен, почему он не обрабатывает его таким же образом, даже с подключенным считывателем NFC ://

rxm 15.12.2020 01:34

Добавлено обновление о поддержке настольных компьютеров, так как ссылка на результаты тестирования показывает, что поддержка Chrome в Linux должна быть такой же хорошей, как и на Android (потому что на самом деле это одно и то же).

Andrew 15.12.2020 11:28

Понятно! Большое спасибо за то, что поделились своим мнением - это очень ценно :)

rxm 15.12.2020 23:27

эй, @andrew, я только что перечитал твой обновленный ответ о том, что libnfc работает в Linux; похоже, у вас есть приблизительное представление о том, как можно связать libnfc в браузере? У меня он работает отдельно от терминала, и я пытаюсь понять, как я могу включить его в веб-приложение, так что у вас есть какие-нибудь советы по этому поводу?

rxm 08.02.2021 23:43

Извините, что нет советов, это было просто общее наблюдение того, как nfc обрабатывается на низком уровне в различных ОС и, возможно, насколько сложно для разных разработчиков браузеров добавить поддержку этого стандарта. У меня нет внутренней информации о различных планах или сроках веб-браузера, чтобы добавить поддержку в различных ОС.

Andrew 09.02.2021 00:29

Ага, стоит попробовать! В любом случае спасибо за вашу помощь @andrew :)

rxm 09.02.2021 00:37

Как вы можете прочитать на https://web.dev/nfc/#browser-support, Web NFC пока поддерживает только Android, поэтому вы получаете ошибку "NotAllowedError: NFC permission request denied." в Windows.

Полезно знать, спасибо! Проводятся ли испытания поддержки Windows и API?

rxm 15.12.2020 23:28

На данный момент их нет.

François Beaufort 16.12.2020 06:12

Другие вопросы по теме