NFCタグの使い方とWeb NFC API
NFC(Near Field Communication)タグを触る機会がありました。
NFCは数センチの距離で通信する近距離無線通信の規格です。NFCという技術自体はスマホ決済などで日常的に使われていると思いますが、自分でタグを書き込んで使ったことがある人は少ないのではないかと思います。この記事では、NFCタグの基本的な仕組みと使い方をまとめつつ、ウェブブラウザからNFCを直接読み書きできる Web NFC API のサンプルを紹介します。

シールタイプのNFCタグ (wikimedia)
NFCタグの使いどころ
「かざすだけ」で何ができるのか、具体的な活用例をいくつか見ていきましょう。
ポートフォリオ・デジタル名刺
NFCタグに特定のURLを書き込んでおくと、カードにスマホをかざすだけで自動的にそのURLが開きます。自分のポートフォリオサイトや GitHubの URLを書き込んでおけば、そのままデジタル名刺として使えます。紙の名刺と違ってリンク先の情報量に制限がなく、QRコードと違ってカメラを起動する手間もありません。
勉強会・イベント運営での Wi-Fi共有
勉強会を主催すると、Wi-Fiの SSIDとパスワードを紙に印刷して回したりしますが、NFCタグに Wi-Fi情報を書き込んでおけば、タグをテーブルに貼っておくだけで参加者が接続できます(Androidのみ対応。iPhone向けの回避策は後述)。案内の手間が一気に減ります。
自宅の自動化トリガー
家の中にタグを貼っておいて、スマホをかざすと自動的に処理が行われるようにしておく使い方も一般的です。Googleで検索してみると、デスクに貼って作業用プレイリストを再生したり、玄関に貼って外出モード(Wi-Fiオフ、音楽停止)に切り替えたりする事例がたくさん出てきます。
iPhoneなら標準のショートカットアプリ、Androidなら Tasker や MacroDroid、Automate といった自動化アプリを使うのが一般的ですが、シンプルなものなら URLを書き込むだけで実現できます。例えばhttps://google.com/maps/ を書き込んでおけば Google Mapsが開きますし、SpotifyのプレイリストURLを書き込んでおけば、自動的に好きな曲を流すことができます。
NFCタグはアイデア次第で色々な活用方法が考えられるのですが、そのためにはデータの書き込みが必須です。
QRコードとの使い分け
NFCタグの活用例を調べていると、「これQRコードでよくない?」という疑問が浮かびます。実際、用途によってはQRコードのほうが適していることも多いので、両者を比較してみましょう。
| 観点 | NFC | QRコード |
|---|---|---|
| 速度 | タップするだけなので高速 | カメラを起動して読み取るので数秒かかる |
| 見た目 | デザインは自由で隠すこともできる | 白黒の四角で目立つ |
| 書き換え | 何度でも書き換え可能[1] | 印刷したら書き換え不可(印刷し直せば良い) |
| 同時アクセス | 一度にひとりしか読めない | スクリーンに投影すれば大人数が同時にスキャンできる |
| 直感性 | 「かざす」という動作の説明が必要 | カメラで読み取ることが広く知られている |
| デバイス機能との連携 | Bluetoothペアリング(Android)など、QRコードでは実現できない機能がある | URLを開く、Wi-Fi接続など基本的な機能のみ |
AndroidではBluetoothペアリングなどの一部を除けば、多くのことはQRコードで代替可能です。デザイン的に隠したい場合や繰り返し素早くアクセスしたい場合はNFCタグ、わかりやすさや同時アクセスが必要な場合はQRコード、と用途に応じて使い分けるのがよさそうです。
NFCタグへの書き込みかた
NFCタグにデータを書き込むには、専用アプリを利用する方法が一般的です。ただし、Androidの場合は Web NFC API を利用できるので、専用アプリ無しで書き込むこともできます。
専用アプリによる書き込み
ストアを検索すると、NFCの書き込みに対応したアプリがいくつか出てきますが、有名なのはNFCTools(Android版)です。使い方もとてもシンプルで、書き込みたい情報を入力したうえで「書き込む」ボタンを押して書き込み先のNFCタグをかざせば完了です。

Web NFC API を使った書き込み(Androidのみ)
Web NFC APIを使うとブラウザからNFCタグのデータを読み書きできます。ただし、Web NFC APIをサポートしているのはAndroidのChromeのみ(2026年3月時点)となっているので、iPhoneでは使えません。
練習がてら Web NFC API を使ってデータの読み書きできるサンプルページを用意したので、 Androidの方はぜひ使ってみてください。URL、テキスト、Wi-Fi接続情報、Bluetoothペアリング情報、vCard(連絡先)の書き込みと、タグの読み取りに対応しています。
NFCタグの選び方
一言でNFCと言ってもいくつか種類があります。実際には、通信規格やチップの違いによって複数のタイプに分かれています。代表的なものとしては、交通系ICカードなどで使われる「FeliCa(NFC-F)」や、クレジットカード・マイナンバーカードなどで使われる「ISO/IEC 14443 Type A / B」などがあり、それぞれ仕様が異なるのですべてが同じように扱えるわけではありません。
その中でも、スマートフォンで扱いやすく、一般的なNFCタグとして広く流通しているのが Type A系のタグ です。特にNXP社の NTAGシリーズ(NTAG213 / 215 / 216など) は事実上のデファクトスタンダードになっています。市販されているNFCタグの多くはこのNTAGシリーズ、もしくはその互換チップを採用しており、iPhone・Androidともに安定して読み書きできます。
NTAGにもいくつか種類があり、記録できる容量が異なります。記憶容量が大きいほど値段が高いですが、記憶容量以上にタグの形状(ステッカーやラベルなのか、カードタイプなのか、はたまた特殊素材なのか)のほうが値段への影響は大きいようです。
| NFCタグの種類 | ユーザー領域 | 主な用途 |
|---|---|---|
| NTAG213 | 144バイト | URLや短いテキストなど |
| NTAG215 | 504バイト | Amiibo、複数レコード、長めのURL |
| NTAG216 | 888バイト | vCard(連絡先情報)など大きめのデータ |
NFCの基礎知識
ここからはNFCの技術的な観点を見ていきましょう。
NDEF
NFCタグに書き込むデータの形式として NDEF(NFC Data Exchange Format) が広く使われています。NDEFではデータを「レコード」という単位で格納し、1つのタグに複数のレコードを書き込むことができます。レコードにはいくつかの型があり、代表的なものは以下のとおりです。
-
URIレコード: URLを格納。スマホでタグを読むとブラウザが開く。
https://open.spotify.com/playlist/xxxxxのようなディープリンク[2]を書き込めば、対応アプリが直接起動する - テキストレコード: プレーンテキストを格納
-
Wi-Fiレコード(Wi-Fi Simple Configuration): SSIDとパスワードを WSCバイナリ形式(TLV構造)で格納。MIMEタイプ
application/vnd.wfa.wscのレコードとして書き込む。 Androidなら読み取るだけで Wi-Fiに接続できる -
Bluetooth OOBレコード: Bluetoothの MACアドレスやデバイス名を OOB(Out of Band)形式で格納。MIMEタイプ
application/vnd.bluetooth.ep.oobのレコードとして書き込む。AndroidならかざすだけでBluetooth機器とのペアリングが始まる -
vCardレコード: 連絡先データを vCard 形式(
text/vcard)で格納。Androidではタグをかざすと連絡先保存ダイアログが表示される。ただしデータサイズが大きくなりがちなのでNTAG215以上が推奨される - MIMEタイプレコード: 任意のMIMEタイプのデータを格納
AndroidとiPhoneの挙動の違い
最近のAndroidやiPhoneは、どちらもNFCタグの読み込みに対応していますが、挙動がかなり違います。
AndroidもiPhoneも前述のNDEF(NFC Data Exchange Format) という共通フォーマットに対応しているため、NDEFメッセージの中身の読み取り自体はどちらでもできますが、読み取った後にOSがどこまで面倒を見てくれるか が大きく違います。
Android
Androidは NFCとの親和性が高く、NDEFの読み取りに加えて、OSレベルでさまざまなレコードタイプに対応しており、以下のような挙動となるようです。
- URIレコード: ブラウザが開いてURLに遷移
- Wi-Fiレコード: Wi-Fi Simple Configuration(WSC)形式のレコードを認識し、読み取っただけで自動的に Wi-Fiに接続してくれる[3]
-
Bluetoothペアリング: Bluetooth OOB データ(
application/vnd.bluetooth.ep.oob)をタグに書き込んでおくと、かざすだけで Bluetoothペアリングを開始できる - NFC 自動化: OS標準の自動化機能はないため、NFCタグをトリガーにした自動化(かざしたらアプリを起動する等)には前述のサードパーティアプリ(Tasker、MacroDroidなど)が必要
Androidは NFCを積極的サポートしているため、かざすだけで何かが起きるような体験を設計しやすいプラットフォームです。一方で、NFCタグについて検索すると出てくるような複雑な自動化についてはサードパーティのソフトが必要となります。
iPhone
iPhoneも NDEF に対応していますが、NDEFメッセージを読み取った後にOSが自動で処理してくれるレコードタイプがAndroidと比べて限定的です。
- URIレコード: 通知が表示され、タップするとブラウザが開く(Androidと違ってタップが必要)
- Wi-Fiレコード: NDEF としてデータは読み取れるものの、iOSは WSCレコードを自動処理する機能を実装していないため、Wi-Fiに自動接続されない。そのため、Wi-Fiへの接続を考えると、QRコードが捨てられません
- Bluetoothペアリング: iOSは Bluetooth OOBレコードに対応しておらず、NFC経由での Bluetoothペアリングはできません
- NFC 自動化: iOS標準の ショートカット アプリが NFCタグの読み取りをトリガーとしてサポートしており、サードパーティアプリなしでNFCタグをトリガーとした自動化を設定できる
つまり、Wi-FiやBluetoothといった「OS連携」はAndroidが得意で、NFCタグをトリガーにした自動化はiPhoneのほうが手軽に始められるという、面白い構造になっています。
iOS / Androidの UX ギャップを埋める
NFCタグを使うと、AndroidとiPhoneで体験に差が出るため、それを緩和できると良さそうです。ここでは、特にWi-Fi接続について両OS対応の工夫を紹介します。
Wi-Fi自動接続
Androidは NFCタグの WSCレコードから直接 Wi-Fiに接続できますが、iPhoneはできません。NFC での Wi-Fi 書き込みは WSCバイナリ(application/vnd.wfa.wsc)、QRコードでは WIFI:S:{SSID};T:WPA;P:{パスワード};; というテキスト形式と、フォーマットは異なりますが、どちらも SSIDとパスワードを伝えるという目的は同じです。そこで「Wi-Fiレコード + URL レコード」の2つを1枚のタグに書き込むと、複数レコードの扱いの違いを逆に利用できます。
- Android → 最初のレコード(Wi-Fi)が処理されて、Wi-Fiに自動接続
- iPhone → Wi-Fiレコードは無視して、URIレコードを検出してブラウザが開く
という挙動となるため、iPhone向けの URLを Wi-Fiの QRコードを表示するページにしておけば、iPhoneユーザーはQRコードを経由してWi-Fiに接続できます。

Web NFC サンプルアプリ では、Wi-Fiの SSIDとパスワードをクエリパラメータに設定するとQRコードが自動生成されるエンドポイントを用意しておき、iPhoneはそちらに飛ぶようにしています。
Bluetoothペアリング
NFCタグに Bluetoothの OOB(Out of Band)データを書き込んでおくと、Androidではタグをかざすだけで Bluetoothペアリングが開始されます。NFC非搭載の Bluetoothスピーカーやヘッドホンでも、横にタグを貼っておけばワンタッチ接続のような体験を実現できます。書き込みには接続先の MACアドレスが必要ですが、Androidの設定画面(接続済みデバイス → デバイス詳細)から確認できます。
iPhoneはこのレコードタイプに対応していないので、従来どおり設定画面からペアリングする必要があります。Wi-Fiのように QRコードで代替することもできません(Bluetooth には iPhoneのカメラが認識できる標準的な QRフォーマットがないため)。ここは素直に Androidだけと割り切るのがよさそうです。
Web NFC APIの基本的な使い方
ここでは、Web NFC APIの基本的な使い方を紹介します。実際に動くサンプルコードはこちらで試せます。
URLの書き込み
URLの書き込みはシンプルです。
const ndef = new NDEFReader();
await ndef.write({
records: [{ recordType: "url", data: "https://example.com" }]
});
write() を呼ぶとNFCタグの待ち受け状態になり、タグをかざすと書き込みが実行されます。
タグの読み取り
scan() を呼ぶとスキャンモードに入り、タグをかざすと onreading イベントが発火します。ユーザーのジェスチャー(ボタンクリックなど)をトリガーにする必要がある点に注意してください。
const reader = new NDEFReader();
document.getElementById("scan-button").addEventListener("click", async () => {
await reader.scan();
console.log("スキャン開始...");
reader.onreading = (event) => {
const { serialNumber, message } = event;
console.log(`シリアル番号: ${serialNumber}`);
for (const record of message.records) {
console.log(`レコードタイプ: ${record.recordType}`);
if (record.recordType === "url") {
const url = new TextDecoder().decode(record.data);
console.log(`URL: ${url}`);
} else if (record.recordType === "text") {
const text = new TextDecoder().decode(record.data);
console.log(`テキスト: ${text}`);
}
}
};
});
Wi-FiとBluetoothの書き込み
URLやテキストの書き込みと異なり、Wi-FiやBluetoothの接続情報をNFCタグに書き込むには、規格で定められたバイナリ形式でデータを構築する必要があります。
-
Wi-Fi情報: Wi-Fi Simple Configuration(WSC)形式のバイナリを構築し、MIMEタイプ
application/vnd.wfa.wscとして書き込む -
Bluetooth情報: OOB(Out of Band)形式のバイナリを構築し、MIMEタイプ
application/vnd.bluetooth.ep.oobとして書き込む
実装例はサンプルアプリのGitHubリポジトリで確認できます。特に index.html の WSC オブジェクトと BT オブジェクトを参考にしてください。
まとめ
NFCタグの基本的な使い方と仕組みについてまとめました。
-
NFCタグの選び方:
- NXP社のNTAGシリーズ(213/215/216)もしくはその互換品が一般的
- URLなら144バイトで十分だが、複数レコードなら504バイト以上が推奨される
- 価格は容量よりも形状(シール/カード/特殊素材)で変わる
-
書き込み方法:
- NFCToolsアプリを使えば、iPhoneでもAndroidでも簡単に書き込める
- Android + Chromeなら、Web NFC APIでブラウザから直接書き込みも可能
-
AndroidとiPhoneの違い:
- どちらもNDEF形式に対応しているが、OSが自動処理してくれる範囲が異なる
- Androidは Wi-Fi自動接続やBluetoothペアリングなどOS連携が得意
- iPhoneは標準のショートカットアプリでNFCトリガーの自動化が手軽
- Wi-Fiレコード + URLレコードの複数レコードを活用することで、両OSの体験の差を緩和できる
-
QRコードとの使い分け:
- NFCは素早いアクセス、デザインの自由度、書き換え可能という利点がある
- QRコードはわかりやすさ、同時アクセスという利点がある
ぜひ手元のタグで試してみてください。
最後に
Ubieでは、正社員のエンジニアに加え、学生インターンを募集中です。興味のある方はお気軽にお声がけください。
-
NFCタグにはロック機能もあるので、書き換えを防止することもできます。 ↩︎
-
iOSでは Universal Links、Androidでは App Links と呼ばれる仕組みで、
https://の URL でもアプリが直接開きます。spotify:のようなカスタム URL スキームもありますが、https://形式のほうがアプリ未インストール時にブラウザでフォールバックできるので扱いやすいです。 ↩︎ -
Wi-Fi Simple Configuration(WSC)は Wi-Fi Alliance が定める規格で、NFCタグに SSID やパスワードを格納する方式を定義しています。Androidはこの WSCレコードを OSレベルで認識し、Wi-Fi 設定画面を経由せずに直接接続します。 ↩︎
Discussion