NFCを使って何ができるか試してみた話

この記事は、[Supershipグループ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/supership)の6日目の記事になります。 

##はじめに
こちらの記事はアプリ開発エンジニアなどの専門家ではなく、素人がちょっと試してみたお手軽な話です。
NFCって何？食べれるの？美味しいの？
なんとなくsuicaのことでしょ、ぐらいの知識の方向けに、少し試してみた内容をお伝えする記事です。
技術的にNewなトピック等はありませんので、ご容赦ください。

##なぜNFCを試してみたのか？
コロナになりオフィスへの出社が制限され、オフィスの混雑状況などを知りたいというニーズからbeaconを利用したデータを活用し、混雑可視化をするアプリを社内有志で作ってみたことがありました。
作った当時はすごい使えるんじゃないかと思ってワクワクしていたのですが、
ふたをあけてみると、全然データが取れていないことに。。

原因としてはいくつもあったのですが、主として下記２点の課題がメインだと考察しました。
①そもそもアプリを開いてチェックインしてもらうという行為自体がハードルが高い
よっぽどユーザーメリットがないと携帯を出して起動して、アプリを開くという行為そのものが実は結構ハードルが高い
実際、自分ですらオフィスで該当アプリを起動することがなくなってしまいました。。。

②バックグラウンド検知を有効にするには位置情報の許諾が必要
①を解消する解決策として、バックグラウンドでもbeaconを検知する手法に途中から改善したのですが、結果として、特に取得できるデータ数は改善されませんでした。
これは前提としてバックグラウンドでbeaconデータを取得するためには位置情報のパーミッションが必要で、それを許可するほどのユーザーメリットを提供できるサービスではなかったためという検討結果に至りました。。。

上記の経験の中で、
①特定の場所で、アプリを立ち上げてもらうということの難しさ
②beacon、wifi、GPSなどの位置情報を取得することの難しさ

をあらためて再認識し、この２点を解消する方法としてNFCを利用して、タッチするだけでアプリが立ち上がったり、アクションさせるという行為が、オフラインの行動データを活用するためには、有効な手段なのではと思い立ったのがきっかけです。

##とりあえずNFCタグ買ってみた
とにかく試してみないと、何がどこまでできるのかがわからないので、一旦NFCタグと呼ばれるものを購入することに。
amazonで「NFCタグ」で検索すると、結構いっぱい出てきます。
まず、形状がシール、カード、キーホルダーのようなものまで様々。
価格帯もまちまちで、相場がいまいちわからない。。
とりあえず、安いもので、なんとなく説明が色々書いてありそうなサンワサプライの下記タグを購入してみます

#購入したNFCタグ
商品：サンワサプライ NFCタグ(10枚入り) NXP NTAG213 ホワイト MM-NFCT
価格：1352円
<img width="150" alt="iOS の画像 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/b5aac010-446d-f32f-032f-c0c834815ab5.jpeg">

1枚100円ちょっとで買えるんですね。なんか安いのか高いのか判断に迷いますが、
大きさは100円玉ほどで、素材はほんとにペラペラのシールです。

##NFCタグにデータを書き込む
こちらの製品には、製品メーカーが提供するタグ情報を読み書きするアプリがあります。
これを使ってデータ書き込むだけか、楽勝楽勝と思いきや。。。
こちらはandoroidのみしかありません。。。
え。
私iphoneしかありませんけど。。。
一瞬固まる。。。

google先生に確認するとNFC Toolsという無償アプリがいけてるらしいという記事発見
[iPhoneからNFCタグに何か書き込んで遊ぼう!!!　役立てよう!!!](https://k-tai.watch.impress.co.jp/docs/column/stapaapple/1244316.html)
早速試してみる
<img width="150" alt="iOS の画像 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/c32889b4-b877-d029-e500-9b841ecfea19.png"> <img width="150" alt="iOS の画像 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/80c57046-eb37-b2de-9698-51f09a2bc5eb.png"> <img width="150" alt="iOS の画像 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/c93e3949-22f3-a7ec-8ddb-c4b5053ab554.png">

特に難しいことは何もなく実施できる。
一旦特定のwebページを開くような内容をタグに登録

##NFCタグにタッチしてみる
早速タッチしてみる。。
何も反応しない。。。。
よく調べてみると、NFC反応の条件には下記のような制約がある

```
To avoid unintentional tag reading, the system reads tags in the background only when the user’s iPhone is in use. Also, be aware there are times when the display is on and background tag reading is unavailable, such as if:

・The device has never been unlocked.

・A Core NFC reader session is in progress.

・Apple Pay Wallet is in use.

・The camera is in use.

・Airplane mode is enabled.
```
(参考)[Adding Support for Background Tag Reading](https://developer.apple.com/documentation/corenfc/adding_support_for_background_tag_reading)

なるほど、少なくともディスプレイは付いている状態じゃないとダメらしい。
ディスプレイつけてから再度タッチしてみる。
いけた！！
<img width="150" alt="iOS の画像 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/b4681f0e-6271-ae21-dae9-1fb423d62ce7.png"> <img width="150" alt="iOS の画像 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/32aca74c-693f-bb53-a78c-8fbb83dd632a.png">

後からわかったことだがandroidの機種ではまた制約が異なるよう。
以下自分が調べた状態によるNFC検知の反応有無です。

| 状態 | iphone(12mini) | android(SHARP SHV38) |
|:-:|:-:|:-:|
| スリープモード | ✖️ | ✖️ |
| ロック状態だがディスプレイON | ○ | ✖️ |
| ロック解除 | ○ | ○ |

スリープ状態でも使えるものだと思い込んでいたのですが、ここはまだ今後課題がありそうです。
また、そもそもこのロック状態でも検知するという機能はNDEF(NFC Data Exchange Format)と呼ばれるフォーマットを使用しており、こちらがiphoneで対応できる機種は以下の通り、XS以降ということなので注意が必要です。

```
Note
iPhone XS and later support background tag reading.
```
(参考)
[Adding Support for Background Tag Reading](https://developer.apple.com/documentation/corenfc/adding_support_for_background_tag_reading)
[【NFC】NDEFについて理解する](https://qiita.com/shimosyan/items/ed21fb6984240baa7397)

ちなみにNFC対応機種はiPhone7からとされているのですが、ロック状態でも、タッチするだけで検知するという動作をしてくれるのはiPhoneXS以降で、iPhone7などは明示的にコントロールセンターからNFCタグリーダーという機能を起動する必要があるということも後で学びました。この辺りは綺麗に整理された情報が見つからなかったので、NFCに対応しているからといって、やりたいことができるかどうかは機種によって異なるので、今後注意が必要なポイントかなと思います。

(参考)[【iPhone】コントロールセンターの使い方 完全ガイド](https://appllio.com/ios-13-control-center-guide-iphone-ipad#h4_34)

##日常生活で便利にしてみる
例えば、毎日の勤怠記録をNFCにタッチしてタイムカードのように記録してみたら、便利かもなと思い立ち下記の方法で実現してみました。

①ショートカットアプリにてオートメーションを作成
<img width="150" alt="iOS の画像 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/e0964d5d-7cfe-01b2-46ab-35fcbdd28d46.png">

②「いつ」の設定でNFCを選択しタグをスキャン
<img width="150" alt="iOS の画像 (4).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/68630766-0179-6fa0-e612-a65e064b85af.png">

③アクション追加でメモに現在時刻を追加するワークフローを設定
<img width="150" alt="iOS の画像 (3).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/4d4ca80b-c0a9-c31b-97bc-08b888f9ee78.png">

④NFCタグをタッチして勤怠を記録
<img width="250" alt="iOS の画像.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/5543a52f-2907-8f71-4b26-43ead8d46aee.jpeg"> <img width="150" alt="iOS の画像.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338070/4f65aec4-c4b6-a65e-f152-2101f8b46b34.png">

なんか便利な気はするのですが、本当はここから自動で実際の勤怠登録システムまで連携したいところですが。。
今後挑戦してみたいと思います。

##今後試してみたいこと
NFCタッチをトリガーとして自動アクションが実行されるというのは
結構やってみるとユーザー体験的には感動します。
タッチひとつで、自動でメッセージ送信するとか、いろんな用途が考えられそうですので、
今後も日常を便利にするという観点と、ビジネスにつなげられないかは検討していきたいなと考えております。

iOS14からAppClip等の機能も登場しておりますし、日常の中でモバイル端末をタッチするという機会も当たり前になってきていますので、今後も注目していきたいと思います。
(AppClipを試した話はまた機会があれば書きたいと思います。)

##最後に宣伝
Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
 [Supership株式会社 採用サイト](https://supership-hd.jp/recruit/)
是非ともよろしくお願いします。