Неделю назад я разбирал, как работает счётчик касаний NFC: чип считает свои сканирования сам, приложение вставляет байты-заглушки, а метка при каждом касании подставляет вместо них живое число и свой ID в то, что на ней записано. Тот текст заканчивается там же, где заканчивается метка, то есть в момент, когда значения приходят на телефон.
С тех пор мне задают очевидный следующий вопрос: «отлично, метка отдала мне 049F50824F1390x000007, а дальше что?» Если ты на iPhone и хочешь что-то делать с этими значениями внутри быстрой команды, их надо разобрать. Это небольшая, но муторная работа со строками, и мне не хотелось бы, чтобы ты писал её сам.
Поэтому я собрал две быстрые команды и выкладываю их ссылками на iCloud. Первая работает мозгом. Вторая показывает этот мозг в деле.
Что тебе отдаёт метка
Перед командами короткое напоминание о том, что именно они получают, потому что от этого зависит способ применения.
На экране настройки счётчика касаний выбирается тип содержимого метки: ссылка, письмо, SMS или быстрая команда. Когда включаешь переключатели счётчика касаний и ID метки, приложение вставляет внутрь этого содержимого байты-заглушки, а чип при каждом чтении подменяет их живыми значениями. Если взять 049F50824F1390 как ID метки и 000007 как счёт, четыре типа содержимого выглядят так:
Ссылка:
https://nfc.cool/tap-counter/превращается вhttps://nfc.cool/tap-counter/?nfc=049F50824F1390x000007Текст письма:
Привет, вот моя карточка.превращается вПривет, вот моя карточка. 049F50824F1390x000007Текст SMS:
Заказ подтверждён!превращается вЗаказ подтверждён! 049F50824F1390x000007Вход быстрой команды:
log-entryпревращается вlog-entry 049F50824F1390x000007
Ссылка выше настоящая. Наша живая тестовая страница счётчика касаний читает значение ?nfc= прямо из собственной адресной строки, так что, если хочется увидеть подстановку до того, как писать свою автоматизацию, запиши метку со ссылкой на https://nfc.cool/tap-counter/, включи оба переключателя, поднеси метку, и страница покажет пришедшие ID и счёт.
Когда тип содержимого это быстрая команда, NFC.cool запускает выбранную команду через shortcuts://run-shortcut?name=Your%20Shortcut&input=text&text=<payload>, и дописанные значения NFC уже лежат в тексте. На вход команде приходит обычная текстовая строка. Твоя задача только вытащить из неё ID метки и счёт.
В зависимости от того, какие переключатели были включены при записи метки, придёт либо полный шаблон (14 шестнадцатеричных символов, x, затем ещё 6), либо только 14-символьный ID метки, либо только 6-символьный счёт. Парсер справляется со всеми тремя случаями.
Parse NFC Tap Counter: универсальный парсер
Установить Parse NFC Tap Counter
Эта команда и есть мозг. Никакого интерфейса, на вход один текст, на выходе словарь. Так задумано: служебная команда без интерфейса чисто встраивается во что угодно, а словарь проще всего разбирать из другой команды действием «Получить значение из словаря».
Вот что лежит в словаре:
tagID: 14-символьный шестнадцатеричный ID метки или пустая строка, если переключатель был выключен.count: число сканирований в десятичном виде (то есть000007превращается в7, а00000Aв10) или пусто, если переключатель был выключен.countHex: исходный шестизначный шестнадцатеричный счёт на случай, если нужен именно он. Пусто, если его нет.hasTagID,hasCount: логические значения для ветвления, чтобы можно было написать «Если hasCount истинно» и не проверять строку вручную.content: вход с аккуратно вырезанными данными NFC, чтобы остальная часть команды видела его таким, каким он был до того, как метка его приукрасила. Если на входе была ссылка с?nfc=..., вернётся ссылка без этого хвоста. Если текст письма с дописанным ID метки, вернётся текст без него.raw: исходный вход без изменений, вдруг захочется записать его в лог или откатиться к нему.
Чтобы вызвать команду из своей, нужно три действия:
«Получить вход быстрой команды» как текст (сюда приходят данные NFC).
«Запустить быструю команду» → Parse NFC Tap Counter, этот текст на вход. Выключи «Показывать при запуске», чтобы всё оставалось незаметным.
«Получить значение из словаря» → возьми
tagID,count,contentили те ключи, которые тебе нужны.
Вот и всё. Начиная с третьего шага делай со значениями что угодно: ветвись по hasTagID, пиши count в заметку, отправляй вебхук с JSON, что угодно. Парсер ничего не предполагает о том, что твоя команда хочет с результатом делать, и ровно поэтому он маленький и переиспользуемый.
Отдельно про счёт: в словаре это настоящее число, а не текстовая строка, поэтому его можно сразу подавать в «Вычислить» или в сравнение внутри «Если» без дополнительного преобразования. Перевод из шестнадцатеричного в десятичное уже сделан.
NFC Tag Alert: демонстрация
Эту демонстрацию я бы поставил в первый же день, даже если уведомления в боевом сценарии тебе не нужны. Она принимает текст на вход, запускает парсер и показывает одно уведомление с заголовком NFC Tag Scanned и двумя строками:
Tag ID: 049F50824F1390
Scans: 7Ставить её первой стоит потому, что это самая быстрая проверка метки со счётчиком. Запиши метку в NFC.cool Tools с типом содержимого быстрая команда и именем NFC Tag Alert, включи переключатели счётчика касаний и ID метки, запиши и поднеси. Всплывёт уведомление с настоящими значениями с твоей физической метки.
Если в уведомлении те значения, которых ты ждал, метка делает свою работу и можно переходить к чему-то посложнее. Если счёт неверный или ID метки отсутствует, значит дело в метке или в переключателях, выбранных при записи, а не в твоей команде. Отсечь целый класс вопросов в духе «а виноват ли вообще чип» стоит установки команды из пяти действий.
А если вдруг забудешь, как правильно вызывать парсер, эта команда ещё и минимальный рабочий пример. Открой её, посмотри на пять действий и перенеси структуру к себе.
Как встроить это в свою команду
Содержимое метки попадает в твою команду двумя путями. Парсер устраивают оба.
Через метку (содержимое типа «быстрая команда»). Запиши метку с типом содержимого быстрая команда, выбери свою команду по имени и включи нужные переключатели. Дальше каждое касание запускает твою команду, а данные NFC уже лежат во входе. Внутри команды вызови на этом входе Parse NFC Tap Counter, и tagID с count готовы к работе.
Через ссылку (содержимое типа «ссылка»). Случай более частый. На метке лежит ссылка, телефон открывает её при касании, а счёт едет следом как ?nfc=.... Если хочется, чтобы касание обрабатывала быстрая команда вместо браузера или вместе с ним, это можно: направь ссылку в команду, которая принимает веб-страницу Safari, и запусти на этой ссылке Parse NFC Tap Counter. Парсер аккуратно вырежет часть ?nfc= и вернёт ссылку без неё в поле content, так что её можно передать дальше в браузер, в вызов API или куда угодно ещё, где ждут обычную ссылку.
Вот пример из четырёх действий для сценария «записывать каждое сканирование в заметку»:
«Получить вход быстрой команды» как текст.
«Запустить быструю команду» → Parse NFC Tap Counter, вход как текст.
«Получить значение из словаря» → три обращения подряд за
tagID,countиcontent. Каждое сохрани в переменную.«Добавить в заметку» → одна строка вида
[текущая дата] tag=<tagID> count=<count> url=<content>.
Теперь у тебя есть живой журнал касаний, который ведёт сама метка. Ни бэкенда, ни сторонней аналитики, ни аккаунта где бы то ни было.
Несколько идей на развитие
Небольшой список того, что открывает парсер, записанный, чтобы не изобретать это с нуля:
Ветвление по ID метки. Одна команда, много меток. Добавь действие «Если» на каждый известный ID: считали метку у двери офиса, выключи уведомления, считали метку в студии, включи режим фокусирования, считали метку на кухне, запусти таймер. ID определяет конкретную физическую метку, а не содержимое, поэтому на всех метках может лежать одна и та же ссылка, а реакция всё равно будет разной.
Победитель на сканировании номер N. Соедини
hasCountсо сравнением. Еслиcountравен ста, отправь поздравление, а на всех остальных сканированиях работай как обычно. Порядок обеспечивает чип, команда просто его читает.Отправка на вебхук. Соедини это с вебхуками NFC.cool, если нужна серверная обработка без написания приложения под iOS: отправь разобранные значения как JSON, а дальше сервер разберётся сам. Два действия на iOS, и метка подключена ко всему, что говорит по HTTP.
Запись в файл или заметку. Самое простое и на удивление полезное. Дописывай
время, tagID, countв файл в iCloud Drive или в одну заметку, и получится журнал касаний, который потом можно листать или строить по нему график. Годится, чтобы отслеживать интерес к одной метке, не поднимая никакой инфраструктуры.
Если соберёшь на этом что-то интересное, мне правда хотелось бы посмотреть.
Короткое спасибо
Обе команды собраны в Shortcuts Playground, плагине Federico Viticci для создания быстрых команд iOS из обычного текста. Отличный инструмент, и я хочу поблагодарить автора за то, что он его выпустил: без него эти две команды заняли бы у меня заметно больше времени.
Короткое замечание про Android
«Быстрые команды» это приложение Apple, поэтому обе команды работают только на iPhone. А вот сам счётчик касаний работает на обеих платформах, потому что подстановка происходит внутри чипа, и ему всё равно, какой телефон читает метку. На Android типы содержимого «ссылка», «письмо» и SMS ведут себя так же, как на iOS, а если нужны похожие автоматизации, приложения вроде Tasker или MacroDroid возьмут ссылку с ?nfc=... и вытащат значения своими средствами работы со строками. Формат в эфире тот же самый.
Попробуй
Если хочется подробного объяснения, как счётчик касаний устроен изнутри, оно в прошлом тексте. А если хочется просто увидеть метку со счётчиком в деле, не поднимая свою автоматизацию, наша живая демонстрация счётчика касаний читает значение ?nfc= прямо из собственной ссылки: запиши метку, ведущую туда, поднеси её и смотри, как появляются счёт и ID метки.
Сам счётчик касаний живёт в NFC.cool Tools на iPhone и на Android. Полный набор того, что я построил вокруг NFC, собран на странице чтения и записи NFC.