当前位置: 首页 > 知识库问答 >
问题:

前端 - 如何判断H5是否通过通用链接成功唤起了app?

夏建木
2024-04-12

如何判断H5是否通过通用链接成功唤起了app?
有什么检测方法吗?比如之前scheme的跳转,可以通过监听页面的hidden事件?

共有3个答案

浦出野
2024-04-12

你在唤起APP的时候执行以下代码,在urlschemes后面携带一个参数

<a href="test://enter?a=1">唤起app<a>

在app端获取参数

let args = plus.runtime.arguments;console.log(plus.runtime.arguments, typeof args, 'plus.runtime.arguments');if (typeof args == 'string' || typeof args == 'object') {args = args.split('entry?');console.log(args,'args');if (args.length == 2 && args[1]) {  args = args[1];  try {    //获取到参数,处理跳转逻辑  } catch (e) {    console.log('处理参数失败', e);  }}//值清空这里有坑的,可能是官方bugplus.runtime.arguments = null;plus.runtime.arguments = '';return false;}
卫甫
2024-04-12

一个比较常见的做法就是延迟(setTimeout)几秒后弹出一个启动失败的弹窗或者相应的逻辑。
然后添加一个 pagehide 和 visibilitychange 的事件监听,当 hide 后,取消掉这个 setTimeout。

因为如果跳转成功了,页面一般都会切出去,反之则不会。

大致的代码

function redirectToApp (path) {  function handleRedirectFailed () {    const timer = setTimeout(function () {      // 显示失败的弹窗或者逻辑    }, 3e3);    return function () {      clearTimeout(timer);    };  }  const timer = handleRedirectFailed();  window.addEventListener('pagehide', timer);  document.addEventListener('visibilitychange', () => {    if (document.visibilityState === 'hidden' || document.hidden) {      timer();    }  });  setTimeout(function () {    document.removeEventListener('visibilitychange', timer);    window.removeEventListener('pagehide', timer);  }, 3e3);  // 使用 schema 跳转  window.open(url, '_blank');}

有些手机在跳转前可能会询问用户,这个过程可能也会触发 pagehide、visibilitychange,要避免这种情况,可以把 addEvenetListener 延迟一下

当然,如果你要想 100% 严谨,那就每次启动的时候额外携带一个随机参数,让后接口轮询,App 启动成功后,就把这个参数提交到后端去,页面轮询这个参数的结果就好了。不过一般都没啥必要。。。前面的方法就够了

郎项禹
2024-04-12

要判断H5页面是否通过通用链接成功唤起了app,你可以采用以下几种方法:

  1. 使用URL Scheme
    如果app支持特定的URL Scheme,你可以在H5页面中的JavaScript代码中尝试打开一个该Scheme的URL。如果app已经安装并且正确处理了这个Scheme,它会被唤起。如果app没有安装,浏览器通常会显示一个错误页面或提示。

    function checkAppInstallation() {    var url = 'yourappscheme://path';    window.open(url, '_blank');    // 监听页面隐藏事件    window.addEventListener('visibilitychange', function() {        if (document.visibilityState === 'hidden') {            console.log('App was opened successfully!');            // 在这里执行当app被唤起时的逻辑        }    });}
  2. 使用Universal Links (iOS)
    对于iOS,你可以使用Universal Links。通过配置app的apple-app-site-association文件,你可以让iOS设备在点击符合app关联的链接时直接打开app。为了检测是否成功唤起了app,你可以使用aswebauthenticationsession或者监听continueuseractivity代理方法。

    // 使用aswebauthenticationsession (仅适用于iOS)if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.callbackHandler) {    window.webkit.messageHandlers.callbackHandler.postMessage(null);}

在app中,你需要处理来自web页面的消息。

  1. 使用Intents (Android)
    对于Android,你可以使用Android App Links或自定义Intents。Android App Links类似于iOS的Universal Links,而自定义Intents则需要用户安装app并在app中配置相应的Intent Filter。

    // 监听页面隐藏事件window.addEventListener('visibilitychange', function() {    if (document.visibilityState === 'hidden') {        // 对于Android,可以通过检查是否打开了自定义的URL来判断        console.log('App was opened successfully!');    }});

在app中,你需要处理来自web页面的Intent。

  1. 使用第三方库
    还有一些第三方库,如branch.iofirebase dynamic links,可以帮助你实现跨平台的深度链接,并提供API来检测链接是否被成功处理。

请注意,以上方法可能因浏览器和操作系统版本的不同而有所差异,因此建议查阅相关文档和测试以确保兼容性。同时,确保你的app正确配置了URL Scheme、Universal Links或App Links,以便能够响应来自web的链接。

 类似资料:
  • 本文向大家介绍Android 判断是否连接成功了指定wifi,包括了Android 判断是否连接成功了指定wifi的使用技巧和注意事项,需要的朋友参考一下 最近在做wifi的相关的东西,打印WifiInfo的时候 无意间发现一个参数,改参数可以查看是否连接成功了指定wifi,但是这是隐藏的,遂将其反射之。代码如下: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也

  • 我下载了封装在zip文件中的proGuard,并将其解压缩到我的硬盘上。我没有以任何方式安装它(因为我不知道如何安装)。然后,我将添加到我的project.properties文件中。然后我做了一个“导出Android应用程序”,完全期待eclipse抱怨它不知道我的proGuard安装在哪里,但没有抱怨。事实上,一个新的apk文件出现在我的keystore中,一组文件(dump.txt等)出现在

  • 在收到DocuSign信封已签名的通知后,我正试图确定该信封是否已湿签名(即下载、签名、上传/传真)。对于我的项目,我们需要在处理之前审查湿签合同。我在REST API中看不到确定这一点的方法。当我调用/v2/accounts/{accountId}/envelets/{envelopeId}/documents时,它会返回文档列表,并表示签名类型为“电子”,尽管我在测试时对其进行了湿签名。我正在

  • 本文向大家介绍如何判断单链表是否是循环链表?相关面试题,主要包含被问及如何判断单链表是否是循环链表?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 时间复杂度:O(n) 空间复杂度:O(1) 两个指针,一个每次走一步,一个每次走两步,如果有环,两者会相遇。相遇后,让一个指针从头结点再次出发,两个指针每次都走一步,直到相遇点即为环入口。 Java 代码示例:

  • 需求背景 A B C 三个页面 A => C ,通过 router.push 进入。 B => C ,通过 router.repace 进入。 需求: 在 C 页面需要判断是 replace 还是 push 来进行特殊的操作。 问题: vue-router 是否有这样的方式呢?

  • 问题内容: 我有一个页面可以通过Ajax加载其他页面(请考虑使用框架,除非没有框架)。 显然,这些页面都可以独立调用,因此我想检测是否通过Ajax调用了它们,如果不是,则重定向到主Ajax页面。 这些页面是php页面,因此我也可以访问它。 指数: 问题答案: 使用该对象进行请求时,现代浏览器会添加以下请求标头: 在PHP中,使用以下命令检查此标头的存在: