コンテンツへスキップ

← NFC.cool Blogに戻る

iOSショートカットでNFCタップカウンターのデータを取り出す

NFCステッカーをタップしたあと、タグIDとスキャン回数を表示するアラートが出ているiPhone

一週間前、NFCタップカウンターの仕組みを紹介しました。チップが自分のスキャンを数え、アプリがプレースホルダのバイト列を埋め込み、タグがタップのたびに、自分が運んでいる内容にライブのカウントとタグIDを差し込む - そういう話でした。あの記事はタグが仕事を終えるところ、つまり値があなたの電話に届いたところで終わっています。

それ以来、当然の次の疑問をよく聞きます。「いいね、タグが049F50824F1390x000007を渡してきた - で、ここからどうすればいいの。」もしあなたがiPhoneを使っていて、ショートカットの中でこれらの値に反応させたいなら、文字列をばらして取り出す必要があります。これは小さいけれど少々面倒な文字列処理で、それをあなたに書かせたくはありません。

そこで、ショートカットを2つ作って、iCloudのリンクとして共有することにしました。1つは頭脳。もう1つは、その頭脳を使うデモです。


タグがあなたに渡してくるもの

ショートカットの話に入る前に、それらが実際に何を受け取るかを軽くおさらいしておきます。使い方の理解に関わるからです。

タップカウンターの設定画面で、タグが配信する種類を選びます。URL、メール、SMS、またはショートカットです。タップカウンターやタグIDのスイッチをオンにすると、アプリはその内容の中にプレースホルダのバイト列を埋め込み、チップは読み取りごとにそれをライブの値で置き換えます。タグIDを049F50824F1390、カウントを000007とすると、4つの種類は最終的にこんな見た目になります。

  • URL: https://nfc.cool/tap-counter/https://nfc.cool/tap-counter/?nfc=049F50824F1390x000007 になります

  • メール本文: こんにちは、私のカードです。こんにちは、私のカードです。 049F50824F1390x000007 になります

  • SMS本文: ご注文を承りました!ご注文を承りました! 049F50824F1390x000007 になります

  • ショートカット入力: log-entrylog-entry 049F50824F1390x000007 になります

上のURLは本物です。私たちのタップカウンターのライブデモページは、自身のアドレスバーから?nfc=の値を直接読み取るように作ってあります。だから、自分でオートメーションを組む前に置き換えの様子を見ておきたければ、https://nfc.cool/tap-counter/を指すタグを両方のスイッチオンで書き込み、タップしてください。ページが、たった今受け取ったタグIDとカウントを表示します。

種類がショートカットのとき、NFC.coolは選んだショートカットをshortcuts://run-shortcut?name=Your%20Shortcut&input=text&text=<payload>という形で起動します。NFCの値はすでにテキストに付加された状態です。つまり、あなたのショートカットへの入力はただのテキスト文字列であり、唯一の仕事はそこからタグIDとカウントを取り出すことです。

書き込み時にどのスイッチがオンだったかによって、受け取るのはフルパターン(16進14桁、x、16進6桁)、14桁のタグIDだけ、あるいは6桁のカウントだけのいずれかです。パーサーは3つすべてに対応します。


Parse NFC Tap Counter - 再利用できるパーサー

Parse NFC Tap Counterをインストール

こちらが頭脳です。UIを一切出さず、テキスト入力を1つ受け取り、辞書を返します。これは意図したものです - UIのないユーティリティ・ショートカットは、あなたが作る何にでもきれいに組み込めますし、辞書は他のショートカットから組み込みの辞書から値を取得アクションで読み出すのに最も扱いやすい形だからです。

辞書の中身はこうなっています。

  • tagID - 16進14桁のタグID。スイッチがオフだったときは空文字。

  • count - スキャン回数を10進数の数値で(0000077に、00000A10になります)。オフだったときは空。

  • countHex - 元の16進6桁のカウント。そのまま使いたい場合のために残してあります。なければ空。

  • hasTagIDhasCount - 分岐用のブール値。文字列をいちいち調べなくてももしhasCountが真と書けます。

  • content - 入力から付加されたNFC値をきれいに取り除いたもの。タグが付け足す前の入力をショートカットの残りの処理に渡せます。入力が?nfc=...付きのURLなら、その部分なしのURLが戻り、タグIDが末尾に付いたメール本文なら、付加部分なしの本文が戻ります。

  • raw - 加工していない元の入力。ログに残したい、あるいはフォールバック用に使いたいときに。

自分のショートカットからパーサーを呼び出す手順は、3アクションです。

  1. ショートカットの入力をテキストとして受け取ります(ここにNFCのペイロードが届きます)。

  2. ショートカットを実行 -> Parse NFC Tap Counterに、そのテキストを入力として渡します。実行時に表示はオフにして、見えないままにします。

  3. 辞書から値を取得 -> tagIDcountcontent、あるいは必要なキーを選びます。

これで終わりです。ステップ3から先は、hasTagIDで分岐する、countをメモに残す、JSONをWebhookに送るなど、好きに使えます。パーサーは、結果をあなたのショートカットでどう扱うかには口を出しません。だからこそ小さく、再利用が効きます。

カウントについて補足を1つ。辞書の中で本物の数値として返るので、テキスト文字列ではありません。そのまま計算アクションやifの比較に流し込めて、もう一度変換する必要はありません。16進から10進への変換は済んでいます。


NFC Tag Alert - デモ

NFC Tag Alertをインストール

本番でアラートを使うつもりがなくても、私なら初日にこれを入れます。テキストのショートカット入力を受け取り、パーサーを通し、NFC Tag Scannedというタイトルの1枚のアラートに2行で表示します。

Tag ID: 049F50824F1390
Scans: 7

最初に入れる理由は、カウンター付きのタグの正気度チェックとして最速だからです。NFC.cool Toolsで種類をショートカット、名前をNFC Tag Alertにし、タップカウンターとタグIDのスイッチをオンにしてタグを書き込み、タップします。物理タグから取れた実際の値で、アラートが出ます。

期待した値が出ていれば、タグはちゃんと仕事をしています。もっと凝ったものを作りに進んでかまいません。カウントが違っていたりタグIDが空だったりすれば、原因がタグ(または書き込み時に選んだスイッチ)側であって、あなたのショートカット側ではないと切り分けられます。「これ、そもそもチップのせいなのか」という丸ごと1カテゴリのデバッグを消せるだけで、5アクションのショートカットを入れる価値があります。

パーサーの正しい呼び出し方が知りたくなったときも、このショートカットはその最小の実例です。中を開いて5つのアクションを眺め、その並びを自分のショートカットに写してください。


自分のショートカットに組み込む

タグの内容があなたのショートカットに渡ってくる経路は2つあります。パーサーはどちらにも対応します。

タグ起点(種類「ショートカット」)。 種類をショートカットにしてタグを書き込み、ショートカットを名前で選び、好きなスイッチをオンにします。これでタップのたびに、NFCのペイロードがすでに入力に入った状態であなたのショートカットが起動します。あなたのショートカットの中でその入力に対してParse NFC Tap Counterを実行すれば、tagIDcountが手に入ります。

URL起点(種類「URL」)。 こちらのほうが一般的です。タグがURLを運び、タップで電話がそのURLを開き、カウントが?nfc=...として一緒に流れてきます。ブラウザの代わりに(あるいは加えて)ショートカットにそのタップを処理させたい場合は、Safariのウェブページを入力として受けるショートカットを用意し、URLに対してParse NFC Tap Counterを実行します。パーサーは?nfc=の部分をきれいに切り離し、付加部分のないURLをcontentとして返します。これをそのままブラウザ、API呼び出し、あるいはきれいなURLを期待するどんな先にも渡せます。

「すべてのスキャンをAppleの「メモ」にメモとして残す」例を4アクションで示します。

  1. ショートカットの入力をテキストとして受け取る。

  2. ショートカットを実行 -> Parse NFC Tap Counterに入力をテキストとして渡す。

  3. 辞書から値を取得 -> tagIDcountcontentについて続けて3回呼び、それぞれを変数に入れる。

  4. メモに追加 -> [現在の日付] tag=<tagID> count=<count> url=<content>のような1行を追記する。

これで、タグ自身が書く稼働中のタップ・ログができました。バックエンドも、外部の解析も、どこかのアカウントも要りません。


さらに伸ばすためのアイデア

パーサーが解禁する小さな小道具を、ゼロから考えなくていいように並べておきます。

  • タグIDで分岐する。 1つのショートカットで多数のタグを扱う。既知のタグIDごとにifアクションを置けば、職場のタグがスキャンされたら通知をミュート、スタジオのタグなら集中モード、キッチンのタグならタイマー開始、といった具合です。タグIDは内容ではなく物理タグそのものを識別するので、すべてのタグに同じURLを書きながら、1枚ずつ別の反応をさせられます。

  • N回目のスキャンで当選を決める。 hasCountと比較を組み合わせます。countが100なら祝意のメッセージを出し、それ以外は通常処理をする。順序を守るのはチップで、ショートカットはそれを読むだけです。

  • Webhookに送る。 iOSアプリを書かずにサーバー側で受けたいなら、NFC.coolのWebhook機能と組み合わせます。解析した値をJSONとして送り、あとはサーバーに任せます。iOS側はアクション2つで、HTTPを話す何にでもタグをつなげます。

  • ファイルやメモに残す。 いちばん地味で、意外と効くものです。iCloud Driveのファイルや1枚のメモにタイムスタンプ, tagID, countを追記していけば、あとから見返せる、あるいは可視化できるタップ・ログが手に入ります。インフラを立てずに1枚のタグのエンゲージメントを追うのに向いています。

これらで何か面白いものを作ったら、ぜひ見せてほしいです。


ひとことお礼を

この2つのショートカットは、Federico ViticciさんのプラグインShortcuts Playgroundで作りました。自然言語からiOSショートカットを生成できる素晴らしいツールです。これを公開してくれたFedericoさんに感謝します。これがなければ、この2つを組み立てるのにもっと時間がかかっていたはずです。


Androidへの短い補足

ショートカットはAppleのアプリなので、この2つはiPhone専用です。ただ、タップカウンター機能そのものは両方のプラットフォームで動きます。置き換えはチップの中で起きるので、どの電話がタグを読むかは関係ありません。AndroidでもURL、メール、SMSの種類はiOSと同じように振る舞います。同じようなオートメーションをしたいなら、TaskerやMacroDroidのようなアプリが?nfc=...付きのURLを受けて、自前の文字列処理アクションで値を取り出せます。タグ上のフォーマットは同じです。


試してみる

タップカウンターが裏側で実際にどう動くかの詳しい解説は、前回の記事にあります。自分でオートメーションを組む前にカウンター付きタグの動きを見たければ、タップカウンターのライブデモが自身のURLから直接?nfc=の値を読み取って表示します。そこを指すタグを書いて、タップして、カウントとタグIDが出てくる様子を見てみてください。

NFCタップカウンター機能そのものは、NFC.cool ToolsのiPhone版とAndroid版に入っています。私が作り上げたNFCツールキット全体を見るには、NFCリーダー&ライター機能をご覧ください。