如何在ios工程中用oc调用js算法


假如现在有一套js的加密算法sm2,包含很多个js文件,需要在ios工程里面调用,适当的地方对数据加密,当然不能把uiwebview显示出来去点击上面的按钮。

前提:有一个html文件,这个html里面引用的所有的js文件,这个html上面已经写好了调用js的方法,步骤,按钮


第一步:新建一个ios工程,把html和js文件导入,写一个webView加载这个html

    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"SM2.html" withExtension:nil];
    NSURLRequest *request = [NSURLRequest requestWithURL:fileURL];
    [self.webview loadRequest:request];
发现:点击页面上的按钮是没有反应的。

问题1:如何获取到所有的js文件路径,然后加载到webview里

//获取所有的js文件路径
NSArray *jsArr = [[NSBundle mainBundle]pathsForResourcesOfType:@"js" inDirectory:nil];
//加载到webview
NSString *js = [NSString stringWithContentsOfFile:jspath encoding:NSUTF8StringEncoding error:nil];
[webView stringByEvaluatingJavaScriptFromString:js];

发现:没什么作用,这样做不对


第二步:在html文件中找到对应的调用js的代码,把所有"wenjianjianame/"都去掉

<span style="font-size:14px;">//这只是其中一个
<script src="wenjianjianame/sm2-test.js"></script></span>

<span style="font-size:14px;">//改成这样,都把相对路径去掉
<script src="sm2-test.js"></script></span>


再次运行,webview上的功能可以正常使用了。


第三步:如何用oc代码直接调用js,就是自动执行按钮的点击事件

在工程中引入JavaScriptCore.framework

在- (void)webViewDidFinishLoad:(UIWebView *)webView方法中填写下面代码

    //获取当前webview的jscontext
    JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    NSString *JS=@"alert('thisisjs')"; 
    [context evaluateScript:JS];//执行js语句
    
执行后,可看到一个警告框。

第四步:在html文件中,加密方法的代码是:

function jiami() {
//设置公钥     
var pubKey = "04852611F744AF045689DCFBF4C0437730D2D2DE332AB7F0FC02769C5FAB8A89437D9384F19AB882ED668A28936DB92475AA79AEF8690EE36F6FB77C69B9B571F8";
//将公钥和明文传入加密方法    
var encryptData = sm2-1.jiami(pubKey, msgData);
//得到密文
textMiwen.value = encryptData;
}
在- (void)webViewDidFinishLoad:(UIWebView *)webView方法中执行一下上面的代码

  

   
 
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

//需要把上面的代码写成字符串    
NSString *jsStr=@" var pubKey = \"04852611F744AF045689DCFBF4C0437730D2D2DE332AB7F0FC02769C5FAB8A89437D9384F19AB882ED668A28936DB92475AA79AEF8690EE36F6FB77C69B9B571F8\";var encryptData = sm2-1.jiami(pubKey, msgData);textMiwen.value = encryptData; ";
    
[context evaluateScript:jsStr];

运行一下,确实能得到加密数据。


问题2:怎么在ios中获取到加密的数据,即js如何调用oc


第五步:在- (void)webViewDidFinishLoad:(UIWebView *)webView加一个监听

//监听 
//logmiwen是js里的一个方法名

    context[@"logmiwen"] = ^() {
        NSArray *args = [JSContext currentArguments];
//输出logmiwen的参数
        for (id obj in args) {
            NSLog(@"%@",obj);
        }
    };

第六:修改一下上面的代码,在最后面调用logmiwen方法

  
 
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

//需要把上面的代码写成字符串    
NSString *jsStr=@" var pubKey = \"04852611F744AF045689DCFBF4C0437730D2D2DE332AB7F0FC02769C5FAB8A89437D9384F19AB882ED668A28936DB92475AA79AEF8690EE36F6FB77C69B9B571F8\";var encryptData = sm2-1.jiami(pubKey, msgData);textMiwen.value = encryptData; logmiwen(encryptData);";
    
[context evaluateScript:jsStr];

执行一下 ,可以看到密文在控制台输出了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值