close
当前位置: 物联网在线 > 技术文库 > ios >

Weex 是如何在 iOS 客户端上跑起来的(2)

Weex在性能方面,为了尽可能的提升客户端的性能,DSL的Transformer全部都放在了服务器端实现,Weex会在服务器端将XML + CSS + JavaScript 代码全部都转换成JS Bundle。服务器将JS Bundle部署到Server上和CDN上。

Weex和React Native不同的是,Weex把JS Framework内置在SDK里面,用来解析从服务器上下载的JS Bundle,这样也减少了每个JS Bundle的体积,不再有React Native需要分包的问题。客户端请求完JS Bundle以后,传给JS Framework,JS Framework解析完成以后会输出Json格式的Virtual DOM,客户端Native只需要专心负责 Virtual DOM 的解析和布局、UI 渲染。然而这一套解析,布局,渲染的逻辑SDK基本实现了。

最后Weex支持三端一致,服务器上的一份JS Bundle,通过解析,实现iOS/Android/HTML5 三端的一致性。

三. Weex在iOS上是如何跑起来的

经过上一章的分析,我们知道了Weex的整体流程,由于笔者前端知识匮乏,所以从.we或者.vue文件到JS bundle前端这部分的源码分析本文暂时不涉及,等笔者熟悉前端以后,这块还会再补上来。

分析之前先说明一点,Weex的所有源码其实已经开源了,至于SDK的Demo里面还依赖了一个ATSDK.framework,这个是没有开源的。ATSDK.framework这个其实是Weex性能监控的插件。

Weex 是如何在 iOS 客户端上跑起来的

就是上图中的那个灰色的框框的插件。这个插件有些大厂有自己的APM,阿里暂时没有开源这块,但是对Weex所有功能是不影响的。

那么接下来就详细分析一下在iOS Native端,Weex是如何跑起来的。直接上源码分析。

(一). Weex SDK初始化

这是Native端想把Weex跑起来的第一步。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.backgroundColor = [UIColor whiteColor]; // 在这里进行初始化SDK [self initWeexSDK]; self.window.rootViewController = [[WXRootViewController alloc] initWithRootViewController:[self demoController]]; [self.window makeKeyAndVisible]; return YES; }

在application: didFinishLaunchingWithOptions:函数里面初始化SDK。这里会初始化很多东西。可能有人会问了,初始化写在这里,还初始化这么多东西,不会卡App的启动时间么?带着这个问题继续往下看吧。

#pragma mark weex - (void)initWeexSDK { [WXAppConfiguration setAppGroup:@"AliApp"]; [WXAppConfiguration setAppName:@"WeexDemo"]; [WXAppConfiguration setExternalUserAgent:@"ExternalUA"]; [WXSDKEngine initSDKEnvironment]; [WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)]; [WXSDKEngine registerHandler:[WXEventModule new] withProtocol:@protocol(WXEventModuleProtocol)]; [WXSDKEngine registerComponent:@"select" withClass:NSClassFromString(@"WXSelectComponent")]; [WXSDKEngine registerModule:@"event" withClass:[WXEventModule class]]; [WXSDKEngine registerModule:@"syncTest" withClass:[WXSyncTestModule class]]; #if !(TARGET_IPHONE_SIMULATOR) [self checkUpdate]; #endif #ifdef DEBUG [self atAddPlugin]; [WXDebugTool setDebug:YES]; [WXLog setLogLevel:WXLogLevelLog]; #ifndef UITEST [[ATManager shareInstance] show]; #endif #else [WXDebugTool setDebug:NO]; [WXLog setLogLevel:WXLogLevelError]; #endif }

上述就是要在application: didFinishLaunchingWithOptions:里面初始化的全部内容。我们一行一行的来解读。

WXAppConfiguration是一个用来记录App配置信息的单例对象。

@interface WXAppConfiguration : NSObject @property (nonatomic, strong) NSString * appGroup; @property (nonatomic, strong) NSString * appName; @property (nonatomic, strong) NSString * appVersion; @property (nonatomic, strong) NSString * externalUA; @property (nonatomic, strong) NSString * JSFrameworkVersion; @property (nonatomic, strong) NSArray * customizeProtocolClasses; /** * AppGroup的名字或者公司组织名,默认值为nil */ + (NSString *)appGroup; + (void)setAppGroup:(NSString *) appGroup; /** * app的名字, 默认值是main bundle里面的CFBundleDisplayName */ + (NSString *)appName; + (void)setAppName:(NSString *)appName; /** * app版本信息, 默认值是main bundle里面的CFBundleShortVersionString */ + (NSString *)appVersion; + (void)setAppVersion:(NSString *)appVersion; /** * app外面用户代理的名字, 所有Weex的请求头都会设置用户代理user agent字段,默认值为nil */ + (NSString *)externalUserAgent; + (void)setExternalUserAgent:(NSString *)userAgent; /** * JSFrameworkVersion的版本 */ + (NSString *)JSFrameworkVersion; + (void)setJSFrameworkVersion:(NSString *)JSFrameworkVersion; /* * 自定义customizeProtocolClasses */ + (NSArray*)customizeProtocolClasses; + (void)setCustomizeProtocolClasses:(NSArray*)customizeProtocolClasses; @end

注意WXAppConfiguration的所有方法都是加号的类方法,内部实现是用WXAppConfiguration的单例实现的,这里用类方法是为了我们方便调用。

接下来是初始化SDK的实质代码了。

[WXSDKEngine initSDKEnvironment];
(责任编辑:ioter)

用户喜欢...

设计实例 #8:如何在整个热电偶测量范围内检测热电偶并准确检测温度

热电偶参考设计演示了如何在整个热电偶测量范围内检测热电偶并准确检测温度。 该解决方案使用MCP3421 18位模数转换器(ADC)测量热电偶两端的电压。ADC具有内部2.048V基准电压和可编程增益放...


如何在零信任世界中保护医疗保健物联网设备

ISTOCK 目前全球安装了超过1亿台医疗保健物联网设备,到2020年增长到1.61亿,根据Statista的数据,在短短三年内实现了17.2%的复合年增长率(CAGR)。 据埃森哲2017年健康互联网称,医疗保健管理...


如何在便携式设计的电池容量读数中实现更高的准确性

我的狗摩卡(图1)经常喜欢在徒步旅行期间跑到我前面进行一些越野探索。她总是在以后找到我,但有时我开始寻找她很久,所以我想找到一种方法来轻松追踪她的位置。通过Adafruit的展望网站...


数字双胞胎如何在物联网支持的环境中推动创新

动态数字表示或数字双胞胎正在迅速改变行业设计,构建和操作其产品和流程的方式。Gartner预测,到2021年,一半的大型工业公司将使用数字双子机,从而使这些机构的有效性得到10%的提高。...


电动汽车绝缘电阻如何在线检测?

电动汽车是一个复杂的机电一体化产品,其中的许多部件包括动力电池、电机、充电机、能量回收装置、辅助电池充...


对话赛灵思:33年老牌芯片厂如何在AI浪潮里新兴业务年增46%

随着移动互联网红利日渐式微,一个更具备颠覆性、更具备革命性的王朝正悄然来临——人工智能(AI)。在下一个十年里,云计算、机器学习、AI芯片等相关产业将以迅猛的势头持续占领市...


客户投诉器件功耗太大,“元凶”原来是它!

selina 在 周五, 11/24/2017 - 09:48 提交 为什么我的处理器功耗大于数据手册给出的值? 在之前的文章中,我们谈到了一个功耗过小的器件——是的,的确有这种情况——带来麻烦的事情。但这种...


SaaS:从功能、数据到生态以及客户成功的一场变革

不知不觉“终结软件”的呐喊已经走过了近二十年,SaaS已经走进千家万户,人们不再纠结是否要“终结软件”,也没...


华为客户荣获2017全球智慧城市博览会两项大奖两项提名奖

在2017年全球智慧城市博览会上,华为在智慧城市领域的四位客户以他们在提供高质量市民服务、实现可持续发展方面...


迈来芯宣布上线中文官方网站以加速融入中国市场,更好的服务中国客户

全球微电子技术公司——迈来芯(Melexis)宣布,定于2017年11月正式上线中文官方网站。迈来芯电子科技(上海)有限...