【Swift】特定のアプリがインストールされているかどうかで処理を分ける 完全版 - URL SchemesとLSApplicationQueriesSchemes -

2017年に書いた記事なのですが、いまだにこの方法しかないとのことで、完全版

# やりたいことって大体以下3つですよね
#### [【１】xxxアプリがインストールされているか知りたい](#１-xxxアプリがインストールされているか知りたい--canopenurl)
#### [【２】(インストールされてなかったら)AppStoreのxxxアプリの詳細画面を出したい](#２-appstoreのxxxアプリの詳細画面を出したい--openurl)
#### [【３】(インストールされてたら)xxxアプリを起動したい](#３-xxxアプリを起動したい--openurl)

1つ1つの単品記事はよく見かけるのですが
あっちゃこっちゃ調べて結構めんどかったのと
`LSApplicationQueriesSchemes`のトラップにやっぱり引っかかったので
全人類代表して長尾が１記事にまとめます。


# 【１】 xxxアプリがインストールされているか知りたい = canOpenURL

ソースコードにはこう書きます。

```
UIApplication.shared.canOpenURL(URL(string: "xxxアプリに設定してあるスキーム://")!)
```
つまり

```
if UIApplication.shared.canOpenURL(URL(string: "xxxアプリに設定してあるスキーム://")!) {
    // xxxアプリがインストールされている
} else {
    // xxxアプリがインストールされていない
}
```
です。

しかし
**(iOS9以降は)ソースコード書いただけでは動かない**
のです。
`info.plist`の`LSApplicationQueriesSchemes`に
**xxxアプリ**の**スキーム**を書いてあげる必要があります。

## ① info.plistのLSApplicationQueriesSchemesにxxxアプリのスキームを記述する方法
１、**info.plist**の**Information Property List**の横の**＋**をクリック(＋が見えなかったりしますがマウスを乗せると見えます)
![5.png](https://qiita-image-store.s3.amazonaws.com/0/106533/f7f6f462-e2cb-de63-99db-c6f02ee7562d.png)

２、**＋**をクリックするとこんな感じで**選べ**みたいになりますが**無視して**`LSApplicationQueriesSchemes`という文字をコピって
![7.png](https://qiita-image-store.s3.amazonaws.com/0/106533/b4a974fa-c594-dfcb-5506-2dfbb1b57d83.png)

３、貼りつけます
![8.png](https://qiita-image-store.s3.amazonaws.com/0/106533/bac0afbe-2dab-7618-633c-2413e5e7aaaf.png)

４、・貼りつけた`LSApplicationQueriesSchemes`の**Type**を**Array**にする(❶)
　　・(写真では白い三角で大変見づらいですが)出てきた▶︎をクリックする(❷)
　　・(▶︎をクリックしても何も起こらないが)`LSApplicationQueriesSchemes`の右の**＋**をクリックする(❸)
![9.png](https://qiita-image-store.s3.amazonaws.com/0/106533/ed0431c5-4324-7213-9a0c-39b99d6de70c.png)

５、item 0というのが登場するので**Value**に**xxxアプリのスキーム**を書く
　　(写真はxxxアプリがTwitterの場合の例です)
![10.png](https://qiita-image-store.s3.amazonaws.com/0/106533/1f86225d-0051-2765-7f46-dd88b363cfaf.png)

以上の
`UIApplication.shared.canOpenURL(URL(string: "xxxアプリに設定してあるスキーム://")!)`
のソースコードの記述と
`info.plistのLSApplicationQueriesSchemesにxxxアプリのスキームを記述`
があれば
**xxxアプリがインストールされているか**を知ることができます。

## スキームって？
**アプリを特定するための自由に決められる文字列(名前)**のことです。

**xxxアプリ**が**Twitter**とか**LINE**とか**Facebook**みたいに
`他人が作ったアプリ`の場合は
**スキームを知るにはxxxアプリを作った人に聞くしかない**ですが
`有名なアプリ`であれば**我々のアプリのスキームはこれです**と大体公開されてます。
せっかくなので**よく使うスキーム**を書いておきます。

**Twitter**
twitter

**LINE**
line

**Facebook**
fb (特定のページを開きたいなどは別のスキームが必要みたいです)

**Instagram**
instagram

けっこう、まんまですね。

逆に**xxxアプリが自作アプリの場合**は
**あらかじめxxxアプリにスキームを設定しておく必要がある**ので
**xxxアプリにスキームを設定する方法**も書いておきます。

## ② xxxアプリにスキームを設定する方法

１、プロジェクトが選択されている状態で、ピンクの丸がついてる**info**タブをクリックすると
　　下の方に**URLTypes**というのがあるので**＋**をクリックします。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/106533/4435b7cf-05b4-5a65-c9ff-7dfe57a20a02.png)

２、**＋**をクリックするとこんなんが出てきます。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/106533/8d7dfa18-ef58-a60b-3b73-952c9998014f.png)

３、**Identifier**のとこには**$(PRODUCT_BUNDLE_IDENTIFIER)**というものを$マークごと入れます。
　　**URL Schemes**のとこに、自分で決めた文字列を入れます。
　　(世に出てる他のアプリと被らないような文字列にします。xxxとかだと被りそうなのでダメです。)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/106533/efafa129-aa0d-1c9a-b6ad-80d2c5e77dc0.png)

４、ちゃんと設定できたかどうかは**info.plist**に入っているかを見れば確認できます。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/106533/4f88b62b-b765-8041-e9d7-3ab9562c6266.png)

TwitterとかLINEのアプリには
ここにtwitterとかlineとかの文字列が設定されてるワケです。

# 【２】 AppStoreのxxxアプリの詳細画面を出したい = openURL

ソースコードは

```
guard let url = URL( string: "itms-apps://itunes.apple.com/app/id{AppleID}" ) else { return }
UIApplication.shared.openURL( url )
```
**AppleID**っていうのは

iTunesConnectのココに書いてあるヤツのことで
![11.png](https://qiita-image-store.s3.amazonaws.com/0/106533/68fcb99e-7a74-2552-2b0e-50bd06b53c2c.png)

AppStoreでアプリを表示した時のURLの**idxxxxxxxxx**の数字の部分と同じヤツです
![12.png](https://qiita-image-store.s3.amazonaws.com/0/106533/832bee85-9057-2359-401d-41bc06fdc775.png)

実際IDを入れて書くとこんな感じです↓

```
guard let url = URL( string: "itms-apps://itunes.apple.com/app/id1065859705" ) else { return }
UIApplication.shared.openURL( url )
```

# 【３】 xxxアプリを起動したい = openURL
【２】と同じことです。
起動したいアプリによってURLとかスキームを変えるだけです。

**xxxというスキームの自作アプリなどをシンプルに起動したい場合**

```
guard let twitterUrl = URL(string: "xxx://") else { return }
UIApplication.shared.openURL(twitterUrl)
```

**Twitterアプリ**だったらこうなりますね↓

```
guard let twitterUrl = URL(string: "twitter://") else { return }
UIApplication.shared.openURL(twitterUrl)
```

おまけで、**Twitterの特定のユーザのプロフィールを起動したい場合**はこうです↓

```
guard let twitterUrl = URL(string: "twitter://user?id=371600086") else { return }
UIApplication.shared.openURL(twitterUrl)
```

# LSApplicationQueriesSchemesの記述が必要なのは【１】だけ
【２】【３】の**openURL**やりたいだけの時は`LSApplicationQueriesSchemes`の記述は必要ないです

`LSApplicationQueriesSchemes`の記述なしで**openURL**は動きます。
アプリ起動するんだから、絶対必要そうな感じしますよね？
いらないんだって。これが一番ややこしかった。

# 【１】【２】【３】など、やってみたけどできなかった方
コメントくれたらお返ししますのでお気軽にどうぞ！