2018.12.27
スマホアプリを開発していて、より多くのユーザーに使ってもらおうとするとどうしてもiOS版とAndroid版は最低限提供したくなる。しかし、iOS版をSwiftで、Android版をJavaやKotlinで作るとなると単純に2倍の作業量になるのでできればやりたくない。
iOS版アプリとAndroid版アプリを並行して作るフレームワークとしてはCordova・React Native・Flutterなどいくつかあるが、そもそもネイティブの機能をがっつり使わないちょっとしたアプリであればそれらすら大げさな気がしてしまう。
Webの技術で作ったページをアプリのように動作させるPWA(Progressive Web Apps)という技術が最近話題になっているので、今回は試しにIonicでPWAを作ってみることにした。
$ ionic start PWASample
Ionic 4(Beta版)は今回は使わずに3を使う。
[INFO] You are about to create an Ionic 3 app. Would you like to try Ionic 4 (beta)?
Ionic 4 uses the power of the modern Web and embraces the Angular CLI and Angular Router to bring you the best
version of Ionic ever. See our blog announcement[1] and documentation[2] for more information. We'd love to
hear your feedback on our latest version!
[1]: https://blog.ionicframework.com/announcing-ionic-4-beta/
[2]: https://beta.ionicframework.com/docs/
? Try Ionic 4? (y/N) N
テンプレートはblank
を選んでみる。
Let's pick the perfect starter template! 💪
Starter templates are ready-to-go Ionic apps that come packed with everything you need to build your app. To bypass
this prompt next time, supply template, the second argument to ionic start.
? Starter template:
tabs | A starting project with a simple tabbed interface
❯ blank | A blank starter project
sidemenu | A starting project with a side menu with navigation in the content area
super | A starting project complete with pre-built pages, providers and best practices for Ionic development.
tutorial | A tutorial based project that goes along with the Ionic documentation
aws | AWS Mobile Hub Starter
Ionic AppFlow(アプリ開発のプラットフォーム?)は今回は使わない。
🔥 IONIC APPFLOW 🔥
Supercharge your Ionic development with the Ionic Appflow SDK
- ⚠️ Track runtime errors in real-time, back to your original TypeScript
- 📲 Push remote updates and skip the app store queue
Learn more about Ionic Appflow: https://ionicframework.com/appflow
────────────────────────────────────────────────────────────
? Install the free Ionic Appflow SDK and connect your app? (Y/n) n
これでアプリの開発環境が整った。
$ cd PWASample
$ ionic serve
無事にアプリを起動することができた。
PWAはHTTPSの環境でしか動作させられないので、検証のためにHTTPS環境に配置したい。 ngrokというサービスを使うことで、Macの任意のポートを公開できるのでそれを使ってみる。
$ ngrok http -region=ap 8100
regionをAsia Pacificにして多少高速化を図る。 準備が完了すると以下のような出力となる。
Session Status online
Session Expires 7 hours, 54 minutes
Version 2.2.8
Region Asia Pacific (ap)
Web Interface http://127.0.0.1:4040
Forwarding http://xxxxxxxxx.ap.ngrok.io -> localhost:8100
Forwarding https://xxxxxxxxx.ap.ngrok.io -> localhost:8100
Connections ttl opn rt1 rt5 p50 p90
27 0 0.02 0.04 5.01 8.16
Forwarding
の行にあるURLへのアクセスがngrokを起動したコンピューターにルーティングされる。
この状態でiPhone XSのSafariからhttp://xxxxxxxxx.ap.ngrok.io
にアクセスすると、以下のように表示された。
これをホーム画面に追加してみる。 Safariの中央のボタンをタップしてメニューを開き、「ホーム画面に追加」を選択する。
タイトルを必要に応じて変更して、「追加」をタップする。
あっさりホーム画面に追加することができた。 アイコンはページのスクリーンショットになってしまっているので、後ほど設定してみる。
ホーム画面に追加されたこのアイコンをタップして開くと、(見た目)Safariではなく、かといって画面最上部のナビゲーションバーの感じ的にアプリともちょっと違うものが起動した。この辺もおそらくカスタマイズできるはずなので、後ほど試してみる。
ちなみに、現時点ではオフライン対応はできていないので、機内モードにして開くと以下のようになってしまう。
ここから少しずつ手を入れてよりネイティブアプリっぽくしていく。
JavaScriptからiOS/Androidの機能を呼び出せるようにするためのフレームワーク本体であるcordova.js
はPWAでは必要ないので、読み込まないようにする。
src/index.html
中の<head>
タグ内の以下の行を削除するだけで完了。
<!-- cordova.js required for cordova apps (remove if not needed) -->
<script src="cordova.js"></script>
オフライン対応するにはServiceWorkerを有効化する必要がある。
先ほど同様src/index.html
の<head>
タグ内を編集する。
コメントで書かれている通り、<script>
から</script>
までをコメントインする。
<!-- un-comment this code to enable service worker
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('service-worker.js')
.then(() => console.log('service worker installed'))
.catch(err => console.error('Error', err));
}
</script>-->
<!-- un-comment this code to enable service worker -->
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('service-worker.js')
.then(() => console.log('service worker installed'))
.catch(err => console.error('Error', err));
}
</script>
この状態で一度先ほどホーム画面に追加したPWAを開くと、ServiceWorkerが端末にインストールされる。見た目では進捗がわからないので正しく動いているかはこの時点ではわからない。
一度PWAを完全に終了させて、端末を機内モードにしてアプリを開いたら即座に画面が表示されたので、正しくセットアップできていた模様。
開発作業中はコンテンツがキャッシュされてしまうと変更をすぐに確認できないので、ServiceWorkerの動作を確認した後またコメントアウトして作業を続けた。
調べたところ、こちらもsrc/index.html
の<head>
タグ内の変更で対応できる模様。
apple-mobile-web-app-status-bar-style
という属性に対して値を設定することでいくつかのパターンで設定することができる。
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
試しにblack-translucent
にしてみたら、以下のスクリーンショットのようにノッチの下の部分まで入り込んでしまってうまく行かなかった。白色で見辛いが、よく見るとiOSの時計とバッテリーや電波強度の表示は出ている。
設定可能な値には以下の種類がある。
content属性の値 |
---|
default |
black |
black-translucent |
src/manifest.json
に設定が書いてあるのでそれを変更する。
name
とshort_name
を任意の名前に変更する。
{
"name": "Ionic",
"short_name": "Ionic",
"start_url": "index.html",
"display": "standalone",
"icons": [{
"src": "assets/imgs/logo.png",
"sizes": "512x512",
"type": "image/png"
}],
"background_color": "#4e8ef7",
"theme_color": "#4e8ef7"
}
{
"name": "PWA",
"short_name": "PWA",
"start_url": "index.html",
"display": "standalone",
"icons": [{
"src": "assets/imgs/logo.png",
"sizes": "512x512",
"type": "image/png"
}],
"background_color": "#4e8ef7",
"theme_color": "#4e8ef7"
}
ホーム画面に追加したときにアイコンがスクリーンショットだと極めてアプリっぽくないので変更する。 今回はイラストレーターで以下のようなアイコンを作ってみた。
PNG形式でサイズは512x512pxで書き出して、src/assets/imgs/logo.png
として配置する。
続いてsrc/index.html
の<head>
タグ内に以下の行を追加する。
<link rel="apple-touch-icon" href="assets/imgs/logo.png" sizes="512x512">
これでPWAを開いたSafariを再読み込みして、ホーム画面に追加の操作を行うとアイコンが変更されていることが確認できる。
ローカル開発環境では、WebブラウザがWebSocket通信でionic serve
コマンドのプロセスと繋がっていて、アプリケーションの更新時に自動で再読み込みしてくれるが、ホーム画面から起動したPWAではそれができない。
いちいちPWAを閉じて開き直したり、Safariに戻って再読み込みしてまたホーム画面に追加するのは時間がかかる。
Safariメインで開発を進めて、要所要所でPWAとして確認するのが現状の最善の方法かも。
特に機能を追加していない状態で18リクエスト、4.9MBのIonicアプリケーションの再読み込みに数分かかってしまう。回線はモバイルルーターだが下り27.3Mbps、上り23.1Mbpsというなかなかの速度なのに。
ひとまずiPhone XSをMacと同じネットワークに接続して、http://192.168.1.4:8100
というIPアドレス指定でアクセスして検証を続けた。
この手順でやっていたが、これで問題ないのかがわからない。
今回作成したプロジェクトはGitHubにアップしてある。