くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

Custom URL Schemeでアプリを起動する

今回はCustom URL Schemeでアプリを起動する方法を書いていきたいと思います。

iOSでは、 cm-app:// のような、アプリ固有のCustom URL Schemeを実装することで、 リンクをタップしてアプリを起動することができます。( ディープリンクとも言います)

ディープリンクを使用すると、スキーム(上記の例ではcm-app)でアプリを識別して起動できます。

また、//( スラッシュ)以降のURL部分でアプリに対して情報を受け渡すことや、Webページからだけでなくアプリ間の遷移にも応用できます。

設定

まずはCustom URL Schemeの設定方法からです。下記、2つの方法があります。

  • info.plistから設定する方法
  • URL Typesから設定する方法

どちらで設定しても同じ結果になります。

今回は、cm-testというスキームを追加します。

①info.plistから設定

まずは、info.plistから設定する方法です。

info.plistに下記のように追加します。

URL Schemesには今回追加するcm-testを設定します。(複数指定できます)

URL identifireにはユニークな識別文字列を設定します。今回はBundle Identifierを設定しました。

②URL Typesから設定

次に、URL Typesから設定する方法です。

TARGET > info > URL Types の+で追加します。

設定後は下記のようになります。

これで、アプリを入れている端末のブラウザで cm-test:// と入力するとアプリを起動するか求められると思います。

起動後の流れ

では、アプリを起動するか求められた後に許可した場合にはどういう流れになるのかみていきたいと思います。

起動したらAppDelegate内の open url メソッドが実行されます。

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    print(url)
    print(url.scheme)
    print(url.host)
    print(url.path)
    print(url.query)

    return true
}

上記printしているのはURLのデータが渡ってきているかの確認のためです。

下記に詳細を記載します。(URLはcm-test://hoge/huga?userId=1を仮定します)

  • scheme -> cm-test
  • host -> hoge
  • path -> huga
  • query -> userId=1

このように値が渡ってくるため、渡ってきた情報を使って処理を行うことがほとんどだと思います。

さらに、open url メソッド内で画面遷移の処理を行えば、画面遷移できます。(rootViewなどに気を付けてください)

補足

アプリがインストールされているか知りたい場合にはcanOpenURLメソッドを使用します。

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

ただし、info.plistのLSApplicationQueriesSchemesスキーマを設定する必要があります。 LSApplicationQueriesSchemesのTypeをArrayにしてvalueにアプリのスキームを設定してください。

また、アプリがインストールされていない場合にアプリの設定画面に遷移するようにすると思いますが、次のように対象のアップルIDを設定することで アップルストアに遷移することができます。

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

そして、対象のアプリを起動したい場合にはカスタムスキーマを設定した状態でopenURLを実行すると起動できます。

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

参照

[Swift] カスタムURLスキームによるアプリ間連携

qiita.com