UIWebView之JS与OC交互(一)

前言

基于UIWebView的JS与OC交互(一)之JSExport
基于UIWebView的JS与OC交互(二)之拦截URL
基于UIWebView的JS与OC交互(三)之Block
基于WKWebView的JS与OC交互
本篇文章基于UIWebView进行介绍,详细demo在这里
在开发过程中避免不了使用网页进行数据展示和操作,JS与OC的交互就起到了很大的作用。WKWebView是在ios8.0以后出现的,在下一篇文章,会介绍关于WKWebView中JS与OC之间的交互。


正文

JS与OC的交互是双向的。

第一步,OC调用JS

    NSString *js_str = [NSString stringWithFormat:@"alert('%@')", @"h5弹窗"]; //准备执行的js代码
    [webPageView stringByEvaluatingJavaScriptFromString:js_str];
image.png

第二步,JS调用OC方法

本篇文章通过声明代理并遵循JSExport协议来完成调用。注:代理声明的方法与调用的方法名保持一致。

H5代码(调用方法):

window.test1.showAlert('js调用oc本地方法');

注意:test1为h5与移动端约定的上下文id。

代理类
JSObject.h

#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>
@protocol JSObjcDelegate <JSExport>
/**
 *  调起弹窗
 *  tip  描述文案
 */
- (void)showAlert:(NSString *)tip;
@end
NS_ASSUME_NONNULL_BEGIN
//必须遵循代理,否则方法调用不生效
@interface JSObject : NSObject<JSObjcDelegate>

@property(nonatomic, weak)id<JSObjcDelegate> delegate;
@end
NS_ASSUME_NONNULL_END

注意:在.h中声明代理的同时,要遵循代理协议,否则代理方法是无法调起的。

JSObject.m

#import "JSObject.h"

@implementation JSObject
//调起弹窗
- (void)showAlert:(NSString *)tip
{
    [self.delegate showAlert:tip];
}
@end

方法的实现放到控制器的.m中,如果需要放到base类中实现,也可以放到baseVC中,如下:
ViewController.m

//本地方法的具体实现
- (void)showAlert:(NSString *)tip
{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"jsExport-oc原生弹窗" message:tip delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
    [alert show];
}

以上是本地方法代理的声明以及方法的实现,然而,如何调用呢?
接下来是方法的调用:
ViewController.m
初始化UIWebView:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    webPageView = [UIWebView new];
    webPageView.delegate = self;
    webPageView.scalesPageToFit = YES;
    webPageView.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight - 50);
    [self.view addSubview:webPageView];
//    [webPageView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"myHtml" ofType:@"html"];
    [webPageView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]];
}

通过JSContext实现本地方法与JS的连接:

//js调用oc本地方法
- (void)js_ocMethod
{
    //方法类
    JSObject *jsObject = [JSObject new];
    jsObject.delegate = self;
    //js执行环境,包含了js执行时所需要的所有函数和对象
    JSContext *jsContext = [webPageView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    //test1:H5与移动端约定的id
    jsContext[@"test1"] = jsObject;
    jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
        context.exception = exceptionValue;
        NSLog(@"异常信息:%@", exceptionValue);
    };
}

并在- (void)webViewDidFinishLoad:(UIWebView )webView代理方法中调用- (void)js_ocMethod*即可。

image.png

最后,这是html文件中的代码,该文件在也已经包含在Demo

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>标题</title>
</head>
<body>
<div>
<p h3>JS与OC交互</p>
</div>
<div>
<!--  初始化一个按钮,点击调用boc本地方法  -->
<input type="button" value="OC本地弹窗"   onclick="show()">
</div>
<script type="text/javascript">
    //show为按钮点击的响应事件
    //showAlert为oc本地方法
    //test1为q移动端与h5约定的id
    function show(){
        window.test1.showAlert('js调用oc本地方法');
    }
</script>
</body>
</html>

iOS技术交流群:681732945

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容