zoukankan      html  css  js  c++  java
  • js(javascript)与OC(Objective-C)交互

    实质上oc与js的通信交互就是发送消息,也即函数调用,iOS7以后官方公布JavaScriptCore framework中很方便我们对他们之间的相互调用。在以前我们只能通过UIWebView的UIWebViewDelegate协议来实现.

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

    或者

    1
    - (void)webViewDidStartLoad:(UIWebView *)webView;
    • oc–>js stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数、一句js代码或他们的组合),当js函数有返回值或一句js代码有值返回可通过stringByEvaluatingJavaScriptFromString的返回值获取
    • js–>oc 利用webView的重定向原理(即重新在js中指定document.location的值,此为一url),只要在这个url字符串中按自定义的规则指定好所需调用oc中的函数和参数,然后通过OC中的shouldStartLoadWithRequest函数去捕获处理请求。

    一 JS调用OC

    js调用iOS分两种情况

    js里面直接调用方法

    js里面通过对象调用方法

    js里面直接调用方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    - (void)webViewDidStartLoad:(UIWebView *)webView{

    //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
    JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    //其中getCurrentUser就是js的方法名称,赋给是一个block 里面是iOS代码
    context[@"getCurrentUser"] = ^() {
    //在block中写OC代码
    return [[NSUserDefaults standardUserDefaults]objectForKey:@"MYJSANDOC"];
    };
    context[@"encodeParam"] = ^() {
    NSArray *args = [JSContext currentArguments];
    NSString *param = [NSString stringWithFormat:@"%@",args[0]];
    NSString *result = [[[YXBaseRequestManager alloc]init]encryptUseAES:param key:@"1%7jhs#Zjasd&tr*"];
    return result;
    };

    }
    js里面通过对象调用方法

    在这个方法中我们需要使用到 JSExport
    JSExport是一个协议,自定义协议后,里面的声明变量等会对JS开放,我们即可调用。

    首先我们要自定义一个协议,添加头文件#import <JavaScriptCore/JavaScriptCore.h>,继承自NSObject

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
      
    #import <Foundation/Foundation.h>
    #import <JavaScriptCore/JavaScriptCore.h>

    //首先创建一个实现了JSExport协议的协议
    @protocol JSObjectText <JSExport>

    //此处我们测试几种参数的情况
    -(void)JSObjectTextPush;

    @end

    //让我们创建的类实现上边的协议
    @interface JSObject : NSObject<JSObjectText>

    @end

    在.m中实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      #import "JSObjectText.h"  

    @implementation JSObjectText

    //本地储存Key,调用之后, 检查key是否存在则说明是否条用了原生方法
    -(void)JSObjectTextPush
    {
    [[NSUserDefaults standardUserDefaults]objectForKey:@"MYJSANDOC"];
    }

    @end

    在weibview加载完成之后调用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
      -(void)webViewDidFinishLoad:(UIWebView *)webView  
    {
    //网页加载完成调用此方法

    //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
    JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    //第二种情况,js是通过对象调用的,我们假设js里面有一个对象 testobject 在调用方法
    //首先创建我们新建类的对象,将他赋值给js的对象

    JSObjectText *text=[JSObjectText new];
    context[@"testobject"]=text;

    //同样我们也用刚才的方式模拟一下js调用方法
    NSString *jsStr=@"testobject.JSObjectTextPush()";
    [context evaluateScript:jsStr];


    }

    二 OC调用JS

    方法很简单,在加载webview后,通过点击事件,或者 返回值,调用stringByEvaluatingJavaScriptFromString来实现调用JS代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*
    * 点击事件
    * 调用javaScript的方法postStr()并取得返回值
    * 输出返回值到控制台
    */
    -(void)ocFromJs:(id)sender
    {
    NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"postStr();"];
    NSLog(@"JS返回值:%@",str);
    }
  • 相关阅读:
    LeetCode Convert Sorted List to Binary Search Tree
    LeetCode Convert Sorted Array to Binary Search Tree
    LeetCode Restore IP Addresses
    Linux-NoSQL之memcached
    Linux-LAMP虚拟主机配置
    Linux-Discuz安装LAMP
    python-Django与Nginx整合gunicorn模块
    python-Django与Apache整合wsgi模块
    python-Django收集主机信息json格式
    Linux-监控与安全运维之zabbix
  • 原文地址:https://www.cnblogs.com/jgCho/p/5882705.html
Copyright © 2011-2022 走看看