阿里 Weex,一个UI跨平台的框架,使用vue编写,编译为.js文件,供移动端进行调用 iOS 端使用 pod ‘WeexSDK’ 引入sdk
一.weex使用,直接上代码吧
1.appdelete中执行的代码,其中WXEventModule是交互相关,WXImgLoaderDefaultImpl是加载图片用到的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //weex [WXAppConfiguration setAppGroup:@"wang"]; [WXAppConfiguration setAppName:@"xixi"]; [WXAppConfiguration setAppVersion:@"1.0"]; //init sdk environment [WXSDKEngine initSDKEnvironment]; //register custom module and component,optional [WXSDKEngine registerModule:@"globalEvent" withClass:NSClassFromString(@"WXEventModule")]; [WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)]; //set the log level [WXLog setLogLevel: WXLogLevelAll]; [YaoTiaoLocationModel shareInstance]; }2.先看WXEventModule,它的主要作用是把js文件中的点击方法传入oc中,执行原生的代码。下面看具体的类文件 先看.h文件,没什么东西
#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface WXEventModule : NSObject @end NS_ASSUME_NONNULL_END再看.m文件,WX_EXPORT_METHOD是使用方法名注册,然后再实现方法体
#import "WXEventModule.h" #import <WeexSDK/WeexSDK.h> @interface WXEventModule ()<WXModuleProtocol> @end @implementation WXEventModule @synthesize weexInstance; WX_EXPORT_METHOD(@selector(tosearch:))//搜索框 - (void)push:(NSString *)url { //在这执行想要的代码 }3.WXImgLoaderDefaultImpl这个类是利用sdwebimage框架加载图片展示.h文件
#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface WXImgLoaderDefaultImpl : NSObject<WXImgLoaderProtocol, WXModuleProtocol> @end NS_ASSUME_NONNULL_END .m文件实现,需要导入sdwebimage相关头文件,我是在pch文件里引入的 #import "WXImgLoaderDefaultImpl.h" @implementation WXImgLoaderDefaultImpl - (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)userInfo completed:(void(^)(UIImage *image, NSError *error, BOOL finished))completedBlock { if (![self isValidString:url]) { return nil; } //实现加载xcassets 本地资源文件 if ([url hasPrefix:@"assets:"]) { UIImage *image = [UIImage imageNamed:[url substringFromIndex:7]]; completedBlock(image, nil, YES); return (id<WXImageOperationProtocol>)[NSObject new]; } if ([url hasPrefix:@"//"]) { url = [@"http:" stringByAppendingString:url]; } return (id<WXImageOperationProtocol>)[[SDWebImageManager sharedManager] loadImageWithURL:[NSURL URLWithString:url] options:SDWebImageRefreshCached progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) { } completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) { if (completedBlock) { if (!image) { //当图片记载失败的时候,回调本地的占位图展示,同时,回调的error要置空,这是项目要求的,也可以选择不加载,尤其是imageVew尺寸不一的情况下 completedBlock([UIImage imageNamed:@"goodTakePlace"],nil, finished); } else { completedBlock(image, error, finished); } } }]; } - (BOOL)isValidString:(NSString *)str { if (str && [str isKindOfClass:[NSString class]] && [str length] > 0) { return YES; } return NO; }4.看页面如何加载weex
#import "HomeViewController.h" #import <WeexSDK/WXSDKInstance.h> @interface HomeViewController ()<BMKMapViewDelegate,BMKLocationServiceDelegate,BMKDistrictSearchDelegate,BMKGeoCodeSearchDelegate> @property (nonatomic, strong) WXSDKInstance *instance; @property (nonatomic, strong) UIView *weexView; @property (nonatomic, strong) NSURL *sourceURL; @property (nonatomic,strong) NoDataAndErrorView * noDataView; @end @implementation HomeViewController - (void)dealloc { [_instance destroyInstance]; [self _removeObservers]; } - (instancetype)initWithSourceURL:(NSURL *)sourceURL { if ((self = [super init])) { self.sourceURL = sourceURL; [self _addObservers]; } return self; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController.navigationBar setHidden:YES]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController.navigationBar setHidden:NO]; } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; if ([self.navigationController isKindOfClass:[WXRootViewController class]]) { CGRect frame = self.view.frame; frame.origin.y = 0; frame.size.height = [UIScreen mainScreen].bounds.size.height; self.view.frame = frame; } } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; self.automaticallyAdjustsScrollViewInsets = NO; [self _renderWithURL:_sourceURL]; if ([self.navigationController isKindOfClass:[WXRootViewController class]]) { [self.navigationController setNavigationBarHidden:YES animated:YES]; } self.title = @"首页"; self.view.backgroundColor = [UIColor whiteColor]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self _updateInstanceState:WeexInstanceAppear]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; [self _updateInstanceState:WeexInstanceDisappear]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; [self _updateInstanceState:WeexInstanceMemoryWarning]; } - (void)refreshWeex { [self _renderWithURL:_sourceURL]; } - (void)addEdgePop { self.navigationController.interactivePopGestureRecognizer.delegate = self; } - (void)_renderWithURL:(NSURL *)sourceURL { if (!sourceURL) { return; } [_instance destroyInstance]; if ([WXPrerenderManager isTaskReady:[self.sourceURL absoluteString]]) { _instance = [WXPrerenderManager instanceFromUrl:self.sourceURL.absoluteString]; } _instance = [[WXSDKInstance alloc] init]; [_instance setFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight - [UIApplication sharedApplication].statusBarFrame.size.height - self.navigationController.navigationBar.frame.size.height - self.tabBarController.tabBar.frame.size.height)]; _instance.pageObject = self; _instance.pageName = sourceURL.absoluteString; _instance.viewController = self; NSString *newURL = nil; if ([sourceURL.absoluteString rangeOfString:@"?"].location != NSNotFound) { newURL = [NSString stringWithFormat:@"%@&random=%d", sourceURL.absoluteString, arc4random()]; } else { newURL = [NSString stringWithFormat:@"%@?random=%d", sourceURL.absoluteString, arc4random()]; } [_instance renderWithURL:[NSURL URLWithString:newURL] options:@{@"bundleUrl":sourceURL.absoluteString} data:nil]; __weak typeof(self) weakSelf = self; _instance.onCreate = ^(UIView *view) { [weakSelf.weexView removeFromSuperview]; weakSelf.weexView = view; [weakSelf.weexView setFrame:CGRectMake(0, [UIApplication sharedApplication].statusBarFrame.size.height, kScreenWidth, kScreenHeight - [UIApplication sharedApplication].statusBarFrame.size.height - self.navigationController.navigationBar.frame.size.height - self.tabBarController.tabBar.frame.size.height)]; [weakSelf.view addSubview:weakSelf.weexView]; }; _instance.onFailed = ^(NSError *error) { JMLog(@"%@",error); if (weakSelf.noDataView) { [weakSelf.noDataView removeFromSuperview]; weakSelf.noDataView = nil; } //网络错误 weakSelf.noDataView = [[NoDataAndErrorView alloc] initWithFrame:weakSelf.view.bounds Types:OtherErrorTypes message:@"" andBackGroundColor:[UIColor whiteColor] isShowAgainButton:YES]; [weakSelf.view addSubview:weakSelf.noDataView]; [[weakSelf.noDataView rac_signalForSelector:@selector(buttonActionWithSender:)] subscribeNext:^(RACTuple * _Nullable x) { [weakSelf refreshWeex]; }]; }; _instance.renderFinish = ^(UIView *view) { [weakSelf _updateInstanceState:WeexInstanceAppear]; if (weakSelf.noDataView) { [weakSelf.noDataView removeFromSuperview]; weakSelf.noDataView = nil; } }; if ([WXPrerenderManager isTaskReady:[self.sourceURL absoluteString]]) { WX_MONITOR_INSTANCE_PERF_START(WXPTJSDownload, _instance); WX_MONITOR_INSTANCE_PERF_END(WXPTJSDownload, _instance); WX_MONITOR_INSTANCE_PERF_START(WXPTFirstScreenRender, _instance); WX_MONITOR_INSTANCE_PERF_START(WXPTAllRender, _instance); [WXPrerenderManager renderFromCache:[self.sourceURL absoluteString]]; return; } } - (void)_updateInstanceState:(WXState)state { if (_instance && _instance.state != state) { _instance.state = state; if (state == WeexInstanceAppear) { [[WXSDKManager bridgeMgr] fireEvent:_instance.instanceId ref:WX_SDK_ROOT_REF type:@"viewappear" params:nil domChanges:nil]; } else if (state == WeexInstanceDisappear) { [[WXSDKManager bridgeMgr] fireEvent:_instance.instanceId ref:WX_SDK_ROOT_REF type:@"viewdisappear" params:nil domChanges:nil]; } } } - (void)_appStateDidChange:(NSNotification *)notify { if ([notify.name isEqualToString:@"UIApplicationDidBecomeActiveNotification"]) { [self _updateInstanceState:WeexInstanceForeground]; } else if([notify.name isEqualToString:@"UIApplicationDidEnterBackgroundNotification"]) { [self _updateInstanceState:WeexInstanceBackground]; ; } } - (void)_addObservers { for (NSString *name in @[UIApplicationDidBecomeActiveNotification, UIApplicationDidEnterBackgroundNotification]) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_appStateDidChange:) name:name object:nil]; } } - (void)_removeObservers { [[NSNotificationCenter defaultCenter] removeObserver:self]; }