如何解决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接口,这样更灵活:
- 把HTML里的链接替换成:
<button onclick="sendSMS('+15558675309')">Text</button>
- 在HTML中添加这段JavaScript:
function sendSMS(phoneNumber) { // 通过Jasonette的桥接接口发送事件 Jasonette.send({ "type": "open_sms", "phone": phoneNumber }); }
- 然后在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
相关产品推荐
相关产品推荐

