You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Jasonette Android端SMS HREF链接的ERR_UNKOWN_URL_SCHEME错误?

解决Jasonette中SMS链接的ERR_UNKNOWN_URL_SCHEME错误

嘿,我刚好对Jasonette的这类问题有点经验,你碰到的ERR_UNKNOWN_URL_SCHEME错误其实是因为Jasonette的Web容器默认只认http/https这类标准URL协议,像sms://这种自定义协议它不会自动处理,但完全有简单的修复办法,功能肯定是可行的!

原因分析

Android的WebView组件(Jasonette底层用的就是它)默认只会尝试加载http/https开头的URL,对于sms://这类自定义协议,它不知道该怎么处理,就会抛出这个错误。我们需要通过Jasonette的事件机制,把这类请求转交给系统短信应用来处理。

方案一:无需修改HTML,直接在JSON中拦截URL

这个方法最省心,不用改动你的test.php页面,只需要在JSON配置里添加URL拦截逻辑:

{
  "$jason": {
    "head": {
      "title": "Web Container Agent"
    },
    "body": {
      "background": {
        "type": "html",
        "url": "www.mysite.com/test.php",
        "id": "app",
        "action": {
          "type": "$default"
        },
        "on": {
          "$url": {
            "trigger": [
              {
                "if": "{{$url.startsWith('sms://')}}",
                "type": "$intent",
                "options": {
                  "action": "android.intent.action.SENDTO",
                  "data": "{{$url}}"
                },
                "prevent": true // 阻止WebView尝试加载,避免错误
              }
            ]
          }
        }
      }
    }
  }
}

原理是:当WebView加载任何URL时,$url事件会被触发,我们通过if判断如果是sms://开头的链接,就调用Android系统的SENDTO intent,把链接交给系统短信应用处理,同时用prevent: true阻止WebView自己尝试加载这个URL,从根源上避免错误。

方案二:修改HTML,通过Jasonette桥接调用短信功能

如果你能修改test.php的内容,可以把原来的SMS链接改成调用Jasonette的JavaScript接口,这样更灵活:

  1. 把HTML里的链接替换成:
<button onclick="sendSMS('+15558675309')">Text</button>
  1. 在HTML中添加这段JavaScript:
function sendSMS(phoneNumber) {
  // 通过Jasonette的桥接接口发送事件
  Jasonette.send({
    "type": "open_sms",
    "phone": phoneNumber
  });
}
  1. 然后在JSON里添加对应的事件处理:
{
  "$jason": {
    "head": {
      "title": "Web Container Agent"
    },
    "body": {
      "background": {
        "type": "html",
        "url": "www.mysite.com/test.php",
        "id": "app",
        "action": {
          "type": "$default"
        },
        "on": {
          "open_sms": {
            "type": "$intent",
            "options": {
              "action": "android.intent.action.SENDTO",
              "data": "sms://{{phone}}"
            }
          }
        }
      }
    }
  }
}

这个方案的好处是你可以在JavaScript里做更多逻辑处理(比如动态生成手机号),然后再触发短信功能。

两种方案都能解决问题,你可以根据自己的情况选一个试试!

内容的提问来源于stack exchange,提问作者Ryan D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:01:08