web-dev-qa-db-ja.com

カスタムURLスキームを使用したiOS 9サファリiframe srcが機能しない

このソリューションを使用します https://Gist.github.com/davidwkeith/2662899 アプリがインストールされている場合、ウェブからアプリにリダイレクトします。しかし、それはiOS 9で壊れていました。Googleクロームでは動作しますが、カスタムURLスキームを使用したiframeは、safariでアプリを起動しません。

私が交換した場合

document.getElementById('loader').src = 'custom-protocol://my-app'

(ローダーがiframeである場合)

window.location = 'custom-protocol://my-app'

仕事になります。

os:iOS 9 beta4およびbeta5

誰もがこの問題を知っていますか? iOS 9ベータ版のバグですか?それとも修正されませんか?

32
Kirill

前の回答は、重要な詳細が欠落しており、App Storeへのフォールバックが含まれていないユニバーサルリンクの部分的な実装です。

まず、URIスキームをトリガーするためにiframe srcを設定できなくなりました。その問題を正しく特定しました。ただし、既に述べたように、window.location = 'custom-protocol://my-app';を設定することはできます。ブラウザからアプリを開いたことがあり、バックエンドでルックアップできるCookieが保存されているため、ユーザーがアプリを持っていることがわかっている場合でも、custom-protocol://を安全に起動できます。

次に、navigator.userAgentを使用してユーザーエージェント文字列を検出できます。 iOS 9より前では、iframeを使用してURIスキームを起動し、タイムアウト後にフォールバックできます。 iOS 9では、Cookieに基づいてURIスキームを起動するかどうかを選択してから、ユーザーをApp Storeに移動できます。 Branch でこれに取り組んでおり、ユーザーがアプリを持っている可能性が高いかどうかをCookieを使用して実装することを実装しています。それについてさらに質問がある場合はお気軽にご連絡ください。または、当社のソリューションを直接ご利用ください。


ユニバーサルリンクの実装は、他の答えが説明するほど簡単ではありません。実際には、かなり複雑です。手順の完全なリストを次に示します(ここ数週間、これらの手順を使用していくつかのアプリの統合を支援しました)。

1。承認済みドメインを登録するようにアプリを構成します

私。 developer.Apple.comでアプリを登録していない場合

ii。 developer.Apple.comのアプリ識別子で「関連付けられたドメイン」を有効にします

iii。 Xcodeプロジェクトで「関連付けられたドメイン」を有効にします

entitlements

iv。アプリに適切なドメインエンタイトルメントapplinks:yourdomain.comを追加します

applinks

2。 「Apple-app-site-association」ファイルをホストするようにWebサイトを構成します

私。ドメイン名を購入するか、既存のものから選ぶ

ii。ドメイン名のSSL証明書を取得します(これにはCloudFlareを使用できます!)

iii。構造化された「Apple-app-site-association」JSONファイルを作成します

{
   "applinks": {
       "apps": [ ],
       "details": {
           "TEAM-IDENTIFIER.YOUR.BUNDLE.IDENTIFIER": {
               "paths": [
                   "*"
               ]
           }
       }
   }
}

iv。 SSL証明書でJSONファイルに署名する

cat Apple-app-site-association-unsigned | openssl smime -sign -inkey yourdomain.com.key -signer yourdomain.com.cert -certfile digicertintermediate.cert -noattr -nodetach -outform DER > Apple-app-site-association

v。ファイルサーバーを構成する

Apple-app-site-associationファイル:-ヘッダー「application/pkcs7-mime」とともに送信する必要があります-エンドポイントyoudomain.com/Apple-app-site-associationから送信する必要があります-200 HTTPコードを返す必要があります.

Express + Nodeの例:

var aasa = fs.readFileSync(__dirname + '/static/Apple-app-site-association');
app.get('/Apple-app-site-association', function(req, res, next) {
     res.set('Content-Type', 'application/pkcs7-mime');
     res.status(200).send(aasa);
});

クレジット: このブログ投稿から自由に借りました

17
st.derrick

はい、iOS9ではディープリンクが可能になりました。詳細な説明についてはリンクを確認してください。ただし、基本を説明しました。

http://blog.hokolinks.com/how-to-implement-Apple-universal-links-on-ios-9/

まず、ターゲットに移動して機能をクリックする必要があります。関連付けられたドメインを追加します。

次に、Apple-app-site-associationファイルをアップロードする必要があります。

基本的にJSONエディターを開き、次のようなものを作成します

{
  "applinks": {
"apps": [],
"details": {
  "TBEJCS6FFP.com.domain.App": {
    "paths":[ "*" ]
  }
}
  }
}

次に、アプリでユニバーラルリンクをサポートする必要があります。実装する必要があります

extension AppDelegate {
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        let webpageURL = userActivity.webpageURL! // Always exists
        if !handleUniversalLink(URL: webpageURL) {
            UIApplication.sharedApplication().openURL(webpageURL)
        }
    }
    return true
}

private func handleUniversalLink(URL url: NSURL) -> Bool {
    if let components = NSURLComponents(URL: url, resolvingAgainstBaseURL: true), let Host = components.Host, let pathComponents = components.path?.pathComponents {
        switch Host {
        case "domain.com":
            if pathComponents.count >= 4 {
                switch (pathComponents[0], pathComponents[1], pathComponents[2], pathComponents[3]) {
                case ("/", "path", "to", let something):
                    if validateSomething(something) {
                        presentSomethingViewController(something)
                        return true
                    }
                default:
                    return false
                }
1
mKane