how to prevent iOS safari alert when trying to open non-installed native app?

人盡茶涼 提交于 2019-11-26 23:57:39

问题


I've been looking for a way to open a native iOS app from the browser. I found a decent solution here: Is it possible to register a http+domain-based URL Scheme for iPhone apps, like YouTube and Maps?

This solution works great when you have the app installed. but when a user doesn't have this app installed - safari fires an error message which says "Safari cannot open the page because the address is invalid."

Is there a way to prevent this behaviour and instead to prompt the user to download the app?


回答1:


Here is a solution that works for me:

var timeout;

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

function openApp() {    
    $('<iframe />')
    .attr('src', appurl)
    .attr('style', 'display:none;')
    .appendTo('body');

    timeout = setTimeout(function() {
            document.location = appstore;
    }, 500);
    window.addEventListener('pagehide', preventPopup);
} 



回答2:


use iframe.

$('<iframe />').attr('src', "appname://").attr('style', 'display:none;').appendTo('body');



回答3:


For solving this and avoid no wanted iOS safari alert I've used a different approach handle also an iframe but without jquery and listener events. It works perfectly.

    var iframe = document.createElement("iframe");

    iframe.style.border = "none";
    iframe.style.width = "1px";
    iframe.style.height = "1px";
    iframe.onload = function () {
        document.location = alt;
    };
    iframe.src = nativeSchemaUrl; //iOS app schema url

    window.onload = function(){
        document.body.appendChild(iframe);
    }

    setTimeout(function(){
        window.location = fallbackUrl; //fallback url
    },300);



回答4:


I'm using meta refresh as fallback because this works without javascript. This code works in iOS and Android.

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="refresh" content="1; url=http://www.facebook.com">
    <title>Redirecting..</title>
    <script>
    function tryOpenApp() {
                var iframe = document.createElement("iframe");
                iframe.style.border = "none";
                iframe.style.width = "1px";
                iframe.style.height = "1px";
                iframe.src = "fb://feed/";
                document.body.appendChild(iframe);
    }
    </script>
  </head>
  <body onload="tryOpenApp()">
  </body>
</html>

Test http://static-pmoretti.herokuapp.com/deep-link/




回答5:


The right way to do this is to use Smart App Banners: https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html

If your app is not installed, the banner will let the user install it. If it is installed, it will open the app, and you have a way of specifying custom URL arguments to pass to the app.



来源:https://stackoverflow.com/questions/19701708/how-to-prevent-ios-safari-alert-when-trying-to-open-non-installed-native-app

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!