技术咨询、项目合作、广告投放、简历咨询、技术文档下载 点击这里 联系博主

# JS如何唤醒App

通常我们有这样的需求,需要使用 js 的方式,打开 Android App 的指定某个页面,如果存在就打开,否则引导到下载页面。那么如何实现 js 唤醒 Android 页面呢?详情请见下面的方案:

# 一、什么是 URL Scheme

我们先看一下一个 Url 的构成:

[scheme:][//authority][path][?query][#fragment]

https://www.taobao.com/shop那么 scheme 就是 https , authority 就是 www.taobao.compath 就是 shop;

常见的 App Scheme 有:

APP 微信 支付宝 淘宝 微博 QQ 知乎 短信
URL Scheme weixin:// alipay:// taobao:// sinaweibo:// mqq:// zhihu:// sms://

我们常常使用的 scheme 格式为:

     行为(应用的某个功能)
            |
scheme://[path][?query]
   |               |
应用标识       功能需要的参数


那么我们如果通过 scheme 的方式打开 android app 呢?此时就需要使用到 Android 相关的知识了。

# 二、AndroidManifest.xml

在要打开的Activity中加入intent-filter

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data
        android:host="webawakeapp.com"
        android:pathPrefix="/test"
        android:scheme="wakeapp" />
</intent-filter>

对 intent-filter 中的 data 进行简单介绍:

<data
    android:host="string"
    android:mimeType="string"
    android:path="string"
    android:pathPattern="string"
    android:pathPrefix="string"
    android:port="string"
    android:scheme="string"/>

其构造出来的url为:

scheme://host:port/path or pathPrefix or pathPattern

如何获取传递的参数?

在上述的 Activity 中加入如下代码:

Intent intent = getIntent();
Uri uri = intent.getData();
if (uri != null) {
    //如果url经过encode需要在此处进行decode:   url = java.net.URLDecoder.decode(originUrl, "utf-8");
    String url = uri.getQueryParameter("url"); //此处的url是自定义的参数
    String name = uri.getQueryParameter("name");

}


# 三、在浏览器中唤醒 APP

唤醒 app 的方式常用的有:

  1. 使用 a 标签利用浏览器唤醒 app
  2. 新建一个隐藏的 iframe ,地址指向需要打开的 url
  3. 使用 window.location 或者 window.location.href 刷新当前页面
  4. 动态创建一个 script 脚本,在这个脚本中新建一个 a 标签并打开
// 打开url的方式
var urlOpen = {
  // 在ios支持不好
  iframe: function (url) {
    var iframe = document.createElement("iframe");
    iframe.style.display = "none";
    iframe.src = url;
    document.body.appendChild(iframe);
  },
  location: function (url) {
    window.location.href = url;
  },
  href: function (url) {
    var a = document.createElement("a");
    a.style.display = "none";
    a.href = url;
    document.body.appendChild(a);
    a.click();
  },
  script: function (url) {
    var script = document.createElement("script");
    script.setAttribute("type", "test/javascript");
    script.innerHTML =
      "(function(){" +
      'var a = document.createElement("a");' +
      'a.style.display = "none";' +
      'a.href = "' +
      url.replace(/"/g, '\\"') +
      '";' +
      "document.body.appendChild(a);" +
      "a.click();" +
      "})()";
    document.body.appendChild(script);
  },
  open: function (url) {
    window.open(url);
  },
};

xiu'se

【未经作者允许禁止转载】 Last Updated: 2/4/2024, 6:06:40 AM