检查 javascript 是否支持 URL 方案

问题描述 投票:0回答:11

有什么方法可以使用 javascript 检查 URL 方案当前是否已在手机上注册吗?

javascript iphone safari url-scheme
11个回答
64
投票

不是无缝的。 但有一种方法类似于检查弹出窗口是否被阻止。

当您尝试不支持的 URL 方案时,Safari 会警告用户它不知道如何处理它并停留在同一页面上。

因此,如果您给应用程序调用一些时间来激活,例如 300 毫秒,然后执行其他操作来响应该方案的不存在。

这不是最漂亮的,但很有效:

function startIThrown(){
  document.location = 'ithrown://restart';
  setTimeout(function(){
    if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
      document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
    }
  }, 300);
}

<a href="#" onclick="startIThrown()">Restart iThrown</a>

39
投票

这里有一个解决方案,当您从应用程序返回时不显示弹出窗口,它假设您离开的时间超过 400 毫秒:

function startiThrown() {
    document.location = appurl;
    var time = (new Date()).getTime();
    setTimeout(function(){
        var now = (new Date()).getTime();

        if((now - time)<400) {
            if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
            document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
            }
         }
    }, 300);
}

14
投票

我发现

pagehide
事件比依赖系统时间更稳健。对于我们这些喜欢非 jQuery 的人来说,这里是代码片段。

  var appurl = 'custom://url';
  var appstore = 'https://itunes.apple.com/us/app/your-app';

  var timeout;
  function preventPopup() {
    clearTimeout(timeout);
    timeout = null;
    window.removeEventListener('pagehide', preventPopup);
  }
  function startApp() {
    window.location = appurl;
    timeout = setTimeout(function(){
      if(confirm('You do not seem to have the App installed, do you want to go download it now?')){
        document.location = appstore;
      }
    }, 1000);
    window.addEventListener('pagehide', preventPopup);
  }

9
投票

另一个很棒的(至少在最新的浏览器版本中工作)解决方法是检查浏览器窗口在短暂超时后是否具有焦点,这样,仅当 URI 方案不起作用时,您才可以向用户显示一个对话框

HTML:

<a class="uri-link" data-uri="qobuzapp://" href="#">URI</a>​

Javascript(这里使用 jQuery):

var windowHasFocus;

$(window).focus(function() {
  windowHasFocus = true;
}).blur(function() {
  windowHasFocus = false;
});

function goToUri(uri) {
  window.location = uri;
  setTimeout(function(){
    if (windowHasFocus) {
      if (confirm('You do not seem to have Qobuz installed, do you want to go download it now?')){
        window.location = 'http://www.qobuz.com';
      }
    }
  }, 100);
}

$('a').on('click', function(){ 
  goToUri($(this).data('uri')); 
});​

8
投票

从 iOS 6.0 开始,Apple 推出了智能应用横幅,它满足了我们大多数人的需求:

  • 如果未安装应用程序,请发送到 App Store。
  • 使用 app-argument 参数打开具有特定深层链接的应用程序。

包含以下元标记:

<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">

取自这里: Safari 网页内容指南


4
投票

不,不是来自网页。


2
投票

这是前两个解决方案的变体。它将创建一个可以在 Google Chrome 中打开的链接。如果失败,它将使用 http 打开链接

<script>
 function checkChrome(h){
  document.location=h;
  var time = (new Date()).getTime();
  setTimeout(function(){
   var now = (new Date()).getTime();
   if((now-time)<400) {
    if(confirm('Missing Chrome. Download it now?')){
     document.location = 'http://itunes.apple.com/us/app/chrome/id535886823?mt=8';
    } else {
     document.location=h.replace('googlechrome','http');
    }
   }
  }, 300);
 }
</script>

<a href="googlechrome://www.google.com" onclick="checkChrome(this.href);return false;">Open Google with Chrome</a>

1
投票

这是基于mrahman的回答。如 JoshNaro 所指出的,在超时内调用时,new Date() 返回错误的日期。测试表明,在应用程序停用之前启动的线程中,日期不会更新。

激活后调用的更丑陋的 setTimeout 将创建一个具有当前日期的新线程。

这是在 iOS 8 上测试的。

function startiThrown() {
    document.location = appurl;
    var time = (new Date()).getTime();
    setTimeout(function(){
        setTimeout(function(){ // <-- start new thread after activation
            var now = (new Date()).getTime();
            if((now - time)<400) {
                if(confirm('You do not seem to have iThrown installed, do you want to go download it now?')){
                    document.location = 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
                }
            }
        }, 10); // <-- start new thread after activation
    }, 300);
}

0
投票

我尝试仅使用“pagehide”事件,但它不适用于 Firefox。我在这里创建了这个版本http://jsfiddle.net/thiagomata/6tvoc4f1/2/,它适用于 Firefox、Google Chrome 和 Safari。我还没有在 Internet Explorer 中进行测试。

要使其在 Firefox 中工作,必须使用 Iframe 来设置 src。这使我可以在不离开页面的情况下调用应用程序。

<a class="uri-link" href="#" 
  data-uri-app="myapp://" 
  data-url-app-not-found="http://www.google.com?q=not-found-link"
  >
  Example 1
</a>​
<a class="uri-link" href="#" 
  data-uri-app="myapp://" 
  data-url-app-not-found="http://www.google.com?q=not-found-link"
  data-url-app-found="http://www.google.com?q=found-link"
  >
  Example 2
</a>​
<a class="uri-link"  href="#"
  data-uri-app="notexists://" 
  data-url-app-not-found="http://www.google.com?q=not-exists"
>
  Example 3
</a>​
<iframe id="callapp" style="display:none"></iframe>

0
投票

我有此评论https://stackoverflow.com/a/18715513/49114,其中包含 jQuery 插件,可将替代应用程序链接添加到常规链接。


0
投票

现在我们有了浏览器可见性 API,其中包含 pagehide、pageshow 等事件。窗口上还具有模糊和焦点事件。 https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API

使元素聚焦,然后执行 window.location = ...

然后你可以设置Timeout并使用document.activeElement检查焦点元素。

当元素再次获得焦点时,这是因为 Safari 出现错误,然后就可以进行回调了。

或者,如果切换成功,那么当用户返回时,您将获得页面隐藏和页面显示事件。

© www.soinside.com 2019 - 2024. All rights reserved.