web-dev-qa-db-ja.com

iOS9:可能であればスキーム経由でアプリを開くか、そうでなければアプリストアにリダイレクトしてください

私の質問はiOS9のみです!

HTMLランディングページがあり、アプリがインストールされている場合、URLスキームを介してユーザーをアプリにリダイレクトしようとします。それ以外の場合は、Appstoreにリダイレクトします。

私のコードは:

document.addEventListener("DOMContentLoaded", function(event) {

  var body = document.getElementsByTagName('body')[0];
  body.onclick = function () {
    openApp();
  };
});

var timeout;

function preventPopup() {

    clearTimeout(timeout);
    timeout = null;
    window.removeEventListener('pagehide', preventPopup);
}

function openApp(appInstanceId, platform) {

  window.addEventListener('pagehide', preventPopup);
  document.addEventListener('pagehide', preventPopup);

  // create iframe
  var iframe = document.createElement("iframe");
  document.body.appendChild(iframe);
  iframe.setAttribute("style", "display:none;");
  iframe.src = 'myscheme://launch?var=val';

  var timeoutTime = 1000;
  timeout = setTimeout(function () {

    document.location = 'https://iTunes.Apple.com/app/my-app';

  }, timeoutTime);
}

問題は、iframeトリックがSafariiOS9で機能しないことです。

理由は何ですか?

this answerに基づく私のiframeトリック。

39
gran33

Iframeのトリックはもはや機能しません-私の推測ではAppleはより多くの開発者がより迅速にユニバーサルリンクを実装することを奨励することを知っています。

window.location='your-uri-scheme://';および500ミリ秒後にApp Storeにフォールバックします。 Branch で行うように、このアプローチをとる場合、ポップアップ間に「ダンス」があります(ユニバーサルリンクが機能しない場合はフォールバックとして行います)。

window.location = 'your-uri-scheme://'; // will result in error message if app not installed
setTimeout(function() {
   // Link to the App Store should go here -- only fires if deep link fails                
   window.location = "https://iTunes.Apple.com/us/app/myapp/id123456789?ls=1&mt=8";
}, 500);

私はあなたのためにより良い答えがあればいいのに。 iOS 9は間違いなくより制限されています。

ユニバーサルリンクに必要なものの有用な概要については、私のルートをご覧ください here または このチュートリアルを読む

23
st.derrick

すでに述べたように、設定window.locationはiOS 9でも動作します。ただし、これにより[アプリで開く]ダイアログが表示されます。 https://bartt.me/openapp に例を挙げました:

  1. Twitterアプリで開くをクリックすると、Twitterを起動します。
  2. App StoreのTwitterアプリに戻ります。
  3. TwitterまたはApp StoreにリダイレクトしますwithoutユーザーがOpenを選択アプリダイアログで開きます。
  4. IOSおよびAndroidのすべてのブラウザーで動作します。

詳細については、 https://lab.bartt.me/openapp のソースをご覧ください。

2
Bart Teeuwisse

ユニバーサルリンクへのアプリのサポートをお試しください

アイデア:Safariでカスタム(JavaScript、iframe)ソリューションを避け、サポートされているユニバーサルリンクでコードを置き換えます。

<html>
<head>
...
</head>
<body>
    <div class"app-banner-style">
        <a href="http://yourdomain.com">In app open</a> 
    </div>
...content
</body>
</html>

アプリがユニバーサルリンク(yourdomain.comなど)をサポートしている場合は、ドメイン(およびパス)を設定し、iOS9がそのリンクに反応してアプリを開く必要があります。 それは理論にすぎません、しかし私はうまくいくはずです:)

https://developer.Apple.com/library/prerelease/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//Apple_ref/doc/uid/TP40016308-CH12

1
carlos.baeza

iframeハックはios9ではもう機能しません。可能な解決策は、2つのボタンを使用することです。例:

$('#goToStoreBtn').text( "go to store" ).click(function(event){
    event.preventDefault();
    event.stopPropagation();
    window.location = storeUrl; // https://iTunes.Apple.com/...
});

$('#goToAppBtn').text( "go to app" ).click(function(event){
    event.preventDefault();
    event.stopPropagation();
    window.location = appUrl;  // myApp://...
});
0
xac