如何从移动浏览器启动应用程序(facebook/twitter/等),但如果未安装应用程序则退回到超链接

2024-04-01

我希望可能有某种方法可以从浏览器中检测 uri:scheme 是否在移动设备上注册。

IE:我想检查 facebook、twitter、pinterest 应用程序是否已安装并且可以从其关联的 uri:scheme 启动。

if(fb_isInstalled) {
    // href="fb://profile/...."
} else {
    // href="http://m.facebook.com/..."
}

基本上,如果用户安装了 Facebook,则启动该应用程序,但如果未安装该应用程序,则返回到 Facebook 网站的移动版本。


我想我已经有了一个可行的解决方案。

 <!-- links will work as expected where javascript is disabled-->
 <a class="intent"   
    href="http://facebook.com/someProfile"   
    data-scheme="fb://profile/10000">facebook</a>

我的 javascript 是这样工作的。
注意:其中混合了一些 jQuery,但如果您不想,则无需使用它。

(function () {

    // tries to execute the uri:scheme
    function goToUri(uri, href) {
        var start, end, elapsed;

        // start a timer
        start = new Date().getTime();

        // attempt to redirect to the uri:scheme
        // the lovely thing about javascript is that it's single threadded.
        // if this WORKS, it'll stutter for a split second, causing the timer to be off
        document.location = uri;
        
        // end timer
        end = new Date().getTime();

        elapsed = (end - start);

        // if there's no elapsed time, then the scheme didn't fire, and we head to the url.
        if (elapsed < 1) {
            document.location = href;
        }
    }

    $('a.intent').on('click', function (event) {
        goToUri($(this).data('scheme'), $(this).attr('href'));
        event.preventDefault();
    });
})();

我也把这个作为gist https://gist.github.com/ChaseFlorell/5119047你可以分叉和搞乱。您还可以包括gist https://gist.github.com/ChaseFlorell/5119047如果你愿意的话,在jsfiddle中。


Edit

@kmallea https://github.com/kmallea分叉了要点并从根本上简化了它。https://gist.github.com/kmallea/6784568 https://gist.github.com/kmallea/6784568

// tries to execute the uri:scheme
function uriSchemeWithHyperlinkFallback(uri, href) {
    if(!window.open(uri)){
        window.location = href;
    }
}
// `intent` is the class we're using to wire this up. Use whatever you like.
$('a.intent').on('click', function (event) {
    uriSchemeWithHyperlinkFallback($(this).data('scheme'), $(this).attr('href'));
    // we don't want the default browser behavior kicking in and screwing everything up.
    event.preventDefault();
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从移动浏览器启动应用程序(facebook/twitter/等),但如果未安装应用程序则退回到超链接 的相关文章

随机推荐

  • 使用 Capistrano 部署 Rails 5.1 / Webpacker 应用程序

    我有一个 Ubuntu 服务器来部署我的 Rails 项目 在我的 Ubuntu 服务器中 我有 RVM 现在我想使用 Rails 5 1 和 webpacker 部署新项目 为了部署这个项目 我在我的 Ubuntu 服务器中安装了 NVM
  • 如何为 Android 发送库

    我想为 Android 开发一个库 我可以以什么形式运送 jar apk 还是其他 我应该如何做才能让其他开发人员可以在他们的应用程序中使用我的库 如果您的库是纯 Java 代码 则 JAR 就可以了 也许可以用文档等进行压缩 如果您需要资
  • 如何将 SVN 存储库移至新服务器

    我们想要将两台服务器合并在一起 为此 我们需要在 新 服务器上安装 SVN 然后移动我们在 旧 服务器上设置的所有存储库 这是一个容易做的操作吗 可能使用 TortoiseSVN 提供的 重新定位 选项 最好的方法是什么 现在也是重新组织存
  • Hibernate多态查询

    我有两个类 Person 和 Company 它们派生自另一个类 Contact 它们在两个表 个人和公司 中以多态形式表示 简化的类如下所示 public abstract class Contact Integer id public
  • 如何将两个数据帧与日期进行比较,返回匹配日期并为新数据帧中的每一行标记不匹配日期

    我有一个数据框 每行中的每个受试者都有多个测量日期 另一个数据框有每行中同一受试者的多个访问日期 还包括一些 NA 我想要的是提取与某个主题的访问日期匹配的测量日期 并标记不符合访问日期的测量日期 例如 使用 FALSE 或 99 并保持
  • 如何用另一个 GestureDetector 包装 GestureDetector 并在各处获取事件

    如果我有一个GestureDetector具有内部GestureDetector我该如何设置才能使两个检测器都收到点击事件 您可以在此处查看运行代码 https dartpad dev 37807a51a48e52eda81c24cf672
  • HTML 和属性编码

    我遇到了一个发表在 Meta SO 上 https meta stackexchange com questions 104230 attack of the double encoded hellip part n我很好奇未编码和编码的
  • MVC3 C# 导出到 Excel

    我正在尝试将数据从数据库导出到 Excel 2007 文件 我只想将 html 文件的标题更改为 excel 2007 文件 我将数据格式化为表格并将标题更改为 Response AddHeader Content Disposition
  • BuildException:无法在 Android Studio 3.1 Canary 6 中执行 aapt

    我在 gradle 构建过程中遇到这个问题 org gradle tooling BuildException Failed to execute aapt at com android build gradle internal res
  • Wifi和3G同时使用

    对于我的应用程序 我需要来自本地网络和互联网的数据 本地网络 Wifi 无法连接到互联网 因此我必须使用移动连接 例如 3G 但每当我连接到本地网络时 3G 就会停止 询问三星服务后 无法在 UI 中更改该设置 但他们无法告诉我是否有可编程
  • Kotlin - 将集合转换为数组列表

    我正在将 Java 应用程序转换为 Kotlin 在某一方面 它使用 apache IO 的 FileUtils listFiles 函数 这些返回集合 我在将集合转换 转换为 ArrayList 时遇到问题 val myFiles Fil
  • SQL - 从数据库中选择最“活跃”的时间

    非常密切相关SQL 从数据库中选择最 活跃 的时间跨度 https stackoverflow com questions 12938302 sql select most active timespan fromdb但不同的问题 我有一个
  • 如何让我的 NextJS 应用程序接受 otf 和 ttf 字体?

    我正在使用 NextJS 当我构建我的应用程序时 我的控制台返回给我 ModuleParseError 模块解析失败 意外字符 1 0 您可能需要适当的加载程序来处理此文件类型 我想知道出了什么问题 因为我已经构建了自定义 webpack
  • jquery动画位置百分比

    如何确定百分比位置 document ready function button toggle function slide animate top 100 1000 function slide animate top 0 1000 请建
  • Magento 的空白主题是否仍应用作主题基线(Magento 版本 1.7)?

    我发现的许多关于 Magento 主题开发的教程都建议从使用空白作为制作您自己的自定义主题的指南开始 这些文章很多都已经很老了 截至当前版本 1 7 情况仍然如此吗 附 除了 Magento 之外 是否有任何好的 相关的主题开发文章官方设计
  • 如何在 WPF 拖放过程中更新拖动装饰器的位置?

    我正在使用装饰器来显示被拖动元素的 幽灵 var adornerLayer AdornerLayer GetAdornerLayer topLevelGrid dragAdorner new DragAdorner topLevelGrid
  • 如何调试“ImagePullBackOff”?

    突然间 我无法部署一些以前可以部署的映像 我得到以下 Pod 状态 root webdev2 origin oc get pods NAME READY STATUS RESTARTS AGE arix 3 yjq9w 0 1 ImageP
  • 如何覆盖 django admin 翻译?

    我正在尝试覆盖 Django 管理站点的默认翻译 我正在使用 Django 1 6 我的settings py包含 import os BASE DIR os path dirname os path dirname file LANGUA
  • 在 Dart 中向套接字数据写入/读取字节数

    在下面的服务器 客户端套接字代码中 服务器尝试发送从 0 到 1023 的整数 客户端收到正确数量的整数 但它们在 255 处换行 为什么会这样以及正确的方法是什么 服务器 import dart async import dart io
  • 如何从移动浏览器启动应用程序(facebook/twitter/等),但如果未安装应用程序则退回到超链接

    我希望可能有某种方法可以从浏览器中检测 uri scheme 是否在移动设备上注册 IE 我想检查 facebook twitter pinterest 应用程序是否已安装并且可以从其关联的 uri scheme 启动 if fb isIn