efte是个啥玩意儿

34
Efte是个啥玩意?

Upload: jason-song

Post on 16-Jul-2015

134 views

Category:

Software


7 download

TRANSCRIPT

Page 1: Efte是个啥玩意儿

Efte是个啥玩意⼉儿?

Page 2: Efte是个啥玩意儿

• Efte 是两栖动物,蝾螈的古称(词源), 发⾳音为 /eft/

• 我们⽤用蝾螈来⽐比喻点评的 Hybrid App Framework

Efte - Hybrid App Framework

Page 3: Efte是个啥玩意儿

每个平台开发代价⾼高昂 我们要write once, run everywhere!

为啥要开发Efte框架

Page 4: Efte是个啥玩意儿

移动端⼈人才短缺!

为啥要开发Efte框架

Page 5: Efte是个啥玩意儿

Native App审核周期太⻓长!

为啥要开发Efte框架

Page 6: Efte是个啥玩意儿

多团队在同⼀一个代码库上发布,噩梦!

为啥要开发Efte框架

Page 7: Efte是个啥玩意儿

PhoneGap

Efte

为啥不⽤用PhoneGap?

• 把native app的特性加到web app

• 把web app的特性加到native app

Page 8: Efte是个啥玩意儿

Efte在点评的使⽤用情况

主App团购和活动阿波罗App 点评管家

Page 9: Efte是个啥玩意儿

让我们来看看Efte的实际运⾏行效果

Native本地静态⽂文件

Page 10: Efte是个啥玩意儿

web前端框架

开发框架

开发⼯工具集

JS标准接⼝口

native端框架

App外壳(可选)

离线包管理

插件库(可选)

导航中⼼心

数据中⼼心Web容器

Efte的客户端部分

Page 11: Efte是个啥玩意儿

local repo

mock server

dev tools

package management

cortex registry

Git

包管理后台

CI

CDN provider

packages

diff&patch

zip

CDN

app

Efte的服务端部分

Page 12: Efte是个啥玩意儿

让我们重点关注创新的两块:

离线包管理解决⽅方案

多⻚页⾯面管理解决⽅方案

—如何让⻚页⾯面加载得更快

—如何让多个⻚页⾯面导航和通信

Page 13: Efte是个啥玩意儿

多⻚页⾯面管理解决⽅方案

如何让多个⻚页⾯面导航和通信

Page 14: Efte是个啥玩意儿

Native Web

JS注⼊入

拦截⾃自定义Url

JSBridge

Javascript和Native的通信

Page 15: Efte是个啥玩意儿

JSBridge - Javascript向Native通信

通信过程

使⽤用⾃自定义Url scheme作为通信途径• [scheme]://params

• Native代码通过拦截Url、解析参数来完成通信• Javascript新开⼀一个iframe,加载⼀一段⾃自定义url

Page 16: Efte是个啥玩意儿

举个栗⼦子:Javascript向Native发起定位请求

var callbackId = callbacksCount++;callbacks[callbackId] = callbackFunction;

var ifr = document.createElement('iframe');ifr.style.display = 'none';document.body.appendChild(ifr);

ifr.contentWindow.location.href =‘js://_?method=location&args={}&callbackId=' + callbackId;

setTimeout(function() { ifr.parentNode.removeChild(ifr);}, 0);

1. Javascript通过iframe发出消息

注意这⾥里的callbackId

Page 17: Efte是个啥玩意儿

- (BOOL)webView:(UIWebView *)web shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ if ([request.URL.absoluteString hasPrefix:[self jsScheme]]) { [self handleMessage:[request.URL queryParams]]; return NO; } if ([request.URL.absoluteString hasPrefix:[self urlScheme]]) { NSDictionary *query = request.URL.queryParams; NSString *unit = request.URL.host; NSString *path = request.URL.path; [self efteOpenUnit:unit path:path withQuery:query]; } return YES;}

举个栗⼦子:Javascript向Native发起定位请求

2. Native拦截Url,并分发请求(以iOS为例)

Page 18: Efte是个啥玩意儿

直接向⻚页⾯面注⼊入Javascript

JSBridge - Native向Javascript通信

iOS • stringByEvaluatingJavaScriptFromString

Android • loadUrl

Page 19: Efte是个啥玩意儿

举个栗⼦子:Native向Javascript返回定位信息

NSString *callbackId = @"1";

NSString *retString = @"{\"status\": 1, \"lng\": 121.427165, \"lat\": 31.222093, \"accuracy\": 5}”;

NSString *js = [NSString stringWithFormat:@"window.Efte && window.Efte.callback && window.Efte.callback(%@,%@);", callbackId, retString];

[self.webView performSelector:@selector(stringByEvaluatingJavaScriptFromString:) withObject:js afterDelay:0];

Native注⼊入Javascript(以iOS为例) 还记得前⾯面js传过来的callbackId吗

调⽤用系统⽅方法注⼊入Javascript

Page 20: Efte是个啥玩意儿

现在来看多个⻚页⾯面之间如何通信

Page 21: Efte是个啥玩意儿

使⽤用场景举例

Page 22: Efte是个啥玩意儿

⻚页⾯面1 ⻚页⾯面2

消息中⼼心

不同⻚页⾯面间的通信通过监听和发布⼲⼴广播来实现

JSBridgeBroadcast

JSBridgeBroadcast

Broadcast

监听⼲⼴广播 发布⼲⼴广播

Page 23: Efte是个啥玩意儿

⻚页⾯面1 注册⼲⼴广播监听 ⻚页⾯面2

发出⼲⼴广播

⻚页⾯面1 收到⼲⼴广播 更新数据 并返回

Page 24: Efte是个啥玩意儿

离线包管理解决⽅方案

如何让⻚页⾯面加载得更快

Page 25: Efte是个啥玩意儿

Web⻚页⾯面的 ⼀一般加载过程

是否有缓存?

打开url

下载Html⻚页⾯面

下载CSS

下载JS

下载图⽚片等 多媒体资源

渲染⻚页⾯面

是本地提前缓存

执⾏行JS

Page 26: Efte是个啥玩意儿

使⽤用包管理之后…打开url

渲染⻚页⾯面

加载本地资源

执⾏行JS

Page 27: Efte是个啥玩意儿

Efte的本地包结构 - 以apollo为例

unit-m-home unit-m-customer

unit-m-myunit-m-order

unit-m-contract …

初始安装app的时候就会把静态包部署在⼿手机上

程序会定期检查并更新本地静态包

每个静态包都独⽴立存在

Page 28: Efte是个啥玩意儿

为了安全:

https 多次md5校验 ⾮非对称加密

更新时机:

程序打开时 程序恢复时 切换登录时

包更新流程图

Page 29: Efte是个啥玩意儿

local repo

mock server

dev tools

package management

cortex registry

Git

包管理后台

CI

CDN provider

packages

diff&patch

zip

CDN

app

让我们再来回顾⼀一下Efte的服务端部分

更新请求

下载包

Page 30: Efte是个啥玩意儿

https://developer.apple.com/safari/

模拟器/真机+Safari直接调试• iOS需要在设置Safari栏⺫⽬目中打开调试开关 • Safari在[develop]菜单中会出现设备的选项

Web开发调试 - iOS

Page 31: Efte是个啥玩意儿

https://developer.chrome.com/devtools/docs/remote-debugging#configure-webview

模拟器/真机+Chrome直接调试

• Android版本要求4.4.2及其以上

Web开发调试 - Android

Page 32: Efte是个啥玩意儿

独⽴立开发,独⽴立上线

Efte的优势只需前端技能即可开发移动应⽤用程序

write once, run everywhere

静态包⽆无需审核,可以⾃自动更新、灰度发布

Page 33: Efte是个啥玩意儿

Efte的挑战android的⽣生命周期对页⾯面的影响

javascript和native的通信有⼤大⼩小限制(交互⽅方式所致)

android碎⽚片化导致web view的兼容性问题

Page 34: Efte是个啥玩意儿

Q&A