现在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实现的更多相关文章

  1. IOS中Hybird中数据驱动与脚本驱动的实现

    现在Hybird这块,网上也有很多文章,最近小有研究了下,分享给大家. 什么是Hybird技术? 1.一般是指WebView和Native技术混合而成的一套技术方案 2.也可以理解成,非Native技 ...

  2. iOS中 H5的input输入框focus()无法自动拉起键盘(解决方法)

    ios的hybird APP 无法使用focus()获取焦点和键盘的问题. 解决方案 原来,在App的配置文件(config.xml),里面默认会有一句 1 <preference name=& ...

  3. iOS中支付宝集成

    iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...

  4. iOS中数据库应用基础

    iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...

  5. 正则表达式在iOS中的运用

    1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  6. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  7. iOS中使用正则

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  8. IOS中div contenteditable=true无法输入

    在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...

  9. 谈谈iOS中的屏幕方向

    众所周知,iOS中提供了[UIDevice currentDevice].orientation与[UIApplication sharedApplication].statusBarOrientat ...

随机推荐

  1. 工作中常用的sql语句以及知识整理

    一.常用的sql语句 1.建表语句 create table tabname(colname1 type1 [not null][primary key], colname2 type2,...) 根 ...

  2. CentOS 7 禁用IPV6以提高网速

    方法 1 编辑文件/etc/sysctl.conf,$vi /etc/sysctl.conf添加下面的行: net.ipv6.conf.all.disable_ipv6 = net.ipv6.conf ...

  3. 1 如何使用pb文件保存和恢复模型进行迁移学习(学习Tensorflow 实战google深度学习框架)

    学习过程是Tensorflow 实战google深度学习框架一书的第六章的迁移学习环节. 具体见我提出的问题:https://www.tensorflowers.cn/t/5314 参考https:/ ...

  4. 关于cn.jedisoft.framework.annotations 的增删改查

    今天在做一个crud的功能的时候,调用api老是调用不同.奇怪的是 在add的时候能添加进去,而删除和修改的时候不能成功. 最后反应过来,我在修改和删除的时候用的主键id是int类型的,接口类型是不能 ...

  5. Spring3实战第二章第二小节 IOC依赖注入 list和map集合

    Spring有多种依赖注入的形式,本篇文章仅介绍Spring通过xml进行IOC配置的方式. 1.Set注入 2.构造器注入 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new ...

  6. [uva] 10099 - The Tourist Guide

    10099 - The Tourist Guide 题目页:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemi ...

  7. C# 中重载自增自减操作符的具体运算原理 ----从C++程序员的角度看C#自增操作符重载的实质

    看了看C#的运算符重载,发现与C++打不相同.刚刚被C#的自增操作符坑了,现在来分享一下. 先定义一个类 class A { public int i; public A(int I) { i = I ...

  8. Oracle案例06—— OGG-01098 Could not flush "./dirdat/e1000004383" (error 28, No space left on device)

    一.前言 自从换了新环境,各种问题层出不穷,如果不是之前积累的经验丰富,估计都歇菜了,看来作为数据库全栈工程师(oracle/mysql/sqlserver/sap hana/pg/mongodb/r ...

  9. 【Leetcode】【Medium】Search Insert Position

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  10. win10系统 WMI Provider Host cpu 占用过高

    今天上班,发现系统有点卡,QQ总是没响应. 打开任务管理器,发现有一个程序- WMI Provider Host 占用cpu竟然高达80% 然后通过事件查看器发现是一个pid为9832的程序造成的 然 ...