前言:

这里算是比较实用的一篇了吧,进行了网络安全部署

准备:

bmob账号,JSPatch,公钥,私钥,MD5加密,AFNetWorking下载文件

#import <CommonCrypto/CommonDigest.h>

#import <BmobSDK/Bmob.h>

#import "AFNetworking.h"

#import "JPEngine.h"

#import "RSA.h"

原理:

1.使用bmob,得到私钥加密后的jsMD5,JS文件地址

2.根据地址下载js文件,并且保存到沙盒中

3.根据加密MD5匹配JS文件内容,成功就执行

4.没有进行网络判断,只有有网的情况才能执行,没网的时候就使用以前的OC代码

代码片段:

1.请求bmob上的数据

    //这里是bmob的key自己去申请个账号,创建一个应用就有了
[Bmob registerWithAppKey:@"这里填写自己的key"];
BmobQuery *bquery = [BmobQuery queryWithClassName:@"JSPathString"];
//约束,只取版本号为1的
[bquery whereKey:@"version" equalTo:@""]; //是1得就取得
[bquery findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
//删除操作,如果。。。。删除文件。。。。
if (!error) {
if (array.count > ) {
BmobObject *object = array[];
NSString *PrivateMD5String = [object objectForKey:@"PrivkeyMD5String"];
BmobFile *file = (BmobFile*)[object objectForKey:@"JSData"];
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//取得第一个Documents文件夹的路径
NSString *filePath = [path objectAtIndex:];
// NSLog(@"%@",filePath);
[self downloadFileURL:file.url savePath:filePath fileName:file.name tag: PrivateMD5String:PrivateMD5String]; }
}else {
NSLog(@"失败的情况。。。");
}
}];

2.根据提供的地址下载文件

/**
* 下载文件,这是用的,网络请求,要换,现在都是af3.0了
*/
+ (void)downloadFileURL:(NSString *)aUrl savePath:(NSString *)aSavePath fileName:(NSString *)aFileName tag:(NSInteger)aTag PrivateMD5String:(NSString *)PrivateMD5String
{
NSFileManager *fileManager = [NSFileManager defaultManager]; //检查本地文件是否已存在
NSString *fileName = [NSString stringWithFormat:@"%@/%@", aSavePath, aFileName]; //检查附件是否存在
if ([fileManager fileExistsAtPath:fileName]) {
// NSLog(@"本地已经存在");
[self doJSPathWith:PrivateMD5String fileName:fileName]; }else{
//创建附件存储目录
if (![fileManager fileExistsAtPath:aSavePath]) {
[fileManager createDirectoryAtPath:aSavePath withIntermediateDirectories:YES attributes:nil error:nil];
} //下载附件
NSURL *url = [[NSURL alloc] initWithString:aUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:url]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.inputStream = [NSInputStream inputStreamWithURL:url];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:fileName append:NO]; //下载进度控制 [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
NSLog(@"is download:%f", (float)totalBytesRead/totalBytesExpectedToRead);
}]; //已经完成下载
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * operation, id responseObject) {
//下载的数据
NSLog(@"下载成功");
[self doJSPathWith:PrivateMD5String fileName:fileName];
} failure:^(AFHTTPRequestOperation * operation, NSError * error) {
NSLog(@"下载失败");
}];
[operation start];
}
}

3.匹配检查JS文件是否正确

+ (void)doJSPathWith:(NSString *)PrivateMD5String fileName:(NSString *)fileName{
#pragma mark - 客户端操作,可以等待服务器,等待时间可以10's左右,网络请求后得到数据,然后还可以加一个开关按钮,可决定是否传这个js文件,以免出现BUG
//公钥
NSString *pubkey = @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCiw8lUn/RkpTFrIsC49i9ETR1\nRZuc265x7emOYgSLF4E2LkvxZk0klIC74MBDABhyN+TFQ2J9FkJX8XkzQkrnTv/G\nh0td+U+0D84tK81NJzBa1+pPXE55JjarwNLzf1VEfUBUWMoGKTVQV05sC0JjsYyX\nm6mbFq8j9v7ygO/FQQIDAQAB"; //服务器返回的RSA私钥加密的字符串字符串
NSString *fuwuqiMD5String = PrivateMD5String;
//服务器返回的JS字符串
NSString *script = [NSString stringWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:nil];; //公钥解密得到解密后的MD5字符串
NSString *decWithPrivKey = [RSA decryptString:fuwuqiMD5String publicKey:pubkey];
[JPEngine startEngine];
if ([[self md5:script] isEqualToString:decWithPrivKey]) {
// NSLog(@"匹配成功");
[JPEngine evaluateScript:script];
}else {
// NSLog(@"匹配失败");
}
}

4.其它(MD5加密)

//md5加密
+ (NSString *)md5:(NSString *)input {
const char* str = [input UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, (unsigned)strlen((const char *)str), result);
NSMutableString *ret = [NSMutableString string];
for(int i = ; i<; i++) {
[ret appendFormat:@"%02X",result[i]];
}
return ret;
}

JSPatch部署JS代码控制OC代码的更多相关文章

  1. JS代码和OC代码的相互调用

    JS调用OC 很多应用里面或多或少的调用了网页,来达到绚丽的效果,所谓的JS调用OC.....举个例子吧,网页上有个按钮 点击按钮跳转界面,跳转的动作由OC的代码实现. OC调用JS 还是举个例子,我 ...

  2. JS游戏控制时间代码

    var canvas = new HGAME.canvas();var testBox=document.getElementById('boxRender');testBox.appendChild ...

  3. iOS 使用UIWebView把oc代码和javascript相关联

    首先请参看一篇文章,作者写的很明白,请参看原地址 http://blog.163.com/m_note/blog/static/208197045201293015844274/. 其实,oc和js的 ...

  4. iOS-JS调用OC代码

    监听时间点击 改变当前浏览器窗口地址 在js里调用OC代码,需要在网页上写一个协议,不是http协议 然后在OC的webView shouldStartloadWithRequest

  5. ios-UIWebView中js和oc代码的互调

    webview是ios中显示远程数据的网页控件,webview能显示的内容很多,MP4.文本.pdf等等: 关于js和oc代码的互相调用 1:oc中调用js代码; >>oc中调用js代码很 ...

  6. ios--网页js调用oc代码+传递参数+避免中文参数乱码的解决方案(实例)

    此解决方案原理: 1.在ViewController.h中声明方法和成员变量,以及webView的委托: // //  ViewController.h //  JS_IOS_01 // //  Cr ...

  7. js实现一套代码来控制所有的运动,图片的淡入淡出,winth,height的变宽

    介绍了那么多运动,這次一套代码实现所有运动 1.html代码和css代码,只是定义一个div <style> div{ width:200px; height:200px; margin: ...

  8. JS弹出窗口代码大全(详细整理)

    1.弹启一个全屏窗口 复制代码代码如下: <html> <body http://www.jb51.net','脚本之家','fullscreen');">; < ...

  9. js css样式操作代码(批量操作)

    js css样式操作代码(批量操作) 作者: 字体:[增加 减小] 类型:转载 时间:2009-10-09   用js控制css样式,能让网页达到良好的的用户体验甚至是动画的效果.并且考虑到效率.   ...

随机推荐

  1. Android镜像文件ramdisk.img,system.img,userdata.img介绍

    Android 源码编译后,在out目录下生成的三个镜像文件:ramdisk.img,system.img,userdata.img以及它们对应的目录树root,system,data. ramdis ...

  2. UVA1001 Say Cheese (dijkstra)

    如果没有洞,那么任意两点的最短距离就是直线距离,洞里是瞬间的,所以看成一个点就行了(其实点也可以当作半径为0的洞来处理),洞到洞的最短距离都是圆心距离减去半径.剩下的就是求单源最短路径,是完全图,用不 ...

  3. Block中__block实现原理

    三.Block中__block实现原理 我们继续研究一下__block实现原理. 1.普通非对象的变量 先来看看普通变量的情况. #import <Foundation/Foundation.h ...

  4. WPF中在后台实现控件样式

    加入现在有一个Button的样式如下: <Style TargetType="{x:Type Button}" x:Key="MyButton">. ...

  5. Fiddler模拟POST请求

    在进行接口测试时,会模拟post请求,发送不同的请求参数,返回不同的结果,今天我们就来分享一下,怎么用Fiddler工具模拟post请求: 打开Fiddler工具,在右侧点击“composer”的选项 ...

  6. vue 不支持 数组Array,只支持get set push,但是正是做tab的时候,用到splice,就都不好用了,最后用v-if,从新渲染 完美解决

    vue 不支持 数组Array,只支持get set push,但是正是做tab的时候,用到splice,就都不好用了,最后用v-if,从新渲染 完美解决

  7. 前端性能优化:细说JavaScript的加载与执行

    本文主要是从性能优化的角度来探讨JavaScript在加载与执行过程中的优化思路与实践方法,既是细说,文中在涉及原理性的地方,不免会多说几句,还望各位读者保持耐心,仔细理解,请相信,您的耐心付出一定会 ...

  8. Open Cascade:AIS_InteractiveContext如何调用函数选择AIS对象

    AIS_InteractiveContext如何调用函数选择AIS对象 myAISContext->MoveTo(point.x, point.y, myView); myAISContext- ...

  9. Sublime Text 套件介紹(四):Pretty JSON

    JSON,一個輕量級的資料交換語言,目前許多網站AJAX request的回應結果都是JSON格式   以下是一個標準的JSON格式   { "firstName": " ...

  10. [BZOJ3307]:雨天的尾巴(LCA+树上差分+权值线段树)

    题目传送门 题目描述: N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式: 第一 ...