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

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

由于JS的方法的写法,多个参数是依次写在小括号里面的,和OC多个参数中间用:号隔开是不一样的,所有在暴露给JS的时候,需要把Block再包装一层。包装的4个方法如上,最后把这4个方法注入到JSContext中。

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

如上图,灰色的就是OC本地传入的Block,外面在包一层,变成JS的方法,注入到JSContext中。

4. 模拟器WXSimulatorShortcutManager连接本地调试工具

#if TARGET_OS_SIMULATOR static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [WXSimulatorShortcutManager registerSimulatorShortcutWithKey:@"i" modifierFlags:UIKeyModifierCommand | UIKeyModifierAlternate action:^{ NSURL *URL = [NSURL URLWithString:@"http://localhost:8687/launchDebugger"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) { // ... }]; [task resume]; WXLogInfo(@"Launching browser..."); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 连接websocket调试器 [self connectDebugServer:@"ws://localhost:8687/debugger/0/renderer"]; }); }]; }); #endif

由于平时开发可能用到模拟器,那么调试的时候就会连接到本地的浏览器(Chrome,Safari)进行调试界面。这里就是在开启模拟的时候,启动浏览器,并且连接websocket调试器。

WXSDKEngine初始化的全部流程可以大概描述如下图:

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

(二). Weex 是如何让JS调起OC原生UIView的?

上一章节我们分析了WXSDKEngine是如何初始化的,那么初始化完成之后,iOS Native客户端是如何接收到JS的页面并调用OC生成UIView的呢?这一章节我们来分析分析。

在分析这个问题之前,先来看看AppStore上面Weex官方为我们提供的实例程序WeexPlayground的扫码功能是怎么实现扫描二维码就可以进入到一个页面的。

1.扫二维码的原理

首先看一下扫码界面的一些属性:

@interface WXScannerVC : UIViewController <AVCaptureMetadataOutputObjectsDelegate> @property (nonatomic, strong) AVCaptureSession * session; @property (nonatomic, strong) AVCaptureVideoPreviewLayer *captureLayer; @end

这个页面没有额外的配置,就是一些调用摄像头的代理。

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { [_captureLayer removeFromSuperlayer]; [_session stopRunning]; AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); if (metadataObjects.count > 0) { AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex : 0 ]; [self openURL:metadataObject.stringValue]; } }

当扫描到二维码以后,代理会调用上面这个函数,扫描出来的URL就是metadataObject.stringValue。

- (void)openURL:(NSString*)URL { NSString *transformURL = URL; NSArray* elts = [URL componentsSeparatedByString:@"?"]; if (elts.count >= 2) { NSArray *urls = [elts.lastObject componentsSeparatedByString:@"="]; for (NSString *param in urls) { if ([param isEqualToString:@"_wx_tpl"]) { transformURL = [[urls lastObject] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; break; } } } NSURL *url = [NSURL URLWithString:transformURL]; if ([self remoteDebug:url]) { return; } [self jsReplace:url]; WXDemoViewController * controller = [[WXDemoViewController alloc] init]; controller.url = url; controller.source = @"scan"; NSMutableDictionary *queryDict = [NSMutableDictionary new]; if (WX_SYS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; NSArray *queryItems = [components queryItems]; for (NSURLQueryItem *item in queryItems) [queryDict setObject:item.value forKey:item.name]; }else { queryDict = [self queryWithURL:url]; } NSString *wsport = queryDict[@"wsport"] ?: @"8082"; NSURL *socketURL = [NSURL URLWithString:[NSString stringWithFormat:@"ws://%@:%@", url.host, wsport]]; controller.hotReloadSocket = [[SRWebSocket alloc] initWithURL:socketURL protocols:@[@"echo-protocol"]]; controller.hotReloadSocket.delegate = controller; [controller.hotReloadSocket open]; [[self navigationController] pushViewController:controller animated:YES]; }
(责任编辑: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月正式上线中文官方网站。迈来芯电子科技(上海)有限...