JSPatch部署JS代码控制OC代码

前言:

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

准备:

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"]; //是1得就取得
    [bquery findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
        //删除操作,如果。。。。删除文件。。。。
        if (!error) {
            if (array.count > 0) {
                BmobObject *object = array[0];
                NSString *PrivateMD5String = [object objectForKey:@"PrivkeyMD5String"];
                BmobFile *file = (BmobFile*)[object objectForKey:@"JSData"];
                NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                //取得第一个Documents文件夹的路径
                NSString *filePath = [path objectAtIndex:0];
                //                NSLog(@"%@",filePath);
                [self downloadFileURL:file.url savePath:filePath fileName:file.name tag:0 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 = 0; i<16; i++) {
        [ret appendFormat:@"%02X",result[i]];
    }
    return ret;
}
时间: 2024-11-03 21:26:22

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

JS游戏控制时间代码

var canvas = new HGAME.canvas();var testBox=document.getElementById('boxRender');testBox.appendChild(canvas.dom);var animate=new HGAME.animate({ action:function(){ canvas.render(); }});var colorObj={ r:0, g:0, b:0};function initColor(){ var div=null;

xcode中用oc代码基本控制view控件

控件代码部分: 编译运行后的结果为: 复杂一点的: 结果为: xcode中用oc代码基本控制view控件,布布扣,bubuko.com

[ios]js调用oc代码(oc)

用途:在ios开发中,经常回用到js调用oc代码的时候,例如在网页上有个拍照和打电话的按钮,想打开系统自带的拍照和电话的时候,就需要用到js调用oc代码的功能. 实现原理:在webView加载html网页的时候,没当发送一个请求,就会调用<UIWebViewDelegate>代理的 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIW

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

webview是ios中显示远程数据的网页控件,webview能显示的内容很多,MP4.文本.pdf等等: 关于js和oc代码的互相调用 1:oc中调用js代码; >>oc中调用js代码很简单,一个方法:stringByEvaluatingJavaScriptFromString:@“”: >>要执行的js代码方法到字符串中就可以了: 2:js中执行oc的某段代码: >>js中执行oc的代码要通过一个桥梁: 者桥梁就是webview的一个代理方法:(BOOL)webVi

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

介绍了那么多运动,這次一套代码实现所有运动 1.html代码和css代码,只是定义一个div 1 <style> 2 div{ 3 width:200px; 4 height:200px; 5 margin:20px; 6 float:left; 7 background:yellow; 8 border:10px solid black; 9 filter:alpha(opacity:30); 10 opacity:0.3; 11 } 12 </style> 13 <bod

十分钟搭建App主流框架_纯代码搭建(OC),你不知道的框架

十分钟搭建App主流框架_纯代码搭建(OC),你不知道的框架java学习爱好者 2019-06-11 14:28搭建主流框架界面 需要源码的可以私信我达成效果 效果图ps :需要源码的可以加群,668041364导读 我们玩iPhone应用的时候,有没发现大部分的应用都是上图差不多的结构,下面的TabBar控制器可以切换子控制器,上面又有Navigation导航条我们本文主要是讨论主体框架的搭建,数据暂时没有添加分析做项目的基本流程 1.搭建项目主框架(1)先搭建tabBarController

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

js css样式操作代码(批量操作) 作者: 字体:[增加 减小] 类型:转载 时间:2009-10-09 用js控制css样式,能让网页达到良好的的用户体验甚至是动画的效果.并且考虑到效率. 我们用js书写css样式通常会用下面的两种方式: 一般情况下我们用js设置元素对象的样式会使用这样的形式: 复制代码 代码如下: var element= document.getElementById(”id”); element.style.width=”20px”; element.style.he

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

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

unity3D角色代码控制问题

///////////////2015/07/06//////// ///////////////by xbw////////////// //////////////环境 unity4.6.1// 分享一些unity character control 代码:: using UnityEngine; using System.Collections; public class playControl : MonoBehaviour { public float movespeed =10f;