PowerApps でアプリを作成している時、試験的な機能を利用しようとすると一部プラットフォームでしか利用できない事があります。更新履歴を見ていると、どの機能がプラットフォーム限定な制限があるのかも併せて記載されていますが、時と場合によってはその制限を知ったうえで、全プラットフォームで動作するアプリを作成することもあります。
そのような場合に、どのようにしてプラットフォームを判断するのかを試してみました。
アプリの構成としては、メインメニューからボタンを押すと、それぞれのプラットフォーム専用画面へと遷移するだけの簡単なものにしています。アプリケーションが起動されたタイミングで、まずプラットフォームを判断するのですが、ここで Flow を利用します。
作成した LogicFlow は上記のようなものです。PowerApps トリガでアプリからの呼び出しを受け、条件判断を行って実行プラットフォームを判定させています。
ここで判定に利用しているのが、PowerApps トリガを呼び出した際に渡している各種 HTTP ヘッダーの値です。
例えばこちらが Web ブラウザ上で実行した場合のヘッダーです。実際にはもっと多くの情報が渡されているます。
次にこちらが Android 端末からアプリを実行して呼び出した場合です。先ほどのものと比較すると、x-ms-user-agent というヘッダ値に Web とか android といった固有の文字列が設定されているのが見えます。ここの値を見て、実行プラットフォームを切り分けています。
自分の手元には iOS 端末がないので、
x-ms-user-agent に android という文字が含まれている→Android 環境
x-ms-user-agent に Web という文字が含まれている→ブラウザ環境
それ以外→iOS環境
という形で判定を行わせています。判定した結果を、PowerApps コネクタの応答でアプリに戻しています。
ここで指定した名称(x-ms-useragent)は、Flow を一度保存することでPowerApps 側でも認識されています。
メニュー画面の OnVisible に
ClearCollect(ossetting, 起動時のOS判定.Run().'x-ms-useragent')
と記載して、作成した Flow を実行し、その結果を ossetting という変数に記録させます。PowerApps の変数(コレクション)は、特にどこかで宣言が必要というものではなく、どこかで記載したタイミングでどこからでも利用できるようになります。また ClearCollect 関数は、指定した変数に何かしらの値を設定する関数です。このあたりも PowerApps のエディタ環境ではインテリセンスが働き、数文字入力すれば選択可能となります。
そしてメニューのボタンでは OnSelect に
If(Text(First(ossetting).Value)="Web"
,Navigate('01_web',ScreenTransition.Cover)
,Navigate('02_android',ScreenTransition.Cover)
)
と設定します。
これは条件判断を行う If 関数で、先程 Flow の結果を設定した変数 osseting の値が Web だったら、01_Web と名付けた画面へ遷移、Web でなければ 02_android と名付けた画面へ遷移させています。PowerApps の変数は、コレクションとして複数の値を保持できますので、たとえ一つしか値を設定していなくても、First 関数で「一つ目の値」を指定する必要があります。
試しにブラウザ上で実行すると、このように Web 用の画面が表示されます。
Android 端末上で実行すると、このように Android 用の画面が表示されます。
このようにして、PowerApps がどのプラットフォームで実行しているかを判断することができます。最終的にはほとんどの機能は全てのプラットフォームで利用可能になるはずですので、あくまでも一時的な対処となりますが、こうすることで事前提供機能であっても、アプリケーションに組み込むことが可能です。
0 件のコメント:
コメントを投稿