93
54

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

体育会系エンジニアAdvent Calendar 2017

Day 11

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

Last updated at Posted at 2017-12-10

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

やりたいことって大体以下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】など、やってみたけどできなかった方

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

93
54
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
93
54

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?