更新の自動確認機能付きiOSショートカットをgithub-pagesを使って作る

# はじめに
<font color="gray">_Qiitaへの投稿は初めてであるため、拙い記事ではありますがご了承ください。
また、投稿者は素人の学生であるため知識が浅く、この記事のコードには改善できる点や不正確な点があるかもしれません。_</font>

iOSのショートカット機能は痒いところに手が届きません。
公にソフトを提供する場合、そのソフトに欠陥が見られたときにアップデートを提供するのは当然のことです。
しかし、iOSのショートカットは更新を加えて共有するたびにURLが変わってしまいます。ましてや、ショートカットの自動アップデートなんて機能は一切ありません。
ショートカット自体そこまで普及してもいないので情報も乏しく、自動アップデートの方法も一切インターネット上に載っていません。

ショートカットを公に提供するという方はあまり居ないとは思いますが、iOSアプリを公開するよりも遥かに楽に、コストもかからず、誰でも公開できるというのはiOSにおいてショートカットの持つ大きな利点です。

今回は、そんな一般向けに配布するショートカットを、より実用的にするプログラムを紹介します。
なお、この記事ではショートカットのコーディングの仕方やgithub-pagesの基本的な使い方がわかっていることを前提に話を進めていきます。

# 前提条件
最初にこの機能を開発したのはiOS 13.5です。現在iOS 14.4ですが、問題なく動作します。
ちなみに、iOS 13と14ではショートカットを実行したときの見た目が変わってしまうので注意。

# github-pagesについて
今回はgithub-pagesを使ってアプリの最新バージョンの数字のみを表示するだけのページを用意します。
github-pagesの使い方は各自で調べてください。そんなに難しいものではありません。
そのページのhtmlファイルの内容は以下のようになっています。

```html:iOS_LatestVersion.html
<!DOCTYPE html>
<html>
    <head>
        <title>iOS_LatestVersion</title>
        <meta name="robots" content="noindex" />
    </head>
    <body>1</body>
</html>
```

また、最新バージョンのショートカットをダウンロードするURLにリダイレクトするようなページも作りましょう。自分はウェブページ系の言語に関しては初心者でありますので、ショートカットを更新するたびにURLも直接置き換える手法を取りました。

```html:iOS_DL.html
<!DOCTYPE html>
<html>
    <head>
        <title>Redirect</title>
        <meta name="robots" content="noindex" />
        <meta http-equiv="refresh" content="0;url=最新バージョンのショートカットのURL">
    </head>
    <body></body>
</html>
```

リダイレクトできれば何でも良いです。ただし、リダイレクトをこのようにHTMLで書く方法では、端末にキャッシュを残されることがあります。そのため、私達（公開者側）がページの内容を更新しても、その端末のキャッシュのせいで古いページに飛ばされることがあるので、頻繁にアップデートをして公開しようと考えている方はおすすめしません。
アップデートを行った場合、最新のバージョンの値をbodyタグの中の1と書かれているところに書き入れるようにします。
ブラウザで開いても、ただ単純に1と表示されるだけです。逆に他のものを書いてはいけません。

# ショートカットでの作業
## 更新確認機能の前に
更新を実際に確認する機能を作る前に、まずやらなければならないことがあります。機能を作ってからこれらのことをすることは、if文の中にあとからプログラムを入れたり、逆にif文をかけたりする作業がものすごく面倒で、ミスを犯しやすいのでおすすめしません。
### バージョンの値の保存
バージョンの値をショートカット内に変数として残しておきます。具体的には、以下のようにします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102419/ceecb584-3a84-e281-823a-1c402320bb52.jpeg" width=50%>
### インターネット接続ができているかの判定
最新バージョンの値を表示するページを取得するために[URLの内容を取得]スクリプトを使おうと思っていますが、これをそのまま実行すると、インターネット接続がない状態ではエラーが出てショートカットの実行が強制終了されてしまいます。<font color="gray">どうしてエラーを無視して続行ができない仕様にしたのか……</font>
これを回避してオフラインでも動作できるようにするためには、まずはインターネットに接続できるかを確認する必要があります。
そこで、端末のIPアドレスを調べます（この場合、モバイルデータ通信でもWi-Fiでもインターネットに繋がっていれば反応します）。
インターネットに接続されている場合はIPアドレスがテキストとして返されますが、接続されていない場合は何も返されないことを利用しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102419/05d57bd7-4b5f-d08e-1b03-c055756d7140.jpeg" width=50%>

## 更新確認機能の実装
URLの内容を取得し、その内容を数字として認識させ、if文でバージョンの変数より大きければ更新します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102419/b9777a68-b998-38a5-ec3d-53009bcf1a3d.jpeg" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102419/af3bfb15-31f0-b19f-1b49-46671d8e4531.jpeg" width=50%>
これで、アップデートがある場合に自動で上記のiOS_DL.htmlが開き、最新のショートカットのダウンロードページに飛ぶようになります。

### 利便性のために
このままでは勝手にブラウザが開いてしまい、ユーザーにとっては訳がわからなくなると思うので、「ショートカットに更新があります。開かれるページからダウンロードしてください」と表示したり、「最新版をダウンロードしますか？ [はい/いいえ]」のようなメニューを作ってはいと押されたときのみ開くようにすることで、より使いやすいショートカットにできるでしょう。

# アップデートへの対応
こちらが新しいバージョンのショートカットを公開する場合、しなければならないことは4つあります。順に紹介します。

1. ショートカットの一番最初のバージョンの値の数字を一つ大きいものに書き換える
2. ショートカットのiCloudリンクを作成して共有（ショートカットを公開する際には必須です）
3. iOS_DL.htmlのリダイレクト先のURLをそのiCloudリンクで置き換える
4. iOS_LatestVersion.htmlの内容を最新バージョンの数字に書き換える

当然のことですが、gh-pagesブランチにプッシュしなければ、公開されている最新バージョンの値もダウンロードリンクも更新されません。

### 注意すべき点
特に1つめは忘れやすく、忘れてしまった場合はそれを書き換えてから、そのショートカットの公開用のiCloudリンクを再発行する、少し面倒なことになるので注意が必要です。
また、3だけを忘れると永遠にダウンロード地獄にハマります。
さらに、バージョン表記を少数にするとエラーになることがあるので、変なこだわりがない限りは整数でバージョンを書きましょう。

# 最後に
この記事は以上ですが、改善点は結構あるはずです。ご自由にカスタマイズしてくださいね。