web-dev-qa-db-ja.com

iOSアプリでユニバーサルリンクをサポートし、そのためにサーバーをセットアップする方法

iOSアプリケーションで ユニバーサルリンク をサポートし、ユニバーサルリンクをサポートするためにサーバーをセットアップするにはどうすればよいですか?

29

ユニバーサルリンクのサポート

ユニバーサルリンクをサポートすると、iOS 9ユーザーはWebサイトへのリンクをタップして、Safariを経由せずにインストール済みアプリにシームレスにリダイレクトできます。アプリがインストールされていない場合、ウェブサイトへのリンクをタップすると、ウェブサイトがSafariで開きます。

ここでは、独自のサーバーをセットアップし、アプリ内の対応するリンクを処理する方法。


セットアップサーバー

サーバーをオンラインで実行する必要があります。 iOSアプリをサーバーに安全に関連付けるには、AppleではApple-app-site-associationという設定ファイルを使用可能にする必要があります。これはドメインを説明するJSONファイルですおよびサポートされているルート。

Apple-app-site-associationファイルには、リダイレクトなしでhttps:// {domain}/Apple-app-site-associationHTTPSを介してアクセスできる必要があります。

ファイルは次のようになります。

{
"applinks": {
    "apps": [ ],
    "details": [
        {
            "appID": "{app_prefix}.{app_identifier}",
            "paths": [ "/path/to/content", "/path/to/other/*", "NOT /path/to/exclude" ]
        },
        {
            "appID": "TeamID.BundleID2",
            "paths": [ "*" ]
        }
    ]
}
}

[〜#〜] note [〜#〜]-.jsonApple-app-site-associationを追加しないでくださいファイル名。

キーは次のとおりです:
apps:値として空の配列が必要であり、存在する必要があります。これは、Appleが望んでいる方法です。
details:辞書の配列で、WebサイトでサポートされているiOSアプリごとに1つです。各辞書には、アプリ、チーム、およびバンドルIDに関する情報が含まれています。

パスを定義するには3つの方法があります:
Static:特定のリンクを識別するために、サポートされているパス全体がハードコーディングされています。/static/terms
Wildcards:*を使用して、動的パスを一致させることができます。/books/*は、著者のページへのパスと一致します。 ?特定のパスコンポーネント内、たとえばbooks/1? IDが1で始まる書籍と一致させるために使用できます。
Exclusions:NOTをパスの前に付けると、そのパスは一致から除外されます。

配列内でパスが言及される順序は重要です。以前のインデックスは優先度が高くなります。パスが一致すると、評価は停止し、他のパスは無視されます。各パスでは大文字と小文字が区別されます。

複数ドメインのサポート

アプリでサポートされる各ドメインは、独自のApple-app-site-associationファイルを利用可能にする必要があります。各ドメインによって提供されるコンテンツが異なる場合、ファイルのコンテンツもそれぞれのパスをサポートするように変更されます。それ以外の場合は、同じファイルを使用できますが、サポートされているすべてのドメインでアクセスできる必要があります。

App-Site-Associationファイルへの署名

サーバーがHTTPSを使用してコンテンツを提供し、アプリケーションセットアップガイドにジャンプする場合、この部分をスキップできます。

アプリがiOS 9をターゲットとしており、サーバーがHTTPSを使用してコンテンツを提供する場合、ファイルに署名する必要はありません。そうでない場合(たとえば、iOS 8でHandoffをサポートする場合)、承認された認証局からのSSL証明書を使用して署名する必要があります。

:これは、AppleがApp Storeにアプリを送信するために提供する証明書です。提供する必要があります。サードパーティにより、HTTPSサーバーに使用するものと同じ証明書を使用することをお勧めします(必須ではありません)。

ファイルに署名するには、まず単純な.txtバージョンのファイルを作成して保存します。次に、ターミナルで次のコマンドを実行します。

cat <unsigned_file>.txt | openssl smime -sign -inkey example.com.key -signer example.com.pem -certfile intermediate.pem -noattr -nodetach -outform DER > Apple-app-site-association

これにより、現在のディレクトリに署名されたファイルが出力されます。 example.com.keyexample.com.pem、およびintermediate.pemは、認証局によって利用可能になるファイルです。

:ファイルが署名されていない場合、Content-Typeapplication/jsonが必要です。それ以外の場合は、application/pkcs7-mimeになります。

Appleアプリ検索検証ツールでサーバーを検証する
iOS 9 Search APIのWebページをテストします。 URLを入力すると、ApplebotはWebページをクロールし、最適な結果を得るために最適化する方法を示します https://search.developer.Apple.com/appsearch-validation-tool/

ウェブサイトのコード

Webサイトのコードは、gh-pagesブランチ https://github.com/vineetchoudhary/iOS-Universal-Links/tree/gh-pages にあります。


IOSアプリケーションのセットアップ

アプリケーションはiOS 9を対象とし、Objective-CでXcode 7.2を使用します。

ユニバーサルリンクを有効にする

アプリ側のセットアップには2つのことが必要です。
1。アプリの資格を構成し、ユニバーサルリンクを有効にします。
2。 AppDelegateの着信リンクの処理。

1。アプリの資格を構成し、ユニバーサルリンクを有効にします。
アプリの資格を構成する最初のステップは、アプリIDでアプリを有効にすることです。 Apple Developer Member Center。証明書、識別子とプロファイル、識別子の順にクリックします。アプリIDを選択し(必要に応じて最初に作成)、[編集]をクリックし、関連付けられたドメインの資格を有効にします。

次に、それぞれのアプリIDをクリックして、アプリIDのプレフィックスとサフィックスを取得します。

アプリIDのプレフィックスとサフィックスは、Apple-app-site-associationファイルのプレフィックスと一致する必要があります。

[Xcode]で、アプリのターゲットを選択し、[機能]をクリックして、[関連付けられたドメイン]を[オン]に切り替えます。アプリがサポートするドメインごとに、applinks:というプレフィックスを付けてエントリを追加します。

例:applinks:vineetchoudhary.github.io

サンプルアプリでは次のようになります。 

:メンバーセンターで登録済みのアプリIDと同じチームを選択し、同じバンドルIDを入力したことを確認してください。また、ファイルを選択し、ファイルインスペクターでエンタイトルメントファイルがXcodeに含まれていることを確認し、ターゲットがチェックされていることを確認します。

AppDelegateで着信リンクを処理する

[UIApplicationDelegate application: continueUserActivity: restorationHandler:]AppDelegate.mメソッドは、着信リンクを処理します。このURLを解析して、アプリで適切なアクションを決定します。

たとえば、サンプルアプリでは:

Objective-C

-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
    if ([userActivity.activityType isEqualToString: NSUserActivityTypeBrowsingWeb]) {
        NSURL *url = userActivity.webpageURL;
        UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        UINavigationController *navigationController = (UINavigationController *)_window.rootViewController;
        if ([url.pathComponents containsObject:@"home"]) {
            [navigationController pushViewController:[storyBoard instantiateViewControllerWithIdentifier:@"HomeScreenId"] animated:YES];
        }else if ([url.pathComponents containsObject:@"about"]){
            [navigationController pushViewController:[storyBoard instantiateViewControllerWithIdentifier:@"AboutScreenId"] animated:YES];
        }
    }
    return YES;
}  

スイフト:

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
      if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
          let url = userActivity.webpageURL!
          //handle url
      }
      return true
  }

iOSアプリケーションコード

アプリコードは https://github.com/vineetchoudhary/iOS-Universal-Links/ のマスターブランチにあります。

注意:

  1. 通常、SafariまたはUIWebView/WKWebViewのインスタンスでサポートされているリンクをクリックすると、アプリが開きます。
  2. IOS 9.2以前の場合、これはデバイスでのみ機能します。 iOS 9.3(執筆時点ではまだベータ版)もシミュレータをサポートしています。
  3. iOSは、ユニバーサルリンクを開くときのユーザーの選択を記憶します。右上のパンくずリストをタップしてSafariでリンクを開くと、それ以降のクリックはすべてアプリではなくSafariに移動します。ウェブサイトのアプリバナーで[開く]を選択すると、デフォルトでアプリを開くように切り替えることができます。

できたそれはすべてユニバーサルリンクについてです。


参照資料

  1. iOSアプリでユニバーサルリンクをサポート
80

Vineetの投稿をすべて完了してもまだ機能しない場合は、配布プロビジョニングプロファイルを使用してみてください。上記の投稿からすべてを行いましたが、機能させるために配布プロファイルを発行する必要がありました。

開発プロファイルを使用すると、アプリはAASAファイルを正常にダウンロードしましたが、リンクを押していたときにアプリケーションを開くことはありませんでした。

それが役に立てば幸い。

1
mystoev

Swift 3 +、 Vineet Choudharyによる回答 に基づいて、ユニバーサルリンクを処理するためのコードを次に示します。

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
        let url = userActivity.webpageURL {
        //handle URL
    }

    return true
}
0
Tamás Sengel