OC WebView 与JavaScript 交互

Native 开发 和 H5  谁优谁劣,不在这边展开讨论。目前的开发过程中经常会遇到 原生应用 和web 交互的 需求。接下来我们就聊聊吧。

需求点

首页 运营一个活动,一个大转盘,转呀转呀,送 各种礼品呐。一个人一天可以转三次,分享到社交软件增加一次抽奖机会。


开始

iOS 应用 和web 页面交互 有以下 几种方法:

1、挺有名的第三方框架 WebViewJavaScriptBridge

2、iOS7 之后自带的 JavaScriptCore

3、据说还可以 拦截协议

第一种 和 第三种方法 这里就不详细介绍了(其实是我不会!!!)

方法一 作为 一个 知名的第三方框架,肯定会有 其他同行小伙伴介绍的,

传送门 :http://kittenyang.com/webview-javascript-bridge/

反正我也写不过他!

我选择方法二!

因为简单...

JavaScriptCore框架


JSContext:给JavaScript提供运行的上下文环境

JSValue:JavaScript和Objective-C数据和方法的桥梁

JSManagedValue:管理数据和方法的类

JSVirtualMachine:处理线程相关

JSExport:一个协议,接下来会介绍到

直接看代码

@interfaceTWWebViewController() <UIWebViewDelegate>

@property(nonatomic,strong)UIWebView*webView;

@property(nonatomic,strong)JSContext*jContext;

@property(nonatomic,strong)TWWebCallBackFunctionHelper*helper;

@end

考虑到 需求经常变化,我用 TWWebCallBackFunctionHelper 统一处理 OC 和 JS 制定的 方法。

- (void)viewDidLoad

{

[superviewDidLoad];

self.helper= [[TWWebCallBackFunctionHelperalloc]init];[self.viewaddSubview:self.webView];[self.webViewloadRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:self.webUrl]]];

}

加载  webView  和生成  TWWebCallBackFunctionHelper 对象。

#pragma mark - UIWebViewDelegate

- (BOOL)webView:(UIWebView*)webView

shouldStartLoadWithRequest:(NSURLRequest*)request

navigationType:(UIWebViewNavigationType)navigationType

{

returnYES;

}

- (void)webViewDidStartLoad:(UIWebView*)webView

{

if(!_jContext) {

self.jContext=

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

self.jContext[@"toApp"] =_helper;

}

}

- (void)webViewDidFinishLoad:(UIWebView*)webView

{

if(!self.webTitle.length) {

//获取当前页面的title

NSString*webTitle = [webViewstringByEvaluatingJavaScriptFromString:@"document.title"];

self.title= webTitle;

}

}

- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error

{

NSLog(@"didFailLoadWithError = %@", error);

}

在 webView 开始加载的时候 获取 JavaScript 上下文,和前端的小伙伴约定 toApp 为回调对象名(也有一些叫法 桥梁对象 ),helper 为实现协议对象。

接下来实现 TWWebCallBackFunctionHelper

#import <JavaScriptCore/JavaScriptCore.h>

@protocol webViewJsDelegate<JSExport>

JSExportAs(sharered, -(void)sharered

: (NSString *)url shareContent

: (NSString *)content linkUrl

: (NSString *)lUrl);

@end

JSExport 是 一个 协议, 自定义的  webViewJsDelegate 协议 需要遵守此协议。

我们来看下  JSExportAs 宏定义

PropertyName  类似 一个 key,和 对应的 例子里是 sharered,其 对应 要实现的方法是

-(void)sharered:shareContent:linkUrl;其中 'key' 对应的 sharered 需要和 web 约定一致。

//遵守 webViewJsDelegate 协议

@interfaceTWWebCallBackFunctionHelper() <webViewJsDelegate>

@end

@implementationTWWebCallBackFunctionHelper

- (void)sharered:(NSString*)url shareContent:(NSString*)content linkUrl:(NSString*)lUrl

{

//TODO:

//实现业务逻辑,调起 分享 功能

}

@end

好了,差不多就这样了,在运行过程中,偶现一个bug,点击分享 按钮没有 丝毫 反应,也就是 分享UI组件 没有 调用起来。这是什么鬼呀!

好吧,直接断点 调试,-(void)sharered:shareContent:linkUrl 方法是跑到了,也就是 调用 UI 时没有 反应。考虑是不是线程问题,看了JavaStript 相关定义,果然,“avaScript引擎是单线程运行的”,“JavaStript调用本地方法是在子线程中执行的” ,so...

- (void)sharered:(NSString*)url shareContent:(NSString*)content linkUrl:(NSString*)lUrl

{

//TODO:

//实现业务逻辑,调起 分享 功能

//主线程中去 刷新 UI 等功能

dispatch_async(dispatch_get_main_queue(), ^{

}

});

}

结论

这边只是简单的介绍 JavaScriptCore  最基础的 用法,很轻量。更多的 JavaScriptCore API 可以去查 苹果官方文档。另外在网上搜了下,发现一篇 类似 介绍 OC WebView 与JavaScript 交互 文章,除了 介绍JavaScriptCore  还介绍了 iOS8之后的WKWebView  和 第三点 拦截协议,介绍的都 比我 的详细,贴出来 给大家参考:http://www.jianshu.com/p/f896d73c670a?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weibo

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

推荐阅读更多精彩内容