#PowerApps NFCリーダー機能

2021年6月18日には提供されていたと思われる Power Apps の NFC を読み込む機能(関数)を遅ればせながら試してみる、の巻き。

# 公式情報
・Blog
　[Read NFC tags with Power Apps on iOS and Android](https://powerapps.microsoft.com/ja-jp/blog/read-nfc-tags-with-power-apps-on-ios-and-android/)

・Docs
　[Power Apps の ReadNFC 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-readnfc?WT.mc_id=BA-MVP-5004053)

# NFC 読み取り ＝ ReadNFC 関数の使い方
前述、Docs より。

> ReadNFC は、動作の数式 内でのみ使用できます。

ボタンコントロール等の OnSelect アクションなどに書かないとダメよ、ってコトですね。
Docs のサンプルコードが、また絶妙に初心者殺し（汗

```
With( ReadNFC(), 
      If( Not IsBlank( Text ), 
            Notify( "Read Text: " & Text ), 
          Not IsBlank( URI ),
            Notify( "Read URI: " & URI ),
          Notify( "Didn't read Text or URI" )
      )
)
```
With 関数 ＋ Notify で表示かよ！っていう。

ひとまず『ReadNFC()』という関数を呼び出せば、アプリを実行している端末の NFC リーダーが起動して結果を取得してくれる動作になるようです。UpdateContext で ReadNFC() 関数の結果を格納すればコンテキスト変数として利用できます。もちろん、複数枚の NFC タグを連続で読み込みたい場合は Collect 関数で配列に持ってください。

サクッと試したい方はボタンコントロールに下記を書けば変数に結果が取得されるハズです。

```
UpdateContext({locNFC:ReadNFC()})
```

上記のように変数などへ読み取り結果を格納すると、下記4つの情報へアプローチできるようになります。

- TNF
- RTD
- TEXT
- URI

NFC 書き込みツール等で設定できる値をみていると、上記以外にも NFCカードなどへは色々指定できるようなのですが...。記事投稿時点の Power Apps における ReadNFC 関数は上記4つしか取得できないようです。

# NFC タグを準備する
実際に試すために NFC カードを購入してみました。規格がイロイロある？ようで、Power Apps の関数なのか、機種なのか相性なのか…わかりませんが Apps で読み込めないパターンもあるようです。当方は、下記の NFCタグ を購入して、iPhone で書き込みツールで情報を設定してからテストしています。現状、ちゃんと読み込みできてます。

・検証で利用している NFCカード
　<a href="https://www.amazon.co.jp/gp/product/B08WRV4NHM?ie=UTF8&psc=1&linkCode=li2&tag=yamad365-22&linkId=4fd9af22e9e8b460bc0abd22d335f3a8&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B08WRV4NHM&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=yamad365-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=yamad365-22&language=ja_JP&l=li2&o=9&a=B08WRV4NHM" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
　[NFCカード NTAG215カード 白無地 ホワイトカード 10枚セット](https://amzn.to/3ANERzu)

上記は購入時点では何も情報が書き込まれていません。下記のツールで書き込みをしています。

・NFC情報の読み取りと書き込みツール
　[NFC Tools](https://apps.apple.com/jp/app/nfc-tools/id1252962749)

読み書きのみであれば無償の範囲で利用可能でした。もう少し細かい制御などを実施する場合はツールの有償機能が必要になるようです。


# Power Apps で実際に試してみた
ギャラリーコントロールを置いて、Collect 関数で貯めこんだ ReadNFC() の結果を表示しているだけなので、画面の詳細説明は割愛します。画面の下にあるボタンに ReadNFC関数が仕込んであります。

![20210925_085838000_iOS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/7d37583b-64c1-de42-3cf6-44b7e37be0d6.png)

ちなみに、NFCタグに書き込んでる情報は下記になります。
![20210925_085852000_iOS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/7f0c3584-08b2-eced-e8a0-cd1adebbbc68.png)
URL が一番上の状態で iPhone アプリから書き込むと RTD＝U になって、テキストが一番上だと RTD＝T になるみたいです。詳細は把握してません（爆）が、何度試してもそうなるので、おそらくそういう仕様なのでしょう。課金すると細かいトコも書き換えられるみたいですが、そこまでは実施してません。

NFC の情報は3種類がカードに記録されていますが、Power Apps 側では1種類しか読み取れませんでした。スマートフォンで同じカードを読み取ると複数種類の情報取得ができるので、1種類しか読み取れないのは Power Apps 側における現状の仕様だと想定しています。

# TNF と RTD ってなんじゃい？
下記の記事がとても詳しくてわかりやすかったです。

[【NFC】NDEFについて理解する](https://qiita.com/shimosyan/items/ed21fb6984240baa7397)

上記の記事、[こちら](https://qiita.com/shimosyan/items/ed21fb6984240baa7397#ndef-record-%E7%B7%A8)によると、

　TNF が 1 の場合は ”NFC Forum well-known-type” だよ。
　RTD が ”T” の場合はテキスト情報、”U” の場合は URL 情報だよ。

となるみたいですね。
実際に試してみた結果も、T の場合はテキスト、U の場合は URL が取得できてます。（逆の値はブランクになってるぽい）

TNF と RTD の結果から、テキスト情報なのか URL情報なのか？を判定して、その中で（おそらく）一番最初に登場するデータを ReadNFC関数は取得している、と予想されますね。まとめてテーブル型でドン！っと取得してくれても良さそうなんですが、スマートフォンなどモバイルデバイスは種類が多いので対応大変なのかもしれないなぁ、等と確証もない妄想をしております。

# まとめ
当方は、当面は業務などで活用する場面が無いのですが、なかなかオモシロい機能を搭載したなぁ、という感想です。交通系カードなど読み取れると残金確認や、経費系と連携できるアプリが作れるかも？などと夢が広がります。

様々なトコロにNFCカードやタグを隠して、アプリで読み込むと次のヒントが出るようなリアル宝探しゲーム等が作れるかもなぁ、とか思いましたが、プレイしてくれる相手が現状居ないのでアイディアだけで終わっています（汗

試したのがカード型でしたが、もっと小さなチップ型なども販売されているようなので、備品に張り付けて「貸出管理アプリ」なども作れると思います。QRコード作って、シールなどに印刷して張るよりは少し準備が楽なんじゃないかなー。何かのチャンスで活用してみたいですね。

それでは、皆さま。素晴らしい Power Platform Life を！