IOS中Hybird中数据驱动与脚本驱动的实现
现在Hybird这块,网上也有很多文章,最近研究了下,分享给大家。
什么是Hybird技术?
1、一般是指WebView和Native技术混合而成的一套技术方案
2、也可以理解成,非Native技术与Native技术的混合开发
现在的Hybird有几种实现方式:
1、UIWebView、WKWebView 直接使用的是网页与OC交互(cordova与phonegap是使用该方案)(本文没有对该方案进行讲解)
2、数据驱动、脚本驱动(RN、微信小程序用的好像都是这种原理)
现在对于使用了webView实现的hybird技术大家都知道它的优势与劣势
优势是 可以热更新,直接WEB前端人员也能开发,擅长复杂的内容排版
劣势是 体验没有原生应用流畅
本文重点是说 数据驱动、脚本驱动,好处是能热更新,体验也更好,因为它都是生成原生应用,和WebView完全不一样
什么是数据驱动?
数据驱动说的是 我们App通过下载服务器端的json文件(里面定义了我们的UI布局样式,简单的业务功能)然后本地解析动态创建相应的UI。
什么是脚本驱动?
脚本驱动说的是 通过OC中的JavaScriptCore实现JS与OC的交互,一些简单的功能能放到JS中处理。
效果演示
默认打开效果:
点击测试1按钮的效果:
点击测试2按钮的效果:
以上的这些UI布局及功能都是动态写在 json与js 文件里面的
具体代码演示
因为我们为了方便演示,我这里没有搭建WEB服务器,所以json文件就直接放在APP里面,我们先创建 page.json 和 page.js 文件
分别如下:
可以看得出来,我们这个json文件里面的数据定义了一些UI的相关属性,注意button里面的那个onClicked,对应的是下面page.js里面的js方法
这里面的 updateLabelText 方法是我们App里面定义好的,下面我们来看App里
//
// ViewController.m
// hybirdDemo
//
// Created by xgao on 17/3/3.
// Copyright © 2017年 xgao. All rights reserved.
// #import "ViewController.h"
//@import JavaScriptCore;
#import <JavaScriptCore/JavaScriptCore.h> // 数据驱动、脚本驱动
@interface ViewController () // 用于执行JS的上下文
@property (nonatomic,strong) JSContext* jsContext;
// 保存按钮的点击事件的方法名
@property (nonatomic,retain) NSMutableDictionary* functionDic; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; [self initDataUI];
[self initJSContext];
} - (NSMutableDictionary*)functionDic{
if (!_functionDic) {
_functionDic = [NSMutableDictionary dictionary];
}
return _functionDic;
} - (void)initDataUI{ // 加载JSON数据
NSString* pageJsonPath = [[NSBundle mainBundle] pathForResource:@"page" ofType:@"json"];
NSData* pageJsonData = [NSData dataWithContentsOfFile:pageJsonPath];
NSDictionary* pageJsonDic = [NSJSONSerialization JSONObjectWithData:pageJsonData options:NSJSONReadingAllowFragments error:nil]; NSArray<NSDictionary*>* views = pageJsonDic[@"views"];
for (NSDictionary* view in views) {
// 解析UI
if ([view[@"class"] isEqualToString:@"label"]) { // UILabel UILabel* label = [[UILabel alloc]initWithFrame:[self CGRectWithDic:view]];
label.text = view[@"text"];
label.tag = [view[@"tag"] intValue];
[self.view addSubview:label];
}else if([view[@"class"] isEqualToString:@"button"]){ // UIButton UIButton* button = [[UIButton alloc]initWithFrame:[self CGRectWithDic:view]];
[button setTitle:view[@"title"] forState:UIControlStateNormal];
button.tag = [view[@"tag"] intValue];
[button setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
// 添加到事件字典中,btnClick
[self.functionDic setObject:button forKey:view[@"onClicked"]];
[self.view addSubview:button];
}
}
} // 初始化JSContext
- (void)initJSContext{ self.jsContext = [[JSContext alloc]init]; // 加载 page.js 脚本文件
NSString* pageJsPath = [[NSBundle mainBundle] pathForResource:@"page" ofType:@"js"];
NSString* pageJs = [NSString stringWithContentsOfFile:pageJsPath encoding:NSUTF8StringEncoding error:nil];
// 执行JS脚本,将JS代码注入到 上下文中
[self.jsContext evaluateScript:pageJs]; // 定义updateLabelText方法,用于JS调用OC
__weak ViewController* weakSelf = self;
self.jsContext[@"updateLabelText"] = ^(NSString* text,NSInteger tag){
UILabel* label = [weakSelf.view viewWithTag:tag];
label.text = text;
};
} // button按钮点击通用事件
- (void)buttonClick:(UIButton*)button{ for (NSString* func in self.functionDic.allKeys) {
UIButton* btn = self.functionDic[func];
if ([btn isEqual:button]) {
// OC 调用 JS 方法,这里就是 OC调用JS定义的那两个 btnClick 和 btnClick2
[self.jsContext[func] callWithArguments:nil];
break;
}
} } #pragma mark - Private - (CGRect)CGRectWithDic:(NSDictionary*)dic{ CGFloat x = [dic[@"x"] floatValue];
CGFloat y = [dic[@"y"] floatValue];
CGFloat width = [dic[@"width"] floatValue];
CGFloat height = [dic[@"height"] floatValue];
return CGRectMake(x, y, width, height);
} @end
IOS中Hybird中数据驱动与脚本驱动的实现的更多相关文章
- IOS中Hybird实现
现在Hybird这块,网上也有很多文章,最近研究了下,分享给大家. 什么是Hybird技术? 1.一般是指WebView和Native技术混合而成的一套技术方案 2.也可以理解成,非Native技术与 ...
- unity导出工程导入到iOS原生工程中详细步骤
一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...
- iOS原生项目中集成React Native
1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...
- iOS 开发者旅途中的指南针 - LLDB 调试技术
文章转载于:iOS 开发者旅途中的指南针 - LLDB 调试技术 今天给大家介绍的内容,无关乎任何功能性开发技术,但又对开发的效率影响至深,这就是调试技术. 何为调试呢,比如我们用 print 函数在 ...
- 在iOS应用程序中使用Frida绕过越狱检测
阿里聚安全在之前的三篇博客中介绍了利用Frida攻击Android应用程序,整个过程仿佛让开发者开启上帝视角,在本篇博客中,我们将会介绍在iOS应用程序中使用Frida绕过越狱检测.即使 ...
- iOS应用发布中的一些细节
iOS应用发布中的一些细节 前言 这几天最大的新闻我想就是巴黎恐怖袭击了,诶,博主每年跨年都那么虔诚地许下“希望世界和平”的愿望,想不到每年都无法实现,维护世界和平这么难,博主真是有心无力啊,其实芸芸 ...
- Firebug中调试中的js脚本中中文内容显示为乱码
Firebug中调试中的js脚本中中文内容显示为乱码 设置 页面 UFT-8 编码没用, 解决方法:点击 "Firebug"工具栏 中的"选项"---" ...
- iOS 解决LaunchScreen中图片加载黑屏问题
iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...
- iOS开发 Xcode8中遇到的问题及改动
iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...
随机推荐
- UVa 524 - Prime Ring Problem
题目大意:输入正整数n,把整数1,2...,n组成一个环,使得相邻两个整数之和均为素数.输出时从整数1开始逆时针(题目中说的不是很明白??)排列.同一个环应恰好输出一次. 枚举,并在枚举每一个数是进行 ...
- R语言中的if-else语句写法
结构 1 : if() xx else yy 一行: 结构 2: if() {xx} else {yy} 或者 if(){ xx }else #此处不能两行写 ...
- 前端开发 Grunt 之 Connect详解
在前端开发过程中,我们需要在开发过程中,将开发中的站点部署到服务器上,然后,在浏览器中查看实际的效果,在 Grunt 环境下,可以直接使用集成在 Grunt 中的 Connect 插件完成站点服务器的 ...
- 阿里CEO张勇公开信:把眼光从股市回到客户身上
8月25日消息,面对全球资本市场的剧烈波动,阿里巴巴集团CEO张勇今日发表致员工信,倡议全体阿里员工把眼光从股市回到客户身上,脚踏实地的服务帮助客户,为客户创造价值,继而为股东和自己创造价值. 张 ...
- mysql授权远程用户连接(权限最小化原则)
1.进入MySQL,创建一个新用户root,密码为root: 格式:grant 权限 on 数据库名.表名 to 用户@登录主机 identified by "用户密码"; gra ...
- Android组件生命周期(一)
引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...
- GCD教程(二):多核心的性能
接上一篇,原帖地址:http://www.dreamingwish.com/dream-2012/of-of-of-performance-of-of-of-of-of-of-of-gcd-intro ...
- RMAN中FILESPERSET设置对备份速度的影响
看到网上部分人说不指定FILESPERSET(默认值=64)则会导致分配的通道只走第一个而导致备份效率低下,今天仔细研究了一下,参照了多个博主文章,得出结论如下: 如果没有指定filesperset, ...
- 在Flex中定义移动设备应用程序和启动屏幕
创建移动设备应用程序容器 移动设备应用程序中的第一个标签通常是以下标签之一: <s:ViewNavigatorApplication> 标签用于定义只有一个部分的移动设备应用程序. < ...
- React Router基础使用
React是个技术栈,单单使用React很难构建复杂的Web应用程序,很多情况下我们需要引入其他相关的技术 React Router是React的路由库,保持相关页面部件与URL间的同步 下面就来简单 ...