检查javascript是否支持URL方案

60 javascript iphone safari url-scheme

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

小智 60

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

当您尝试不受支持的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>
Run Code Online (Sandbox Code Playgroud)

  • @samvermette有一个半复杂的解决方法.如果网址方案有效,请让您的应用向您的服务器发送确认.然后,当您返回应用程序时,让它ping服务器以查看应用程序是否已成功打开.复杂但可行. (9认同)
  • 如果没有安装应用程序,有没有办法不显示可怕的不友好错误? (7认同)
  • 值得一试,但这确实是一个令人讨厌的解决方案.即使URL方案在您返回页面时通过,也会调用该函数.因此,无论如何,用户都会收到警报弹出窗口.1或2,取决于他的设备是否支持该方案. (2认同)

小智 37

这是一个解决方案,当你从应用程序回来时它没有显示弹出窗口,它假设你已经超过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);
}
Run Code Online (Sandbox Code Playgroud)


Tho*_*esk 11

我发现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);
  }
Run Code Online (Sandbox Code Playgroud)


小智 7

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

HTML:

<a class="uri-link" data-uri="qobuzapp://" href="#">URI</a>?
Run Code Online (Sandbox Code Playgroud)

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')); 
});?
Run Code Online (Sandbox Code Playgroud)

这是一个有效的jsFiddle,只需用你自己的URI方案更新它:http: //jsfiddle.net/mF6TZ/

  • jsfiddle死了 (3认同)

ela*_*leb 6

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

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

包含以下元标记:

<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">
Run Code Online (Sandbox Code Playgroud)

取自此处: Safari Web内容指南


And*_*ant 4

不,不是来自网页。

  • @布伦特皇家戈登:不。本机 iPhone 应用程序可以通过调用 **canOpenURL:** 进行检查。 (12认同)
  • 从网页有一种方法:http://stackoverflow.com/questions/1108693/is-it-possible-to-register-a-httpdomain-based-url-scheme-for-iphone-apps-like-y/ 1109200#1109200 (4认同)
  • 感谢你及时的答复。就本机代码而言,可以通过 openUrl: 进行检查,所以我已阅读...未测试 (2认同)