[iOS] ディープリンク(Custom URL Scheme)でアプリを起動する

ios

1 はじめに

ディープリンクとは、アプリの特定の画面に遷移(遷移先のアプリ側で実装が必要です)させることのできるリンクのことです。 iOSでは、 cm-app:// のような、アプリ固有の Custom URL Scheme を実装することで、これを実現できます。

ディープリンクを使用すると、スキーム(上記の例ではcm-app)でアプリを識別して起動できます。また、//以降のURL部分でアプリに対して情報を受け渡すことや、Webページからだけでなくアプリ間の遷移にも応用できます。

なお、ディープリンクは、あくまでアプリがインストールされている場合にのみ利用可能な機能であり、Universal Links(iOS9以降で利用可能)などとは、違いますのでご注意下さい。
参考:URLスキーム・独自ディープリンク実装に代わる、Universal Links(iOS 9で導入)でより良いUXを実現

2 Custom URL Schemeの設定

Custom URL Schemeの設定は、以下の2つの方法があります。

  • info.plistから設定する方法
  • TARGET > infoから設定する方法

どちらで設定しても同じ相互に反映されます。以下の手順は、cm-app というスキームを追加する要領です。

(1) info.plistから設定する方法

info.plistに、次のキーを追加します。

  • URL Schemes スキーマ文字列(複数指定可能)

  • URL identifire 識別文字列(端末内でユニークであれば、なんでも良い)

001

(2) TARGET > infoから設定する方法

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

  • URL Schemes スキーマ文字列
  • identifire 識別文字列(端末内でユニークであれば、なんでも良い)

006

(3) 動作確認

Safariで、cm-app:// を開こうとすると、次のように、アプリに遷移するかどうかのアラートが表示され、「Open」を選択した場合は、当該がアプリが起動します。 (Safari以外のブラウザでは、動作しません)

002 003

3 データの受け渡し

Custom URL Scheme 経由でアプリが起動された場合、application:openURL:options:をオーバーライドすることで、起動時の処理を記述できます。

パラメータでリクエストされたURLも取得することが可能なため、起動側からのデータの受け渡しに利用できます。

下記のように記述して

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    print("url : \(url.absoluteString)")
    print("scheme : \(url.scheme!)")
    print("host : \(url.host!)")
    print("port : \(url.port!)")
    print("query : \(url.query!)")
    return true
}

Safariでcm-app://hostname:8080/test?name=taroと入力すると 出力は、次のようになります。

url : cm-app://hostname:8080/test?name=taro
scheme : cm-app
host : hostname
port : 8080
query : name=taro

パラメータで受け取れるのは、URLオブジェクトであり、このオブジェクトで保持している情報は全て取得可能です。
参考:API Reference URL

4 注意事項

(1) Appleが定義しているスキーム

あらかじめAppleが定義しているスキームと同じものを設定した場合、設定したスキームは有効とならず、Apple提供のアプリが起動されます。

Appleで定義しているスキームについては、以下のリファレンスをご残照ください。
参考:About Apple URL Schemes

(2) スキーム名の重複

スキーム名が、重複してしまった場合の動作は保証されていません。また、重複によって、横取されてしまう可能性も有ることを認識しておく必要があります。

(3) アプリのインストール

Custom URL Schemeは、アプリがインストールされている場合にのみ有効です。

登録されていないスキームを指定したり、当該アプリがインストールされていない場合は、以下のように、エラーとなるだけで、「ストアに誘導する」などの処理を実装することはできません。

004 005

5 アプリ間の遷移

スキームを利用して他のアプリを起動する、以下のようなコードは、iOS 9以降、このままでは利用できなくなっています。

let url = URL(string: "cm-app://")!
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.openURL(url)
}
-canOpenURL: failed for URL: "cm-app://" - error: "This app is not allowed to query for scheme cm-app"

(1) LSApplicationQueriesSchemes

canOpenURL(_:)は、info.plistにLSApplicationQueriesSchemesキーを追加しないと、常にfalseとなってしまいます。

008

(2) openURL(_:)

openURL(:) は、iOS 10でDeprecatedとなっているため、open(:options:completionHandler:)を使用する必要があります。

iSO 10にも対応したコードは、以下のようになります。

let url = URL(string: "cm-app://")!
if UIApplication.shared.canOpenURL(url) {
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(url, options: [:], completionHandler: {
            (success) in
            print("Open \(success)")
        })
    }else{
        UIApplication.shared.openURL(url)
    }
}

6 最後に

今回、Custom URL Schemeについてまとめてみました。便利ではありますが制約も多数あるため、機能をよく把握して利用する必要がありそうです。

次回は、より柔軟に利用可能なUniversal Linksについて纏めてみたいと思います。

7 参考資料


アプリケーション間通信 プログラミングガイド