检查javascript中是否支持URL方案

检查javascript中是否支持URL方案,javascript,iphone,safari,url-scheme,Javascript,Iphone,Safari,Url Scheme,有没有办法检查手机上当前是否注册了URL方案。。。使用javascript?不,不是来自网页。不是无缝的。 但有一种方法类似于检查弹出窗口是否被阻止 当您尝试一个不受支持的URL方案时,Safari将警告用户它不知道如何处理它,并停留在同一页面上 因此,如果你给你的应用程序打电话一段时间来激活,比如说300毫秒,然后做些别的事情来回应这个不存在的计划 它不是最漂亮的,但很管用: function startIThrown(){ document.location = 'ithrown://r

有没有办法检查手机上当前是否注册了URL方案。。。使用javascript?

不,不是来自网页。

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

当您尝试一个不受支持的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>
函数startIThrown(){
document.location=ithrown://restart';
setTimeout(函数(){
如果(确认('您似乎没有安装iThrown,是否立即下载?')){
document.location=http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=293049283&mt=8&uo=6';
}
}, 300);
}

这里有一个解决方案,当您从应用程序返回时,它不会显示弹出窗口,它假设您离开的时间超过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);
}
函数startiThrown(){
document.location=appurl;
var time=(新日期()).getTime();
setTimeout(函数(){
var now=(new Date()).getTime();

if((now-time)这是前两个解决方案的一个变体。它将创建一个可以在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>

功能检查铬(h){
文件位置=h;
var time=(新日期()).getTime();
setTimeout(函数(){
var now=(new Date()).getTime();
如果((现在时间)另一个很好的解决方法(至少在最新的浏览器版本中工作)是检查浏览器窗口在短时间超时后是否有焦点,那么只有当URI方案不起作用时,您才能向用户显示对话框

HTML:


我发现
pagehide
事件比依赖系统时间更健壮

  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);
  }

从iOS 6.0开始,苹果发布了智能应用横幅,这些横幅符合我们大多数人的需求:

  • 如果应用未安装,则发送到应用商店
  • 使用App参数param打开具有特定深度链接的应用程序
包括以下元标记:

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

摘自这里:

我有一个jQuery插件,用于将替代应用程序链接添加到常规链接。

我尝试只使用“pagehide”事件,但它不适用于Firefox。我在这里创建的这个版本适用于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>
​
​
​

这是基于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);
}
函数startiThrown(){
document.location=appurl;
var time=(新日期()).getTime();
setTimeout(函数(){

setTimeout(函数(){//我想我想起了一种应用程序可以检查这一点的方法,但我可能错了。谢谢你的快速回答。就本机代码而言,可以通过openUrl进行检查,所以我读过……不是tested@BrentRoyal Gordon:没有。本地iPhone应用程序可以通过调用canOpenURL进行检查:。网页上有一种方法:这就是其中之一“事实上是正确的,但实际上没有那么有用"回答。解决了OP可能首先应该问的问题!值得一试,但实际上这是一个令人讨厌的解决方案。即使URL方案在您返回页面时通过,该函数也会被调用。因此,用户无论遇到什么情况都会收到一个警报弹出窗口。1或2,取决于他的设备是否支持方案。@samvermette有一个半复杂的解决方法。如果url方案有效,那么让你的应用程序向你的服务器发送确认。然后当你返回应用程序时,让它ping服务器以查看应用程序是否成功打开。复杂但可行。如果应用程序被打开,有没有办法不显示这种可怕的不友好错误未安装?iOS 13.3解决方案很好地解决了“可怕的不友好错误”:我发现这里发布的解决方案工作得更好:当你没有安装应用程序时,插件无法解决警报问题我们遇到了一个问题,“现在”此解决方案中的变量完全错误。我们可以在应用程序中等待几分钟,然后返回浏览器并获得确认。似乎休眠唤醒过程有问题。概念不错。尽管找到的应用程序从未出现过。即使安装了应用程序(我试过instagram://app)它会触发notfound(未找到)。您是否尝试使超时更大?将第95行中的值从1000更改为9000(只是为了好玩)然后告诉我发生了什么。该代码不起作用。当模式存在且与可执行文件关联时,浏览器会询问是否要运行该应用程序。该延迟会导致超时,显然,
confirm
函数将被执行。该代码不起作用。当模式存在且与可执行文件关联时,浏览器会询问是否要运行该应用程序。这种延迟会导致超时,显然,
确认
功能会被执行。
<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>
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);
}