1⃣️直接使用UIWebView加载网络上的HTML的代码,这样若是有问题只须要更新服务器的HTML文件,用户从新进入程序,加载新的HTML文件,整个程序就能更新.对用户影响很是小前端
2⃣️使用其余脚本语言经过Runtime动态调用OCweb
1⃣️.1⃣️WaxPatch:它把Lua脚本语言和原生Objective-C应用编程接口(API)结合起来,经过Lua脚原本调用OC编程
1⃣️.2⃣️JSPatch:JS是经过JavaScriptCore.framework调用Runtime,来实现JS调用OC数组
1⃣️JS比Lua在应用开发领域有更普遍的应用,目前前端开发和前端开发有融合的趋势,做为扩展的脚本语言,JS是不二之选浏览器
2⃣️JSPatch更符合Apple的规则。iOS Developer Program License Agreement里3.3.2提到不可动态下发可执行代码,但经过苹果JavaScriptCore.framework或WebKit执行的代码除外,JS正是经过JavaScriptCore.framework执行的七牛云存储
3⃣️使用系统内置的JavaScriptCore.framework,无需内嵌脚本引擎,体积小巧安全
4⃣️支持block服务器
1⃣️相对于WaxPatch,JSPatch劣势在于不支持iOS6,由于须要引入JavaScriptCore.framework网络
2⃣️另外目前内存的使用上会高于wax,持续改进中并发
存在风险:JSPatch让脚本语言得到调用全部原生OC方法的能力,不像web前端把能力局限在浏览器,使用上会有一些安全风险
1⃣️若在网络传输过程当中下发明文JS,可能会被中间人篡改JS脚本,执行任意方法,盗取APP里的相关信息,危及用户信息和APP
2⃣️若下载完后的JS保存在本地没有加密,在越狱的机器上用户也能够手动替换或篡改脚本
1⃣️JSPatch脚本的执行权限很高,若在传输过程当中被中间人篡改,会带来很大的安全问题,为了防止这种状况出现,在传输过程当中对JS文件进行了RSA签名加密,流程以下:
服务端:计算JS文件MD5值。用RSA私钥对MD5值进行加密,与JS文件一块儿下发给客户端。
客户端:拿到加密数据,用RSA公钥解密出MD5值。本地计算返回的JS文件MD5值。对比上述的两个MD5值,若相等则校验经过,取JS文件保存到本地。
因为RSA是非对称加密,在没有私钥的状况下第三方没法加密对应的MD5值,也就没法伪造JS文件,杜绝了JS文件在传输过程被篡改的可能。
2⃣️本地存储
本地存储的脚本被篡改的机会小不少,只在越狱机器上有点风险,对此JSPatch SDK在下载完脚本保存到本地时也进行了简单的对称加密,每次读取时解密。
JSPatch须要使用者有一个后台能够下发和管理脚本,而且须要处理传输安全等部署工做,JSPatch平台帮你作了这些事,提供了脚本后台托管,版本管理,保证传输安全等功能,让你无需搭建一个后台,无需关心部署操做,只需引入一个SDK便可当即使用JSPatch。
经过JSPatch平台上传的脚本文件都会保存在七牛云存储上,客户端APP只跟七牛服务器通信,支持高并发,CDN分布全国,速度和稳定性有保证。
除了修复bug,JSPatch也能够用于动态运营,实时修改线上APP行为,或动态添加功能。
JSPatch详细使用文档见Github Wiki
#import"ViewController.h"
@interfaceViewController()
@property(nonatomic,weak)UITableView*table;
//建立可变数组来更新数据
@property(nonatomic,strong)NSMutableArray*dataArray;
@end
@implementationViewController
#pragma mark -懒加载可变数组
- (NSMutableArray*)dataArray
{
if(_dataArray==nil)
{
_dataArray= [NSMutableArrayarray];
[_dataArrayaddObjectsFromArray:@[@"huangfang--1",@"huangfang--2",@"huangfang--3",@"huangfang--4",@"huangfang--5"]];
}
return_dataArray;
}
- (void)viewDidLoad
{
[superviewDidLoad];
self.view.backgroundColor= [UIColorgrayColor];
[selfsetUpVCWithContent];
}
#pragma mark -设置控制器的内容
-(void)setUpVCWithContent
{
//自定义导航栏的标题控件
UILabel*label = [[UILabelalloc]initWithFrame:CGRectMake(0,0,100,44)];
label.text=@"HFJSpatch";
label.textColor= [UIColorgreenColor];
label.font= [UIFontboldSystemFontOfSize:30];
self.navigationItem.titleView= label;
//自定义导航栏右边的item
UIButton*button =[UIButtonbuttonWithType:UIButtonTypeContactAdd];
[buttonaddTarget:selfaction:@selector(addData)forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem*rightButton = [[UIBarButtonItemalloc]initWithCustomView:button];
self.navigationItem.rightBarButtonItem= rightButton;
UITableView*table = [[UITableViewalloc]initWithFrame:self.view.bounds];
self.table= table;
table.dataSource=self;
[self.viewaddSubview:table];
}
#pragma mark -添加数据的方法
-(void)addData
{
NSString*datas =nil;
[self.dataArrayaddObject:datas];
[self.tablereloadData];
}
#pragma mark -数据源方法
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
returnself.dataArray.count;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
staticNSString*ID =@"HFcell";
UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:ID];
if(cell ==nil)
{
cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:ID];
cell.textLabel.textColor= [UIColorredColor];
cell.textLabel.textAlignment=NSTextAlignmentCenter;
cell.textLabel.font= [UIFontsystemFontOfSize:20];
if(indexPath.row>5)
{
cell.textLabel.textColor= [UIColororangeColor];
cell.textLabel.textAlignment=NSTextAlignmentRight;
cell.textLabel.font= [UIFontboldSystemFontOfSize:25];
}
}
cell.textLabel.text=self.dataArray[indexPath.row];
returncell;
}
@end
一、先选中刚才建立好的(main.js)
2.
3.在文件中写入代码
//main.js
// 指定要更新的对应的控制器
defineClass("ViewController", {
// 添加或修改的方法(
addData: function() {
// 获取到控制器中的可变数组
var datas = self.dataArray();
datas.addObject("huangfang6");
datas.addObject("huangfang7");
datas.addObject("huangfang8");
datas.addObject("huangfang9");
// 若是添加成功会将数组中的第一个元素打印出来(这个能够根据须要进行打印)
// console.log(datas.firstObject());
// 若是添加成功会将数组中的第一个元素打印出来
console.log(datas.lastObject());
self.table().reloadData();
}
})
注:上面的 addData: function() 中的addData要和咱们项目中的点击按钮执行的方法同样,若是不同会报错的
#import “AppDelegate.h"
#import “ViewController.h"
#import<JSPatch/JSPatch.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
ViewController *vc = [[ViewController alloc]init];
vc.view.backgroundColor = [UIColor magentaColor];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];
self.window.rootViewController = nav;
[self.window makeKeyWindow];
[JSPatch testScriptInBundle];
return YES;
}
@end
如下为运行结果 点击+后出现右对齐的三个
点击进入下一个界面
ATS:安全机制 在info.plist中加以下代码