前言  

  自Weex发布伊始, 其口号 "Write Once, Run Everywhere"就吸引了大批前端与客户端程序猿纷纷入坑, 我也不能独善其中. 就我目前所学习Weex的经验在此记录一下, 由于我是一名刚入行不久iOS开发者, 所以这篇博客含金量不高, 下面就简单阐述下如何将Weex初步集成到iOS.

Weex简介

  2016年4月21日,北京 - 阿里巴巴今天在Qcon大会上宣布跨平台移动开发工具Weex开放内测邀请。Weex能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出Native级别的性能体验,并支持iOS、安卓、YunOS及Web等多端部署。   

  对于移动开发者来说,Weex主要解决了频繁发版和多端研发两大痛点,同时解决了前端语言性能差和显示效果受限的问题。开发者可通过Weex官网申请内测。开发者只需要在自己的APP中嵌入Weex的SDK,就可以通过撰写HTML/CSS/JavaScript来开发Native级别的Weex界面。Weex界面的生成码其实就是一段很小的JS,可以像发布网页一样轻松部署在服务端,然后在APP中请求执行。
 
  Weex官网:https://weex-project.io/cn/.
 
iOS 客户端集成Weex
 
集成步骤一: 搭建开发环境
  首先得有iOS开发环境: MacOS, 安装有Xcode.
  需要安装node.js(6.0+), 直接到node.js 官网下载即可, 更过安装方式 参考: node.js 官方信息.
    点击.dmg安装包安装完成后 在terminal输入: 
 
  
   通常,安装了 Node.js 环境,npm 包管理工具也随之安装了。npm 是一个 JavaScript 包管理工具,它可以让开发者轻松共享和重用代码。Weex 很多依赖来自社区,同样,Weex 也将很多工具发布到社区方便开发者使用。
 
集成步骤二:安装cocoaPods
  注: cocoaPods安装,如果您此前已安装,请跳过此步骤。
  安装cocoaPods前需要安装ruby环境, 请参考:http://www.cnblogs.com/foxting/p/4520829.html
  1. 移除现有的Ruby默认源
    gem sources --remove https://rubygems.org/ 
  2. 使用新源
   2 gem sources -a https://ruby.taobao.org/ 
  3. 验证新源替换是否成功
      3 gem sources -l 
  4. 安装cocoaPods
    4 sudo gem install cocoapods 
 
  安装完成后:
  
  
  由于我已经安装过了cocoaPods, 所以再次安装提示的内容非常少, 关于详细的安装cocoaPods 教程请参考:http://blog.csdn.net/aaron0619/article/details/51861127
 
  至此, cocoaPods已安装成功!
 
集成步骤三: 创建Podfile
  由于做个简单的iOS 集成 Weex的demo示范, 所以这里我们新建一个项目, 来添加Podfile.
 
  1. 创建新的项目, 并在terminal中进入该项目文件夹, 并创建Podfile:
  
  此时Podfile已经创建成功.
  
  2. 编辑Podfile, 输入 vim Podfile, 并打开的文件中按 "I"键进入编辑状态, 接着输入:
  
 
  实际操作时, 请将 下面target中的名字改成与项目名字一致.
 
  
 
  输入完成之后按Esc然后:wq 保存退出.
  注: 最好手动输入, 避免出错.
  

 source 'git@github.com:CocoaPods/Specs.git'
source 'https://github.com/cocoaPods/specs.git' target 'WeexDemo' do
platform:ios,'7.0'
pod 'WeexSDK'
pod 'SocketRocket'
pod 'SDWebImage'
pod 'WXDevtool',:configuration => ['Debug']
end

  最新的weexSDK 不用拷贝weexSDK 到项目目录中, WeexSDK 后面不指定版本即表示下载最新的版本.

  3. 在terminal中 项目根目录下执行 pod install 命令.

    

  Podfile 就自动添加好了依赖, 并生在项目目录中成一个WeexIntegrationDemo.xcworkspace, 打开它.

4. 导入系统库的库:

  

  5. 添加 -ObjC 如下图(注意大小写)

  

  至此 集成的前期工作已全部完成.
 
iOS native 环境初始化
  weex运行环境的初始化,主要包括以下几个方面:应用配置(应用名、版本号、UA等);注册自定义的Module和Component;注册SDK已有协议的实现类。所有初始化的步骤在AppDelegate中完成。
  1. 添加头文件

#import "AppDelegate.h"

#import "ViewController.h"

#import <WeexSDK/WXSDKEngine.h>

#import <WeexSDK/WXLog.h>

#import <WeexSDK/WXDebugTool.h>

#import <WeexSDK/WXAppConfiguration.h>

#import "WXImgLoaderDefaultImpl.h"

  几个头文件的介绍:

    WXSDKEngine:SDK开放的绝大多数接口都在此有声明。

    WXLog: 控制Log输出的级别,包括Verbose、Debug、Info、Warning、Error,开发者可以按需来设置输出级别。

    WXDebugTool: weex提供的对外调试工具。

    WXAppConfiguration: 使用weex开发的业务性配置。

- (void)initWeexSDK {

//业务配置,非必需

[WXAppConfiguration setAppGroup:@"AliApp"];

[WXAppConfiguration setAppName:@"WeexIntegrationDemo"];

[WXAppConfiguration setAppVersion:@"1.0.0"];

//初始化SDK环境

[WXSDKEngine initSDKEnvironment];

//注册自定义module和component,非必需

/*

[WXSDKEngine registerComponent:@"MyView" withClass:[MyViewComponent class]];

[WXSDKEngine registerModule:@"event" withClass:[WXEventModule class]];

*/

//注册协议的实现类,非必需

[WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)];

//设置Log输出等级:调试环境默认为Debug,正式发布会自动关闭。

[WXLog setLogLevel:WXLogLevelAll];

// 开启debug模式

// [WXDebugTool setDebug:YES];

}

  在appdelegate.m的didFinishLaunchingWithOptions回调中执行:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// Override point for customization after application launch.

[self initWeexSDK];

UINavigationController *nac = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

[self.window setRootViewController:nac];

[self.window makeKeyAndVisible];

return YES;

}

  上面导入头文件是可以看到有导入 "WXImgLoaderDefaultImpl.h" 这个头文件, 这是因为weex本身没有网络下载的能力, 所以需要我们自己写个协议去实现网络下载.

  自定义一个类叫: WXImgLoaderDefaultImpl, 要遵循二个协议:  WXImgLoaderProtocol, WXModuleProtocol


#import <Foundation/Foundation.h>

#import "WXImgLoaderProtocol.h"

@interface WXImgLoaderDefaultImpl : NSObject<WXImgLoaderProtocol, WXModuleProtocol>

@end

  实现:

#import "WXImgLoaderDefaultImpl.h"

#import <SDWebImage/UIImageView+WebCache.h>

@interface WXImgLoaderDefaultImpl()

@end

@implementation WXImgLoaderDefaultImpl

#pragma mark WXImgLoaderProtocol

- (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)userInfo completed:(void(^)(UIImage *image,  NSError *error, BOOL finished))completedBlock

{

if ([url hasPrefix:@"//"]) {

url = [@"http:" stringByAppendingString:url];

}

return (id<WXImageOperationProtocol>)[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:url] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {

} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {

if (completedBlock) {

completedBlock(image, error, finished);

}

}];

}

  这样, weex就具有网络下载图片的能力了.

  经过以上简单的配置,WeexSDK的环境初始化已完成,下面就进入Weex动态化页面渲染环节。

Weex动态化页面渲染

  weex支持全页面以及页面局部两种不同的渲染模式。在iOS中使用方法很简单,只需要将weex渲染所得的view添加到父容器中即可。下面会介绍如何在iOS最常用的容器viewController中渲染weex页面。

1.在要使用Weex渲染的viewController中包含头文件

  现在来介绍下WXSDKInstance究竟是什么,如何来使用它。

  WXSDKInstance,简单来说,就是weex渲染的实例对象。它提供给开发者诸多跟页面渲染相关的接口,包括renderWithURL、refreshInstance以及destroyInstance等,提供了几个比较重要的回调接口,方便开发者根据不同的业务场景去处理他们的逻辑,如onfailed,还提供了性能监控相关的接口。

  2. 页面渲染


#import "ViewController.h"

#import <WeexSDK/WXSDKInstance.h>

@interface ViewController ()

//WXSDKInstance 属性

@property(nonatomic, strong) WXSDKInstance *instance;

// weex 视图

@property(nonatomic, strong)UIView *weexView;

// URL属性(用于指定加载js的URL, 一般申明在接口中)

@property (nonatomic, strong) NSURL *url;


@end


@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.title = @"Hello Weex";

self.instance = [[WXSDKInstance alloc] init];

// 设置weexInstance所在的控制器

self.instance.viewController = self;

// 设置weexInstance的frame

self.instance.frame = self.view.frame;

// 设置weexInstance用于渲染JS的url路径

[self.instance renderWithURL:self.url options:@{@"bundleUrl":[self.url absoluteString]} data:nil];

// 为避免循环引用 声明一个弱指针 self

__weak typeof(self) weakSelf = self;

// 设置weexInstance创建完的回调

self.instance.onCreate = ^(UIView *view) {

[weakSelf.weexView removeFromSuperview];

weakSelf.weexView = view;

weakSelf.weexView.backgroundColor = [UIColor whiteColor];

[weakSelf.view addSubview:weakSelf.weexView];

};

// 设置weexInstance出错时的回调

self.instance.onFailed = ^( NSError *error) {

NSLog(@"处理失败%@", error);

};

// 设置weexInstance渲染完成时的回调

self.instance.renderFinish = ^(UIView *view) {

NSLog(@"渲染完成");

};

}

- (void)dealloc {

[_instance destroyInstance];

}

#pragma mark - 懒加载

- (NSURL *)url {

if (!_url) {

_url = [NSURL URLWithString:@"http://ygz001.oicp.net/app.weex.js"];

}

return _url;

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

  以上是通过weex实例来渲染页面的简单例子。其中有几点需要着重说明下:

  instance.viewController: 一般情况下,iOS的运行环境都是基于不同viewController的,很多底层操作需要知晓当前所处的viewController对象,因此需要向instance知会当前的viewController。

  instance.frame: 根据weex对instance的设计规范,需要渲染中知道最外层body的位置和尺寸。这个frame值的设置,跟最终在回调中获取的view.frame一致。

  当然,在很多场景下,仅需要在一个native页面的局部渲染weex区块。很简单,您只需要将instance.frame设置为目标区块的位置尺寸即可。

  renderWithURL:常用的渲染方式:其一,直接输入URL(可以是file://或 http(s)://);其二,sourceCode,即JavaScript源码。options参数,表示开发者可以通过WeexSDK向前端透传的参数,如bundleURL。data参数,表示向weex的模板注入的页面数据,它一般来源于native的数据请求,当然也可以在前端逻辑中完成请求后将数据注入。

  url参数: 是从weex 编译运行后出来的app.js或app.weex.js 文件, 可以放在远程服务器上, 也可以直接拖进项目工程里.

  _instance.onCreate:weex页面最外层body渲染完成后的回调。在此回调中,weex渲染所得的rootView已确定,可以输出并添加到父容器中。

  _instance.renderFinish:和onCreate不同,renderFinish表示所有weex的页面元素都已渲染完毕,整个渲染过程至此结束。

  其他跟instance紧密相关的接口,请参见WXSDKInstance.h的详细说明。

  

  3. 页面销毁

  切记在viewController的销毁的同时,将weex实例一并销毁,否则会出现内存泄露。

  

- (void)dealloc {

[_instance destroyInstance];

}

其他

在页面渲染这个部分,本文已向您详细介绍了成功接入WeexSDK后,如何通过加载URL的方式渲染得到视图。此外,您也可以通过github下载最新的playground代码并编译,它可以提供二维码扫描预览以及在线debug等功能。

点击下载 WeexSample

南心芭比: 热爱分享, 收获快乐~

iOS 集成Weex入门教程的更多相关文章

  1. (译)cocos2d-x跨android&ios平台开发入门教程

    免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作 ...

  2. iOS开发 ReactiveCocoa入门教程 第二部分

    ReactiveCocoa 是一个框架,它允许你在你的iOS程序中使用函数响应式(FRP)技术.加上第一部分的讲解,你将会学会如何使用信号量(对事件发出数据流)如何替代标准的动作和事件处理逻辑.你也会 ...

  3. TeeChart .NET for iOS图表开发入门教程

    去年,TeeChart 为iOS图表开发专门发布了TeeChart NET for iOS(包含在TeeChart Mobile中),相信很多人都对其感兴趣.慧都为大家制作了TeeChart NET ...

  4. iOS开发 ReactiveCocoa入门教程 第一部分

    作为一个iOS开发者,你写的每一行代码几乎都是在响应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation).但是这些事件都用不同的方式来处理 ...

  5. 六、雪花《苹果iOS实例编程入门教程》

    该app为应用的功能为制作一场雪景 现版本 SDK 8.4 Xcode 纲要:- UIImageView 的运用- onTimer 代码运用- onAnimation 代码运用 运行Xcode 选择 ...

  6. 五、点数器《苹果iOS实例编程入门教程》

    该app为应用的功能为一个简单的数数程序 现版本 SDK 8.4 Xcode 运行Xcode 选择 Create a new Xcode project ->Single View Applic ...

  7. 四、卫星定位《苹果iOS实例编程入门教程》

    该app为应用的功能为用iPhone 显示你现在的位置 现版本 SDK 8.4 Xcode 运行Xcode 选择 Create a new Xcode project ->Single View ...

  8. 三、图像移动《苹果iOS实例编程入门教程》

    该app为应用的功能为动态移动动画 现版本 SDK 8.4 Xcode 运行Xcode 选择 Create a new Xcode project ->Single View Applicati ...

  9. 二 、打开地图《苹果iOS实例编程入门教程》

    该app为应用的功能为给你的iPhone打开google地图有效地址连接 现版本 SDK 8.4 Xcode 运行Xcode 选择 Create a new Xcode project ->Si ...

随机推荐

  1. IE的缓存

    例:在IE中缓存是很难清掉的,用户也不会每次都给你点清理缓存,那是开发人员自己开发才会干的事,所以我们在对接数据的时候,最好采用异步刷新的方式,获取最新数据 方法如下: // 异步刷新,针对IE缓存的 ...

  2. TypeScript教程1

    Boolean类型aser:和as3一样 var isDone: boolean = false; 复制代码 Number类型aser:as3经常用int和uint,以后只用number就可以啦 va ...

  3. Linux 用键盘操作窗口

    以下是我从各处搜集来的关于用键盘操作窗口信息,操作可能不是最简或者最好的,当然也可能不是最全的,以后遇到新的操作,我会即使添加,如果你有我没有列出的操作,希望你能提出,我可以加上! 我实验的操作系统是 ...

  4. SQL CRUD 简单查询

    identity 自增长 primary key 主键 unique 唯一键 not null 非空 references 外键(引用) 1.删除表 drop table Student 2.修改表 ...

  5. 2017年试试Web组件化框架Omi

    Open and modern framework for building user interfaces. Omi的Github地址https://github.com/AlloyTeam/omi ...

  6. matlab中小技巧

    关于matlab中可能遇到的小知识点 一.字符串的比较 不能使用“==”,需要使用函数strcmp() %matlab中字符串的比较 %字符串比较要用strcmp.相同则返回1,不相同则返回0. cl ...

  7. Windows下composer的下载与配置

    composer是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件. 下面记录一 ...

  8. Mybatis实战之TypeHandler高级进阶

    上篇文章分享了在项目实战中自定义Mybatis的TypeHandler来处理枚举类型.文章结尾也指出了美中不足之处,那就是每次都需要指定我们自定义的枚举TypeHandler. 随着项目枚举类型的增多 ...

  9. AOP的简单练习

    ---恢复内容开始--- 1.AOP的主要作用及概念简介 AOP最大的用处在于事务处理上,业务层在项目中主要负责以下的操作: ·调用数据层进行处理: ·进行事务的处理: ·关闭数据库的连接操作: 但在 ...

  10. Oracle11G卸载教程

    用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,那么怎么才能完全卸载Oracle呢?那就是直接注册表清除,步骤如下: 1. 开始->设置->控制面板-& ...