OutSystemsで業務専用端末モバイルアプリを開発する

# はじめに
## この記事を読むとわかること

一般的なiPhoneとかGalaxyに入れるモバイルアプリを開発するブログはたくさんあると思いますが、工場などで使われる専用端末をOutsystems（ローコード）で開発する内容のブログを見当たらなかったので記載しています

:::note warn
注意点
固有情報（関連企業名、使用端末名など具体的な名称）は記載しないのでご了承ください
また実装レベルの話までは記載しないのでそちらもご了承ください
:::

## 業務専用端末について

「業務専用端末 ハンディ」などでググるとこんな感じで画像が出てきます
今回はこういった工場などの現場で使われる端末で使用するアプリの開発を行います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/952215ef-e399-c315-4ef9-9ac1e27d709a.png)

### スマホと業務専用端末の違いについて
主な違いは以下のような点があると思います
・ハードウェアが衝撃や防塵などに強い
・機能が制限されて操作が簡単（らくらくフォンみたいなイメージ）
・物理キーボードなどがついてるものがあり工場などで手袋をつけたまま操作可能（持ちてだけついててキーボードがないものもある）
・カメラ・センサーが高性能
・OSのアップデートは基本的に行わない（メーカーによるかも）
・UIの考え方
※通常iPhoneはより小さく画面の操作も違うため異なるUI/UXの設計が必要になる
[ハンディターミナル画面見本](https://www.k-s-s.co.jp/documentdata/handyterminal.pdf)

それ以外についてはアンドロイドなど汎用OSを使用していてスマホと同じ機能を有していると考えて問題なさそう
昔はガラケーと同じで専用のOSで出来ていたようですがおそらくガラホと同じタイミングでOSが移行されたようです

# 検証要件
## 調査情報

大きく３つの要件を考慮する必要があると考えました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/2dd838be-f071-94f1-46a1-7ec2fd479bdc.png)

### 専用端末機能活用
一例としては以下のような機能があります
こちらについては詳細な検証が必要ということで後述します

・ローカルストレージの容量（ネイディブは端末のストレージ依存が明らかなのでPWAの場合のみ）
・QR、OCRなどの読み込み機能
・RFID（suicaで使われるような非接触通信機能）
・ブザー・バイブ・LED点灯など危険通知に係る機能
・GPS機能などなど

### オフライン対応
工場はWifiなどが設置されていない場合が多く、オフラインで動くアプリ必要があります
電卓アプリなどをイメージしてもらえばわかりますが、ネイティブアプリはオフラインで動くことが明らかですので省略しました

こちらの記事から2020年時点でPWAがアプリもオフライン対応可能であることがわかったので調査は終了しました

https://www.outsystems.com/ja-jp/product-updates/pwas-offline-compatible/

### アプリ形式の違い
Outsystemsで開発したモバイルアプリはネイティブアプリとPWAで配布が可能です
出来上がったアプリはどちらでも配布することは可能ですが、上記の専用機能活用の方法が異なるためどちらの方法で開発をするか決めてから開発する必要があります

※参考 PWAとは？

https://www.outsystems.com/ja-jp/glossary/what-is-progressive-web-app-pwa/

専用機能実現性調査を進めながら、別の方に使い勝手の部分は検証を進めていただきました

## 専用端末機能活用調査結果抜粋

全ては書けないので抜粋する形で調査の方法や結果を記載します

### インフラ
outsystemsプラットフォームはODCのようなクラウド環境だと勝手にアプリのバージョンが変わってしまって端末のOSとの不整合が発生する危険があったためオンプレ（IaaS）上に作成しました

※ODCとは

https://www.outsystems.com/ja-jp/low-code-platform/developer-cloud/

### ローカルストレージの確認

下記の情報から端末、OS、ブラウザ依存でわからないということがわかりました

https://www.outsystems.com/forums/discussion/66196/max-indexeddb-size-for-pwa-local-entities/

https://web.dev/articles/storage-for-the-web?hl=ja

端末メーカーにインストールされている専用ブラウザの仕様について確認したところChromeなど標準ブラウザをベースにカスタマイズしているため詳細は不明と回答がありました

実際に端末を使って試してみないとわからない！
ぐぬぬ！！

![20080726233644.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137987/d6624faa-936f-83ec-bb71-621aff6dfb94.jpeg)

以下のサイトを使わせてもらってエラーが発生する容量の限界を調査しました

https://iwatendo.hateblo.jp/entry/2018/02/15/215811

https://skybeje.net/indexeddb_limit_test/

### 専用端末機能の確認

ここで問題になるのが同じメーカーの端末でも全く同じ仕様でないとういうことです
どの端末を使うかわからないと検証する数が増えてしまう・・・

#### ネイティブ

ネイティブアプリについてはSDK（aar、dll）がメーカーから提供されています
入手手段はメーカーによって異なります（担当営業に問い合わせしたり、HPから自分でダウンロードしたり）が、普通にスクラッチ開発の場合の情報は開発環境構築からサンプルコードまで情報提供されているイメージです
会社・フェーズによると思いますが、メーカーのエンジニアの方とお話することも出来技術的な相談に乗ってくれる場合もあります
もちろんOutsystemsのことは知りませんが、一般論ベースの情報は教えてくれます

提供されたSDKをそのまま使うことは出来なそうだったのでCordovaプラグインを使う方向で考えました
以下のブログを参考にいろいろ検討しましたが、プラグイン作って実装してって無理じゃね？（技術的にも・工数的にも）という形になり断念

https://success.outsystems.com/ja-jp/documentation/10/extensibility_and_integration/mobile_plugins/using_cordova_plugins/

https://success.outsystems.com/documentation/11/extensibility_and_integration/mobile_plugins/camera_plugin/

https://www.outsystems.com/blog/posts/how-to-create-a-cordova-plugin-from-scratch/?_gl=1*1em2q7f*_ga*MjA5NzQyNjA3Mi4xNjQ0MTk5ODUy*_ga_ZD4DTMHWR2*MTY2ODE1NTMwNS4yMDMuMC4xNjY4MTU1MzEzLjAuMC4w

#### PWA

上記SDKと同じ方でJavascriptを使って専用機能使うドキュメントがありました
SDKを使った場合と制御の方法が違うなどはありましたが、そこは実装でカバーする方向でPWAを採用しました

https://success.outsystems.com/ja-jp/documentation/11/extensibility_and_integration/javascript/

# 最後に
モバイルアプリの開発経験が少なかったので勉強になりました
今回はPWAを使って開発する事になりました
調査の中でネイティブで開発するとiOSとAndroidとWEB別で開発の必要があり、PWAなら1個で開発可能な点が有利であるという話がありました

一方でOutsystemsはiOSとAndroidで別アプリを開発する必要はありませんが、flutterって技術を使うとIOSとAndroid両方同じ１つで開発できるようで最近の流行りはこちらのようです

業務アプリもDX化の影響でモバイルアプリの開発需要など増えていると思うので改めて勉強が必要だと思いました