解决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应用那么多功能,如果感兴趣可以一起去研究如何更全面、更友好的去优化唤醒功能。这篇文章是在看了很多资料后,提取合并大佬们的经验来分享编写的,如有错误,请指教。最后附上参考的大佬文章地址:参考文章...