移动Safari页面卸载/隐藏/模糊深度链接

时间:2013-02-05 19:39:45

标签: javascript ios safari mobile-safari deep-linking

我正在寻找一个关于移动版Safari的活动,它将检测页面因重定向而被隐藏的时间。我想直接打开我的应用程序,如果用户安装了它,然后尝试安装facebook,如果没有,则转到该网页获取该ID。

  1. 如果安装了“myapp”,则会打开myapp。但是safari标签仍然被重定向到facebook.com
  2. 如果没有安装'myapp',但facebook是,则打开facebook ios app。但是safari标签仍然被重定向到facebook.com
  3. 我使用以下HTML / JS创建了test link

        <!DOCTYPE html>
        <html>
        <head>
                <title>Redirect Test</title>
                <script type='text/javascript' src='//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js'></script>
                <meta name='viewport' content='initial-scale = 1.0,maximum-scale = 1.0' />
        </head>
        <body>
        <button>Open Oreo</button>
        <script type='text/javascript'>
        jQuery(function(){
                jQuery( 'button' ).on( 'click', function(){
                        var myid = null, fbid = null;
    
                        // Watch for page leave to kill timers
                        jQuery( window ).on( 'pagehide pageshow blur unload', function(){
                                if ( myid ) {
                                        clearTimeout( myid );
                                }
                                if ( fbid ) {
                                        clearTimeout( fbid );
                                }
                        });
    
                        window.location = "myapp://fbprofile/oreo";
                        var myid = setTimeout(function(){
    
                                // My app doesn't exist on device, open facebook
                                window.location = "fb://profile/oreo";
                                fbid = setTimeout(function(){
    
                                        // Facebook doesn't exist on device, open facebook mobile
                                        window.location = "https://www.facebook.com/oreo";
                                }, 100);
                        }, 100);
                });
        });
        </script>
        </body>
        </html>
    

1 个答案:

答案 0 :(得分:20)

好的代码。
编辑:(删除了有关添加return false;

的建议

尝试在setTimeout功能中设置一个支票,而不仅仅是清除超时。 (我发现清除对于间隔更有效,而不是简单的1次setTimeout调用)。此外,在尝试使用我的app://fb://之类的原生应用协议之前,我会检查以确保用户不在桌面浏览器上,因为这些浏览器会尝试关注该位置并最终显示错误。

尝试:

<!DOCTYPE html>
<html>
<head>
    <title>Redirect Test</title>
    <script type='text/javascript' src='//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js'></script>
    <meta name='viewport' content='initial-scale = 1.0,maximum-scale = 1.0' />
</head>
<body>
<button>Open Oreo</button>
<script type='text/javascript'>
var mobileExp = /android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile|o2|opera mini|palm( os)?|plucker|pocket|pre\/|psp|smartphone|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce; (iemobile|ppc)|xiino/i;

jQuery(function(){
    jQuery( 'button' ).on( 'click', function(){

        // Don't give desktop browsers a chance to fail on a nativeapp:// protocol
        if(!mobileExp.test(navigator.userAgent)) {
            window.location = "https://www.facebook.com/oreo";
            return;
        }

        var clicked = +new Date, timeout = 100;

        window.location = "myapp://fbprofile/oreo";

        setTimeout(function(){
            // If we're still here after a (timeout), try native facebook app
            if (+new Date - clicked < timeout*2){
                console.log('clicked '+ (+new Date - clicked) +' ago- go to FB');
                window.location = "fb://profile/oreo";
            } else {
                console.log('too late for facebook');
            }
            setTimeout(function(){
                // If we're still here after another (timeout), try facebook web app
                if (+new Date - clicked < timeout*2){
                    console.log('clicked '+ (+new Date - clicked) +' ago- go to browser');
                    window.location = "https://www.facebook.com/oreo";
                } else {
                    console.log('too late for browser');
                }
            }, timeout);
        }, timeout);
    });
});
</script>
</body>
</html>

当然,取消注释控制台日志并尝试使用timeout的值进行一些试验。这个确切的代码在IOS 6.1 Safari和Safari 6.0.2 Mac中成功测试。希望它有所帮助!