hybird (混合开发 - 视频详解) - 王云飞 - 小四

2019-08-23  本文已影响0人  王云飞_小四_wyunfei

背景介绍

移动应用分类:

使用技术

术语

题目

知识点

概念

存在价值

webview

file协议

HTTP(s)和file协议的区别

hybird不能用http协议只能用file协议,太慢受不了,要快,要做到和NA一样的体验,
要极致的快要变态的快

使用场景

具体实现

hybird和h5的区别

优点

缺点

适用场景

hybird - 适合产品型
h5 - 适合运营型

webview组件介绍

webview组件是我们原生开发中最核心的组件,可以理解为一个轻量级的浏览器。
这个轻量级的浏览器就能捕获到网页中发送出来的所有请求,在捕获到的请求中,我们就可以进行过滤拦截,那么我就可以在JS中伪装一个请求,来让原生进行拦截从而截取到原生所需要的JS传递过来的数据信息

JS和客户端通信的基本形式

微信公众平台:JS-SDk(微信公众平台封装的,h5前端和客户端的一个桥)

Android

注入API方式

通过 WebView 提供的接口,向 JavaScript 的 Context(window)中注入对象或者方法,让 JavaScript 调用时,直接执行相应的 Native 代码逻辑,达到 JavaScript 调用 Native 的目的。

JavaScript调起Android的toast示例

// Android部分
class MJavascriptInterface {
    private Context context;

    public MJavascriptInterface(Context context) {
        this.context = context;
    }

    // andorid版本升级时必须加上@JavascriptInterface
    @JavascriptInterface
    public void showToast() { // 可以由前端调用 window.ToastFunc.showToast()
        Toast.makeText(MainActivity.this, "js调起了android的Toast功能", Toast.LENGTH_SHORT).show();
    }
}

// 添加JS调用Android(Java)的方法接口
wv.addJavascriptInterface(new MJavascriptInterface(getApplicationContext()), "ToastFunc");

--------------------------------

// JavaScript - 前端部分
window.ToastFunc.showToast()

Android调用JavaScript前端示例

 // JavaScript - 提供给Android使用的方法
function getData (str) {
    $('#msg').html(str)
}
// Android端
wv.loadUrl("javascript:getData('我是一个android传递过来的值')");

IOS

schema协议简介和使用

拦截 URL SCHEME

先解释一下 URL SCHEME:URL SCHEME是一种类似于url的链接,是为了方便app直接互相调用设计的,形式和普通的 url 近似,主要区别是 protocol(协议) 和 host(域名) 一般是自定义的,例如: qunarhy://hy/url?url=ymfe.tech,protocol 是 qunarhy,host 则是 hy。
拦截 URL SCHEME 的主要流程是:Web 端通过某种方式(例如 iframe.src)发送 URL Scheme 请求,之后 Native 拦截到请求并根据 URL SCHEME(包括所带的参数)进行相关操作。

拦截 URL SCHEME 的主要流程是:Web 端通过某种方式(例如 iframe.src)发送 URL Scheme 请求,之后 Native 拦截到请求并根据 URL SCHEME(包括所带的参数)进行相关操作。

在时间过程中,这种方式有一定的 缺陷:

使用 iframe.src 发送 URL SCHEME 会有 url 长度的隐患。

创建请求,需要一定的耗时,比注入 API 的方式调用同样的功能,耗时会较长。
但是之前为什么很多方案使用这种方式呢?因为它 支持 iOS6。而现在的大环境下,iOS6 占比很小,基本上可以忽略,所以并不推荐为了 iOS6 使用这种 并不优雅 的方式。
【注】:有些方案为了规避 url 长度隐患的缺陷,在 iOS 上采用了使用 Ajax 发送同域请求的方式,并将参数放到 head 或 body 里。这样,虽然规避了 url 长度的隐患,但是 WKWebView 并不支持这样的方式。
【注2】:为什么选择 iframe.src 不选择 locaiton.href ?因为如果通过 location.href 连续调用 Native,很容易丢失一些调用。

示例 - 原理 - JS调用native

// JS
<button onclick="btnAction()">JS调用Native</button>
function btnAction() {
    // 这里伪装一个请求,让native拦截
    window.location.href = 'test://hello world'
}
// IOS
if(拦截的路径有test://) {
    // 这是伪装的请求
    return 不发送
} else {
    // 不是伪装的请求
    return 正常发送
}

示例 - 原理 - native调用JS

// JS
// 在window上提供一个方法,为了能够让native调用起来,处理原生传递过来的数据
window.handleVal = function(val) {
    document.querySelector('#valInfo').innerText = val
}
// IOS
webVIew.stringByEvaluatingJavaScriptFormString:@"handleVal('hello,1810')"
// 在Android是使用loadUrl执行

IOS JS -> native实战

// JS
function takePicture() {
    window.location.href = 'wyunfei://tackPicture'
    document.getElementById('img').src = ''
}
function getRQCode() {
    window.location.href = 'wyunfei://getRQCode'
}
// IOS
通过webView组件提供的方法,取到地址,获取协议
判断是伪装的还是真实的
定义和截取协议后面的字符串一致的方法,最后做出对应的逻辑处理

,这样前端和客户端就能通过这个协议通讯了。

查看全部内容及视频详解,请点击 - 视频详解hybird开发

上一篇下一篇

猜你喜欢

热点阅读