检查 javascript 是否支持 URL 方案

IT技术 javascript iphone safari url-scheme
2021-01-19 21:54:45

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

6个回答

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

当您尝试不受支持的 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>
值得一试,但这确实是一个令人讨厌的解决方案。即使返回页面时 URL 方案通过,该函数也会被调用。因此,无论如何用户都会收到警报弹出窗口。1 或 2,取决于他的设备是否支持该方案。
2021-03-21 21:54:45
@samvermette 有一个半复杂的解决方法。如果 url 方案有效,则让您的应用向您的服务器发送确认。然后当你回到应用程序时,让它 ping 服务器以查看应用程序是否成功打开。复杂,但可行。
2021-04-05 21:54:45
iOS 13.3 解决方案很好地处理了“非常不友好的错误”:gist.github.com/diachedelic/0d60233dab3dcae3215da8a4dfdcd434
2021-04-08 21:54:45
如果未安装该应用程序,有什么方法可以不显示那个可怕的不友好错误?
2021-04-10 21:54:45

这是一个解决方案,当您从应用程序返回时不显示弹出窗口,它假设您已经离开超过 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);
}
我们遇到了一个问题,即此解决方案中的“now”变量完全错误。我们可以在应用程序中等待几分钟,返回浏览器并获得确认。休眠唤醒过程似乎有问题。
2021-04-07 21:54:45

我发现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);
  }
该代码不起作用。当模式存在并且与可执行文件相关联时,浏览器会询问是否要运行该应用程序。该延迟导致超时到达,显然,confirm函数将被执行。
2021-03-12 21:54:45

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

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

包括以下元标记:

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

取自此处: Safari Web 内容指南

另一个很好的(至少在最新的浏览器版本中工作)解决方法是在短暂的超时后检查浏览器窗口是否具有焦点,这样只有当 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')); 
});​
该代码不起作用。当模式存在并且与可执行文件相关联时,浏览器会询问是否要运行该应用程序。该延迟导致超时到达,显然,confirm函数将被执行。
2021-03-19 21:54:45