ios ショートカットの Tips

iosのショートカットのプログラム初心者が便利なtipsを書いてゆきます
ショートカットのプログラムは以下のようなアクションと呼ばれるプログラムパーツを並べることでプログラムを構成するのですが、各アクションを示すのに画像を張り付けるのは大変なので、下の図のアクションは
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/9bc8fa39-29c7-1ef8-a41b-d651e8b91e74.jpeg)
最初のアクションを

［日時/｛現在の日付｝］　　(1)

次のアクションを

［書類/｛日時｝からテキストを取得］　(2)

と表記します。{}は変数名やオプションを示します

# ショートカットの始めかた
　
　初めて自分で作ったショートカットを動かすのは少し面倒なステップがあります

<ol>
<li>何でもいいからショートカットを１回動かす（この後「信頼されてないショートカットを許可」ボタンがアクティブになる）
 <ul>
 <li>ショートカットアプリを起動
 <li>画面下のギャラリーを選び、リストの中からどれかのショートカットを選んでタップする
 <li>どのショートカットでもいいが、例えば「オーディオ出力を設定」を選びタップする
 <li>「ショートカットを追加」→「完了」をタップする
 <li>画面下のマイショートカットを選び、リストの中から今追加した（この例では「オーディオ出力を設定」）を実行する
 </ul>
</li>
<li>位置情報をオンにする
 <ul>
 <li>ショートカットの中で位置情報を利用する場合は、「設定」→「プライバシー」→「位置情報サービス」→ON
 </ul>
</li>
<li>ショートカットの設定
 <ul>
 <li>「設定」→「ショートカット」
 <li>位置情報サービスのメインスイッチをON
 <li>信頼されていないショートカットを許可する　をON
 </ul>
</li>
<li>アプリをダウンロードして追加
 <ul>
 <li>他人が作ったショートカットの場合はリンクをタップしてダウンロード
 <li>追加する→マイショートカットに追加される
 </ul>
</li>
<li>ダウンロードしたアプリを実行
 <ul>
 <li>マイショートカットのアイコンをタップして実行する
 </ul>
</li>
<li>（おまけ）ホーム画面にボタンを追加
 <ul>
 <li>マイショートカットのアイコンを長押し→共有→ホーム画面に追加
 </ul>
</li>
</ol>

# Tips（プログラミング）
## リストにないアプリの起動
「アプリ」リストにないアプリの起動は（例えばGoogle Authenticator）
1. 「カテゴリ/スクリプティング」から、［スクリプティング/アプリ/アプリを開く］を選ぶ
1. 作成したアクションの「アプリ」をタップするとほぼすべてのアプリから選ぶことができる。画面分割でもSlide Overでもご自由に
## 他のショートカットから入力を受け取る
サブルーチン的に使うショートカットを作る場合に、他のショートカットから入力を受け取る方法です。例えばテキストデータを受け取るとすると。次の図のように

![ショートカットの入力.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/bdc967ea-d4dd-6e9a-396d-532c77950f5a.jpeg)
［テキスト/{ショートカットの入力}］

とテキストの内容を変数のリストにある「ショートカットの入力」を選ぶと、その上の...の入力を受け取るアクションが追加され、他のショートカットの入力を受け取ることができます
結果の出力は
![停止して出力.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/4cef6d49-5499-bfdb-cd2a-6664b10c1fcd.jpeg)
を処理の最後に呼ぶと出力できます

## 再生出力先を変更する
音楽の出力先をairplayやbluetoothスピーカーに変更します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/741b9292-3f33-fe00-c010-11664177466f.png)
と設定すればいいのですが、少なくとも私の環境では、siriで起動する場合などショートカット・アプリがフロントで起動していないと、「airplayの出力先が見つからない」とエラーになります。そこで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/af7913e6-7e3a-5433-cd39-18985f785f6a.png)　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/741b9292-3f33-fe00-c010-11664177466f.png)
と、出力先設定の前に、「Appを開く」で「ショートカット・アプリ」を開いておくと、出力先を見失わずに変更できます。バグ回避のTipsですね

## テキストの途中結果を見る
デバッグプリントで処理の途中結果をは確認したいときには、以下のアクションを見たいアクションの後に入れます

| 表示の方法 | アクション |
|:--|:--|
| ポップアップで表示 | ［スクリプティング/｛テキスト｝を表示］  |
| メモで表示        | ［メモ/｛テキスト｝でメモを作成］  |

## 文字列を変数に設定する
基本的で簡単な処理だと思うのですが、１アクションで設定する方法は見当たりません
［テキスト/｛文字列を入力｝］ 
［変数/変数｛“変数名”｝を｛テキスト｝に設定］ 

## ペアになる情報の設定（連想配列的なデータ）
名前と電話番号とか、駅名とそのコード番号とかペアになる情報は辞書に設定します
以下に駅名とコード番号の例を示します。キーとなるデータは文字列でもいいですが、例のように変数にしておくとデータを参照するときに便利です
<img width="70%" alt="辞書.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/2224b309-f8eb-0ad3-8ac4-2bc9e2ef0aa4.jpeg">

## 辞書から値を取得
［スクリプティング/｛辞書｝内の｛“キー”｝の｛値｝を取得］

## 検索
正規表現を使って、特定のパターンの文字列を含んだ行を取り出します

［テキスト/{Webページの内容}で{.*abc.*|.*def.*}に一致］

“abc”か”def”を含んだ行を抽出する

## 置換
正規表現（regular expression）を使った文字列の置換の例です、次の例では(文字列1,文字列2)→(文字列2,文字列1)の置換を行います。設定するのは次の2つのアクションです
［書類/｛テキスト｝の｛`\((.*),(.*)\)`｝を`($2,$1)`に置き換え］
「表示を増やす　>」の中の「正規表現」をONにする。
この例の「検索文字列」と「置換文字列」を解説します
検索文字列

| 入力文字 | 文字として | 正規表現 |
|:-:|:-:|:-:|
| '\('  | (  |   |
|  ( |   |  再利用文字列1の始まり |
|  .* |   | 任意の長さの文字列  |
|  ) |   |  再利用文字列1の終わり |
| ,  | ,  |   |
|  ( |   |  再利用文字列2の始まり |
|  .* |   | 任意の長さの文字列  |
|  ) |   |  再利用文字列2の終わり |
| `\)`  | )  |   |

置換文字列

| 入力文字 | 文字として | 正規表現 |
|:-:|:-:|:-:|
| ( | (  |   |
|  $2 |   |  再利用文字列2 |
|  , |  , |  |
|  $1 |   |  再利用文字列1 |
|  )  |  )  | |

次に実行例を示します、(56,fog)が(fog,56)と変換されています
<div align="center">
<img width="50%" alt="例.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/f0f13ec2-7424-d6b3-1bc9-0b0eb9566f9b.jpeg">
</div>

### いずれか一文字
［書類/｛テキスト｝の｛`[abc]`｝を`z`に置き換え］
a,b,c のいずれか一文字をzに置き換えます

## 変数の参照
以前に求めたり検索した値は変数として参照できます。アクションにデフォルトで表示されている変数を消去すると、「マジック変数を選択」というボタンが現れます。コレをタップすると各アクションの出力に変数が現れます。この変数には以下のような性質があります

- 同じ名前のオブジェクトは新しいものに中身が書き換えられます
- if文の中はelse文の中と同じ名前のオブジェクトに設定すれば、後では同じ名前で参照できる：　条件によって変数の値を変えたい場合にはifセクションとelseセクションの中で同じ名前の変数に入れれば、後でその名前の変数として参照できる

# Tips（操作）
## アクションのコピー（同じショートカットの中で）
1. アクションの左上のアイコンをタップ
2. 「ショートカットに追加」
3. コピーされたアクションが現れる

## 他のアプリを実行する場合
他のアプリの変更をメニューに反映するには、iPhoneをリブートする必要がある時がある

### nature Remo
新しいシーンを追加した場合メニューに反映するにはそのシーンをいちど実行する必要がある
[→iPhoneのショートカットアプリにRemoの家電操作が設定できない](https://support.nature.global/hc/ja/articles/900006409263-iPhone%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%A2%E3%83%97%E3%83%AA%E3%81%ABRemo%E3%81%AE%E5%AE%B6%E9%9B%BB%E6%93%8D%E4%BD%9C%E3%81%8C%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)

# パーツ
## 日付関連
[→ios ショートカットの Tips（日付）](https://qiita.com/osadataku/items/94d9311b43d67166c8cd)

## Nature Rimoの明るさセンサーの値を読む
[iOSショートカットレシピ Nature Rimoの明るさセンサーの値を読む](https://qiita.com/osadataku/items/0a8be499031224f448e7)

## テキストをURLとしてSafariで開く
最初にテキストをURLコードに変換してからSafariで開きます
［テキスト/｛“URL文字列”｝］
［URL/｛テキスト｝］
［SAFARI/｛URL｝を開く］

＊＊ひとつ困っていることがあって、この方法でSafariを開くと、Webページが表示された後、スクリプトがそこで止まってしまいます。画面の左上隅にある「◀︎ショートカット」をタップして制御を戻さないと次のスクリプトに進みません。複数のページを別々のタブで開きたいのですが、自動的にシュートカットスクリプトに制御が戻る方法をご存知の方はいらっしゃいますでしょうか？

## Webページから文字情報を取得する
URLで指定したWebページからテキスト情報を取得して、テキストオブジェクトにします

［SAFARI/｛URL｝のWebページの内容を取得］
［テキスト/｛Webページの内容｝からテキストを取得］

複数のWebページの情報を得るにはこの方法を使います。Safariでページを開くと、Safariに制御が移り、制御が返ってくるまでスクリプトが停止します。

## 現在位置
現在位置を取得して、緯度経度、住所（県市町番地）、郵便番号などの情報を得ることができます
２つ方法があって、一つは
［場所/現在地を取得］
［書類/｛現在地｝からテキストを取得］
｛現在地｝をタップすると
　オプション：　位置情報として＞　
　位置情報/緯度/経度/高度/番地/市区町村/都道府県/などなどが選べます
もう一つは
［天気/｛現在地｝の現在の天気を取得］
［書類/｛気象状況｝からテキストを取得］
　｛気象状況｝をタップすると
　オプション：　位置情報として＞　
　位置情報/緯度/経度/高度/番地/市区町村/都道府県/などなどが選べます。
リンク先の[現在地の位置情報取得アクションを知る](https://kazesawayaka.com/gadget/1294)に詳しいですが、「場所」アクションを使うより「天気」アクションを使ったほうが実行速度が速いです

# 設計方針
## 電車やバスの経路検索を自動化する
乗換案内などのサイトで、「乗車駅」「降車駅」「乗る時間」などを入力すると、その情報をURLに変換して検索します。URLのフォーマットがわかれば、スクリプトの中で取得できる現在時間などの情報を使ってURLを作ることで簡単に自動化できます
　西武バスでの実装の例を[iOSショートカットレシピ　西武バスで特定区間の経路検索を１クリックで行う](https://qiita.com/osadataku/items/9803e78b76b07608769b)に書いています

### 決まった経路を現在時刻で検索
通勤など毎日決まった駅で乗り降りするので、出発時刻だけを現在時刻にする場合は次のような流れのスクリプトを作ります

1. 現在の日付を取得
1. 年、月、日、時、分、の変数を用意して、取得した現在時刻からそれぞれの数値を抜き出す
1. 検索したいサイトのURLのフォーマットを調べる
 1. 検索したいサイトで通常通りの方法で経路を検索する
 1. 検索結果が表示されたURLをコピーして
 1. URLのデコードサイトに張り付ける（「URL エンコード デコード」などで検索する）
 1. デコードした文字列を取得する
1. 検索結果URLのフォーマットに希望の年月日時分を入れたURLのテキストを作る
2. テキストをURLに変換する
3. Safariで表示する

### 現在地によって乗車／降車駅を変更する
自宅では自宅近くの駅から会社近くの駅で、