object-c 与 js交互的学习

最近,项目要用到js交互的功能,看了些资料。整理下自己学到的东西。

主要方向是 (1)、通过webview的delegate来做js交互;(2)、如果最低的sdk是7.0以上,可以使用JavaScriptCore 苹果自带的框架来做js交互。JavaScript的操作更高效

1、webview的delegate来做js 交互

通过 (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 代理方法可以知道网页中的每一个请求,通过请求的URL来判断 。关于这个代理方法 bool: NO 表示不执行默认操作、YES 执行默认操作。下面一个简单例子


// webview js调用OC

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

   // 这个方法是网页中的每一个请求都会被触发的

   NSString *requestString = [[[requestURL] absoluteString]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

   NSArray *components = [requestStringcomponentsSeparatedByString:@"::"];

   if (components != nil && [componentscount] > 0){

       NSString *pocotol = [components objectAtIndex:0];

       if ([pocotol isEqualToString:@"testapp"]) {

           NSString *messageStr = [componentsobjectAtIndex:1];

           NSArray *messageArray = [messageStrcomponentsSeparatedByString:@":"];

           if (messageArray != nil && [messageArraycount] > 0) {

               NSString *key = [messageArray objectAtIndex:0];

               NSString *value = [[messageArray objectAtIndex:1]stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

               if ([key isEqualToString:@"alert"]) {

                   UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:@"消息"message:value delegate:nilcancelButtonTitle:@"OK"otherButtonTitles: nil];

                    [alertshow];

                }

            }

           return NO;

        }

    }

   return YES;

}

注:跟JS那边约定的规范 协议名称::方法名:param1=value1¶m2=value2… //XX是协议名,command是命令名,后面是参数表(0或多个,command后的冒号不可省略)

// webview 注入JS代码

    [self.jsWebViewstringByEvaluatingJavaScriptFromString:@"var script = document.createElement('script');"

    "script.type = 'text/javascript';"

    "script.text = \"function getMessageFromApp('xxxx') { "

    "var testDiv = document.getElementById('testDiv');"

    "testDiv.innerText = message;"

    "}\";"

    "document.getElementsByTagName('head')[0].appendChild(script);"];

    [self.jsWebViewstringByEvaluatingJavaScriptFromString:@"getMessageFromApp('xxxx');"];


2、JavaScriptCore的简单实使用

//首先创建JSContext对象(此处通过当前webView的键获取到jscontext

    self.jsContext=[webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

// javaScriptCore框架 JS调用OC

    self.jsContext[@"sendCommand"] = ^(NSString *alert,NSString *message) {

       UIAlertView *alertView = [[UIAlertViewalloc]initWithTitle:alertmessage:message delegate:nilcancelButtonTitle:@"OK"otherButtonTitles: nil];

        [alertViewshow];

    };

// javaScriptCore 注入JS代码

    [self.jsContext[@"getMessageFromApp"]callWithArguments:@[[NSNumbernumberWithInteger:self.number++]]];

注: (1)、javascriptcore 通过 block 来对应js方法,block的参数就是对应js方法的参数;在block里面需要注意循环引用的问题

       (2)、 javaScriptCore 注入JS代码通过callWithArguments来传参数给js方法、如果传入多个参数、js只有一个参数、默认取数组第一个

这里说的是一些简单的使用,希望可以对刚接触这一块的朋友们有帮助。我理解的不对,还望指正,谢谢~~

这里可以下载这个简单的demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值