• 解决React中打开App或者下载App问题


    摘要

       最近在写H5页面,项目中有个唤醒App的功能,由于没有接触过这类功能,就去学习了一波大佬们的经验。在此分享出来和大家一起学习学习。

    内容

     一、唤醒方式

      经过查找资料,找到了三类较为客观的唤醒方式:

    1.URL Schemes

    2.Chrome

    3.ios UniversalLink / android appLink

    二、常用的唤醒媒介

      除了需要确定的唤醒方式,还需要搭配唤醒媒介来一起作用,具体的常用的唤醒媒介如下:

    1.ifame

    2.a 标签(元素)

    3.widnow.location

    三、常规打开方式:URL Scheme

      唤醒打开一个App,最常规的方式就是通过URL Scheme。那scheme是什么呢,它就像是路标一样,它可以让操作者通过scheme这个路标来打开App,对于App的开发处理就不做过多的描述,感兴趣的朋友可以去百度、谷歌搜索。对于前端而言,抛出scheme路标的媒介有三个,其中个人认为比较友好的方式是通过iframe媒介来抛出,对于其他媒介抛出方式感兴趣的朋友可以去探寻一番,接下来直接用代码分享,清晰明了的去使用常规scheme唤醒App方式。

    四、代码

      1、首先我们需要一个iframe媒介。

      2、其次是我们需要一个URL Scheme唤醒方式。

      3、最后就是通过设备判断,并打开我们需要的App应用。

      为了方便引用这个唤醒APP的方式,我把它封装成了一个通用的downloadApp.js函数组件,重点代码如下:

    (1)创建iframe媒介:

    // 创建iframe
      const createIframe = (function() {
        let iframe;
        return function() {
          if (iframe) {
            return iframe;
          } else {
            iframe = document.createElement('iframe')
            iframe.style.display = 'none';
            document.body.appendChild(iframe);
            return iframe;
          }
        }
      })()

    (2)定义url Scheme唤醒方式:

    // 定义App的scheme 测试使用淘宝的scheme
    const
    baseScheme = "taobao://";
    const createScheme = function(options, isLink) { let urlScheme = baseScheme; for(let item in options) { urlScheme = urlScheme + item + '=' + encodeURIComponent(options[item]) + '&'; } urlScheme = urlScheme.substring(0, urlScheme.length - 1); return encodeURIComponent(urlScheme); }

    (3)定义唤醒App函数:(函数中的判断客户端设备类型的函数可以去百度,或者看我上一篇文章:Javascript判断客户端是Android还是IOS,判断浏览器类型

      const openApp = function() {
        let localUrl = createScheme();
        let openIframe = createIframe();
    
        if (isIos) {
          // 判断是否是ios
          window.location.href = localUrl;
          const loadDateTime = Date.now();
          setTimeout(function() {
            const timeOutDateTime = Date.now();
            if (timeOutDateTime - loadDateTime < 1000) {
              window.location.href = "下载URL";
            }
          }, 25);
        } else if (isAndroid) {
          // 判断是否是安卓
          if (isChrome) {
            // Chrome浏览器用iframe打不开
            window.location.href = localUrl;
          } else {
            // 抛出scheme
            openIframe.src = localUrl;
          }
          setTimeout(function() {
            window.location.href = "下载URL";
          }, 500);
        } else {
          // 给winphone用户准备
          openIframe.src = localUrl;
          setTimeout(function() {
            window.location.href = "下载URL";
          }, 500);
        }
      }

     总结

      这就实现了唤醒打开App的功能,当然的,唤醒打开需要你有App,如果你没有App,就需要跳过下载链接去下载App了。在代码中不但实现了唤醒打开功能,还加入了下载功能,这样应用起来就更全面,用户体验也更加友好。但是这样的常规方式还是不够完美,就比如ios9.0以上版本唤醒或者下载App时就不会直接的跳转,有时甚至还会有允许的弹窗。存在的问题还需要进一步的去优化,本次就先分享唤醒App应用那么多功能,如果感兴趣可以一起去研究如何更全面、更友好的去优化唤醒功能。这篇文章是在看了很多资料后,提取合并大佬们的经验来分享编写的,如有错误,请指教。最后附上参考的大佬文章地址:参考文章...

  • 相关阅读:
    dljd_(004_005)_jdbc编程步骤
    dljd_003_jdbc编程_概述
    dljd_002_通过接口降低代码的耦合度(2)
    dljd_001_通过接口降低代码的耦合度(1)
    dljd_(002-003)_什么是持久化
    dljd_001_由hibernate名称引出的相关知识
    001_学习26个英文字母
    06_dljd_mysql数据库常用操作
    05_dljd_mysql数据库表的介绍
    【数据结构】树状数组(简单名次树)
  • 原文地址:https://www.cnblogs.com/BlueBerryCode/p/12508942.html
Copyright © 2020-2023  润新知