Библиотека MAX Bridge — тот самый window.WebApp, через который мини-приложение получает доступ к камере, буферу обмена, биометрии и ещё дюжине системных возможностей телефона. Из пятнадцати подсистем библиотеки четырнадцать работают одинаково на Android и iOS. Пятнадцатая — NFC-модуль — работает только на одной из них, и даже там умеет заметно меньше, чем кажется по названию.
Единственная подсистема только для Android
Документация MAX Bridge описывает работу с NFC одной короткой фразой:
Работа с NFC-модулем доступна через объект NfcManager.
Раздел «Функциональность библиотеки», dev.max.ruСразу следом — предупреждение, которого нет ни у одной из четырнадцати других подсистем той же библиотеки (данные инициализации, экран, номер телефона, ссылки, файлы, шеринг, QR-коды, кнопка «Назад», два вида хранилища, биометрия, тактильные отклики):
Методы этого объекта поддерживаются только для Android.
Раздел «NFC-модуль», dev.max.ruДля мини-приложения, открытого на iPhone, объекта NfcManager в собственном смысле просто нет — вызывать его методы там не для чего, платформа не выполняет ни одного из них.
Три проверки вместо одной
Прежде чем звать любой другой метод, документация требует вызвать window.WebApp.NfcManager.init(). Он возвращает не простое «да» или «нет», а объект из трёх независимых полей, каждое из которых описано отдельно:
Available boolean — проверка наличия NFC-модуля на устройстве пользователя.
Таблица свойств NfcInfo, dev.max.ruEnabled boolean — проверка включения NFC-модуля в настройках системы.
Таблица свойств NfcInfo, dev.max.ruОтозвал ли пользователь разрешение использовать NFC-модуль для текущего мини-приложения в настройках приватности MAX.
Таблица свойств NfcInfo, поле accessRevoked, dev.max.ruПервое поле проверяет железо, второе — системный тумблер NFC, который выключен на большинстве телефонов по умолчанию. А третье — это отдельное разрешение внутри самого MAX: пользователь может держать NFC включённым в системе и всё равно запретить конкретному мини-приложению им пользоваться, в настройках приватности мессенджера, а не телефона. В интерфейсе TypeScript поле accessRevoked помечено вопросительным знаком — необязательное, оно появляется в ответе не всегда.
Переход в настройки, который срабатывает не всегда
Если проверка показала, что NFC выключен, мини-приложение может одной командой отправить пользователя в системные настройки:
Открывает страницу системных настроек доступа к NFC-модулю и вызывает закрытие мини-приложения.
window.WebApp.NfcManager.openSystemSettings(), dev.max.ruУ метода есть условие, которое легко упустить при чтении по диагонали:
Если пользователь не отключал NFC-модуль, то переход не будет выполнен.
dev.max.ruТо есть кнопка «включить NFC» в интерфейсе бота не может звать этот метод вслепую при каждом нажатии — переход и закрытие мини-приложения произойдут только тогда, когда NFC действительно выключен. Если пользователь просто отозвал доступ для этого мини-приложения (поле accessRevoked), сам NFC на телефоне остаётся включённым — и метод молча ничего не откроет.
Эмулировать метку — не значит прочитать чужую
У объекта NfcManager всего четыре метода: init(), isInited, openSystemSettings() и один рабочий — emulateNfcTag(nfctag). Ни один из них не отвечает за сканирование чужой метки или банковской карты. Документация описывает единственное действие, доступное разработчику:
Запускает через NFC-модуль передачу данных, полученных из мини-приложения.
window.WebApp.NfcManager.emulateNfcTag(nfctag), dev.max.ruНазвание метода — не фигура речи: телефон в этом режиме не читает метку, а сам становится ей, транслируя переданную мини-приложением строку в сторону считывающего терминала. Остановить трансляцию можно тем же методом, не выключая NFC:
Если не передать данные NFC-метки, то вещание будет остановлено.
dev.max.ruТот же трюк уже работает без единой строчки кода
Ровно этот физический приём — телефон вместо карты — в MAX уже встроен в интерфейс, но как готовая функция, а не программный интерфейс для мини-приложений. Справка MAX описывает Цифровой ID:
С помощью неё вы можете предъявить документы из Цифрового ID для подтверждения совершеннолетия или льготного статуса, приложив телефон с NFC к терминалу.
Справка MAX, «Как подключить NFC для Цифрового ID»Устройство пересказывает эту функцию в отдельном разборе — как приложить телефон к терминалу для Цифрового ID. Разница в адресате: там телефон транслирует один заранее выпущенный документ через встроенный экран настроек, здесь — любую строку, которую соберёт само мини-приложение через emulateNfcTag. Механизм передачи один и тот же, но для сторонних мини-приложений он не автоматический — им нужно пройти три проверки из предыдущего раздела и вызвать метод самим.
Ошибка без списка кодов
Про отказ методы объекта договариваются одной общей фразой:
Большинство методов возвращают Promise-объекты, и в случае ошибки вызывается reject.
dev.max.ruСтруктура объекта ошибки — { error: { code: string } }. Само поле code — просто строка: страница не прикладывает таблицу значений, которые оно может принять, ни для NFC, ни для остальных методов Bridge. Различить «модуль выключен», «доступ отозван» и «телефон не поддерживает NFC» после отказа придётся заранее — тем самым методом init(), а не разбором кода ошибки.
Частые вопросы
Работает ли NFC в мини-приложении MAX на iPhone?
Нет. Документация прямо пишет, что методы объекта NfcManager поддерживаются только для Android — на iOS вызывать их не для чего.
Может ли мини-приложение MAX прочитать чужую NFC-метку или карту?
Нет. У объекта NfcManager всего четыре метода, и ни один из них не читает входящий сигнал — единственное действие, emulateNfcTag, заставляет телефон самому транслировать данные, как будто это он и есть метка.
Почему проверка NFC возвращает три поля, а не одно?
Потому что «не работает» может означать разное: available — на устройстве вообще нет модуля, enabled — модуль выключен в настройках телефона, accessRevoked — пользователь отдельно запретил именно этому мини-приложению пользоваться NFC внутри самого MAX.
Как понять причину ошибки NFC в мини-приложении?
Объект ошибки содержит только строковый код без опубликованного списка значений. Надёжнее сначала вызвать init() и проверить available/enabled/accessRevoked по отдельности, чем разбирать код после отказа.
Развиваете канал или бота в MAX?
Добавьте его в каталог MaxOfficial — читатели находят каналы через поиск и подборки, а статистика копится автоматически.
Добавить канал в каталог







