Edited at

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

More than 1 year has passed since last update.


やりたいことって大体以下3つですよね


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


【2】(インストールされてなかったら)AppStoreのxxxアプリの詳細画面を出したい


【3】(インストールされてたら)xxxアプリを起動したい

1つ1つの単品記事はよく見かけるのですが

あっちゃこっちゃ調べて結構めんどかったのと

LSApplicationQueriesSchemesのトラップにやっぱり引っかかったので

全人類代表して長尾が1記事にまとめます。


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

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

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

つまり

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

// xxxアプリがインストールされている
} else {
// xxxアプリがインストールされていない
}

です。

しかし

(iOS9以降は)ソースコード書いただけでは動かない

のです。

info.plistLSApplicationQueriesSchemes

xxxアプリスキームを書いてあげる必要があります。


① info.plistのLSApplicationQueriesSchemesにxxxアプリのスキームを記述する方法

1、info.plistInformation Property Listの横のをクリック(+が見えなかったりしますがマウスを乗せると見えます)

5.png

2、をクリックするとこんな感じで選べみたいになりますが無視してLSApplicationQueriesSchemesという文字をコピって

7.png

3、貼りつけます

8.png

4、・貼りつけたLSApplicationQueriesSchemesTypeArrayにする(❶)

  ・(写真では白い三角で大変見づらいですが)出てきた▶︎をクリックする(❷)

  ・(▶︎をクリックしても何も起こらないが)LSApplicationQueriesSchemesの右のをクリックする(❸)

9.png

5、item 0というのが登場するのでValuexxxアプリのスキームを書く

  (写真はxxxアプリがTwitterの場合の例です)

10.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アプリにスキームを設定する方法

1、プロジェクトが選択されている状態で、ピンクの丸がついてるinfoタブをクリックすると

  下の方にURLTypesというのがあるのでをクリックします。

1.png

2、をクリックするとこんなんが出てきます。

2.png

3、Identifierのとこには$(PRODUCT_BUNDLE_IDENTIFIER)というものを$マークごと入れます。

  URL Schemesのとこに、自分で決めた文字列を入れます。

  (世に出てる他のアプリと被らないような文字列にします。xxxとかだと被りそうなのでダメです。)

3.png

4、ちゃんと設定できたかどうかはinfo.plistに入っているかを見れば確認できます。

4.png

TwitterとかLINEのアプリには

ここにtwitterとかlineとかの文字列が設定されてるワケです。


【2】 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

AppStoreでアプリを表示した時のURLのidxxxxxxxxxの数字の部分と同じヤツです

12.png

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

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

UIApplication.shared.openURL( url )


【3】 xxxアプリを起動したい = openURL

【2】と同じことです。

起動したいアプリによって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の記述が必要なのは【1】だけ

【2】【3】のopenURLやりたいだけの時はLSApplicationQueriesSchemesの記述は必要ないです

LSApplicationQueriesSchemesの記述なしでopenURLは動きます。

アプリ起動するんだから、絶対必要そうな感じしますよね?

いらないんだって。これが一番ややこしかった。


【1】【2】【3】など、やってみたけどできなかった方

コメントくれたらお返ししますのでお気軽にどうぞ!