wkwebview js交互javascriptbridge 和wkweb哪个好

WebViewJavascriptBridge
NJKWebViewProgress 冲突 - 简书
WebViewJavascriptBridge
NJKWebViewProgress 冲突
self.bridge = [WebViewJavascriptBridge bridgeForWebView:self.webview];
[self.bridge setWebViewDelegate:self];
[self _addWebBridge];
_progressProxy = [[NJKWebViewProgress alloc] init];
_progressProxy.webViewProxyDelegate =// 这个地方导致上面设置
[self.bridge setWebViewDelegate:self]; 失效了。
_progressProxy.progressDelegate =
self.webview.delegate
= _progressP
CGFloat progressBarHeight = 3.f;
CGRect barFrame = CGRectMake(0,0, [UIScreen mainScreen].bounds.size.width, progressBarHeight);
_progressView = [[NJKWebViewProgressView alloc] initWithFrame:barFrame];
_progressView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopM
[self.view addSubview:_progressView]
为什么是导致失效呢,因为代理是weak类型,是一对一的。
1._progressProxy.webViewProxyDelegate = self.
懒人改变世界~
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译) 原文 https://github.com/objc-zen/objc-zen-book Gitbook 链接(包含 PD...
原文链接http://www.cnblogs.com/kenshincui/p/4186022.html 音频在iOS中音频播放从形式上可以分为音效播放和音乐播放。前者主要指的是一些短音频播放,通常作为点缀音频,对于这类音频不需要进行进度、循环等控制。后者指的是一些较长的音...
*面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把基础的东西弄好,复杂的东西了解就ok了! *此题库是年北上广深杭各大小公司面试题。 *注:如今社会还是得靠本事,面试题60分只是多了一个机会,...
今日阅读时间2小时 今日困难:担心突然读的太多,耗尽了明日的激情 今日收获:因为前两天的总结激励了自己,于是特地拿出了一点时间继续复习这本书。不小心看进去了。很久没有这么愉悦的读过书了。不仅收获了书本知识,而且体会到,每天尽力去读,总会有时间的。而且这样打卡,还蛮有动力的。...
?①睡觉前想着把今天开心的事想一遍,然后安心的睡着那是何等的幸福,最近喜欢上冬的推文以及他满满的的正能量,那种似乎在分享着朋友间的喜怒哀乐,而我们,是陌生人,未曾相见。我想,更多的是因为冬的正能量,还好,我选择了乐观去对待每个时期杂七杂八的糟糕问题。 ?②而往常不一样,我改...
今天分享晚了,正好群里妈妈们在讨论一个“大”问题,于是,插嘴来说两句。 我是被两个谎话骗大的,第一、我是从垃圾堆里捡回来的,小时候我特别纳闷儿,经过垃圾堆还会使劲儿瞅瞅,希望能自己也捡一个回来……第二、我是爸爸生的,喝爸爸的奶长大的。你说为什么我就真的信了呢?……总之,鉴于...
今天是学习雷锋日,响应老妈的号召,腾出一周仅有一天的休息日就去跟老妈参加活动去了。 此次活动是去陪一个独居老人聊天。在路上了解到选择这个老人的原因是因为老人每天都自发的将自己所居住的巷道打扫的干干净净的,风雨无阻。一直在默默的做些贡献。 老人是一个退休的教师,虽然独居,但是...
前几周,我说我有一个期盼,正在进行时。那时我的焦虑与恐惧,我的失眠与神经质,都是因为这个期盼,这个期望。 在无数个夜晚我总会描绘这期盼的美丽花朵是怎样的,绚丽的果实是怎样的。一遍遍的,重复在N个夜晚。然后在白天,一副势在必得的自信姿态,出现在所有人面前,那么自信没有一丝丝胆...WebViewJavascriptBridge 原理分析
网上好多都是在介绍 WebViewscriptBridge如何使用,这篇文章就来说说 WebViewJavascriptBridge 设计原理。
主要从两个过程来讲一下:js调用UIViewController中的代码(Native),Native调用js
首先有两个问题:
a.Native(中的UIWebView)是否可以直接调用js method(方法)? 可以。
b.js 是否可以直接调用Native的mthod?不行。
明确上述两个问题,那么上图就不难明白了,webpage中的js method和webview本地的method之间关系。那WebViewJavascriptBridge出现是否解决这个问题(这个问题就是让js可以直接调用native的method)呢?答案是否定的?没有本质还是用uiwebview的代理方法进行字段拦截(判断url的scheme),实现js间接调用native的method。
我们来看WebViewJavascriptBridge提供的demo:
主要的核心是下面两个,接下来我们就来讨论一下其设计原理。
2.js调用Native method
在概述中说过,js是不能直接调用native的method所以,需要借助- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType,这个方法大家不陌生,每次在重新定向URL的时候,这个方法就会被触发,通常情况,我们会在这里做一些拦截完成js和本地的间接交互什么的。那么WebViewJavascriptBridge也不另外,也是这么做。
我们先来看看在ExampleApp.html文件中点击一个按钮发起请求的代码:
var callbackButton = document.getElementById('buttons').appendChild(document.createElement('button'))
callbackButton.innerHTML = 'Fire testObjcCallback'
callbackButton.onclick = function(e) {
e.preventDefault()
log('JS calling handler &testObjcCallback&')
bridge.callHandler('testObjcCallback', {'foo': 'cccccccccccc'}, function(response) {
log('JS got response', response)
估计大家大体都能看懂,唯独有疑问的地方是:
bridge.callHandler('testObjcCallback', {'foo': 'cccccccccccc'}, function(response) {
log('JS got response', response)
这段代码先不说,上面代码就是一个按钮的普通单击事件方法。我们一起想一下,如果这个按钮需要被点击之后调用native中的funtion函数,之后需要把这个(native的)funtion函数处理结果返回给js中的方法继续处理。这个是我们需求,带着这个需求我们看一下这个方法,testObjcCallBack这个我们猜测一下应该native中的方法或者一个能够调用到方法的name/id,后面这个是个json{&foo&:&ccccccccccccc&},应该是个参数,那么后面这个方法一看log应该知道,是对native返回的result进行处理的方法。拿具体是不是呢?只要找到callHandler方法就知道了。
在文件WebViewJavascriptBridge.js.txt里面我们找找这个方法:
function callHandler(handlerName, data, responseCallback) {
_doSend({ handlerName:handlerName, data:data }, responseCallback)
这里又多了一个方法叫_doSend连个参数 第1个是字典key-value定义,第二个是一个方法的指针(看看上面的方法你就知道了),那我们必须在同一个文件里面看看能不能找到这个_doSend方法:
function _doSend(message, responseCallback) {
if (responseCallback) {
var callbackId = 'cb_'+(uniqueId++)+'_'+new Date().getTime()
responseCallbacks[callbackId] = responseCallback
message['callbackId'] = callbackId
sendMessageQueue.push(message)
messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE
逐行分析一下,变量callbackId是个字符串,responseCallBacks[] 一看就知道是个字典 ,这个字典把回掉(我们猜测)的方法responseCallback给保存起来,这Key(也就是callbackId)应该是唯一的,通过计数和时间应该知道这个字符串应该是唯一的,message也是一个字典,这是给message添加了一个新的key-value。干嘛呢?我也不知道,我们来看看sendMessageQueue是什么,大家一个push就知道应该是个数组。他吧一个字典放到一个消息队列中(数组队列),让后产生一个src(url scheme)。
有两个变量我们看看:
var CUSTOM_PROTOCOL_SCHEME = 'wvjbscheme'
var QUEUE_HAS_MESSAGE = '__WVJB_QUEUE_MESSAGE__'
干嘛用,肯定是给webview 的 delegate判断用的,你感觉呢?(肯定是)
下面是在文件:WebViewJavascriptBridge.m
好了到了这里大家猜猜这个要干嘛?肯定是要发url让web截取对吧?那还用问啊,肯定是啊,已经说过了js能不能调用native的funtion函数?不能。我们来看看这个messagingIframe是:
function _createQueueReadyIframe(doc) {
messagingIframe = doc.createElement('iframe')
messagingIframe.style.display = 'none'
messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE
doc.documentElement.appendChild(messagingIframe)
原来就是iframe,这个就不同给大家解释了。好了src一产生就会出现什么,uiwebview代理回掉截获,此时我们把目光回到UIWebview的Native下面:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if (webView != _webView) { return YES; }
NSURL *url = [request URL];
__strong WVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewD
if ([[url scheme] isEqualToString:kCustomProtocolScheme])
if ([[url host] isEqualToString:kQueueHasMessage])
//会走这里
[self _flushMessageQueue];
NSLog(@&WebViewJavascriptBridge: WARNING: Received unknown WebViewJavascriptBridge command %@://%@&, kCustomProtocolScheme, [url path]);
return NO;
else if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)])
return [strongDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
return YES;
一看就头大,哈哈,是,我也头大。看看上面的注释说 会走这里,我们看看为什么会走那里,最外圈的if([url scheme])判断是
#define kCustomProtocolScheme @&wvjbscheme&
这个定义是什么意思,我们先不做解释,刚才我们说过js不能直接调用native的function,大家只要记住这点,接着往下走就是了。至于为什么走这里,自己看代码(上文有提到),我们看看_flushMessageQueue:
- (void)_flushMessageQueue {
NSString *messageQueueString = [_webView stringByEvaluatingFromString:@&WebViewJavascriptBridge._fetchQueue();&];
//json转成数组
id messages = [self _deserializeMessageJSON:messageQueueString];
if (![messages isKindOfClass:[NSArray class]]) {
NSLog(@&WebViewJavascriptBridge: WARNING: Invalid %@ received: %@&, [messages class], messages);
for (WVJBMessage* message in messages) {
if (![message isKindOfClass:[WVJBMessage class]]) {
NSLog(@&WebViewJavascriptBridge: WARNING: Invalid %@ received: %@&, [message class], message);
[self _log:@&RCVD& json:message];
//用于js回掉
NSString* responseId = message[@&responseId&];
if (responseId) {
WVJBResponseCallback responseCallback = _responseCallbacks[responseId];
responseCallback(message[@&responseData&]);
[_responseCallbacks removeObjectForKey:responseId];
WVJBResponseCallback responseCallback = NULL;
NSString* callbackId = message[@&callbackId&];
if (callbackId) {
responseCallback = ^(id responseData) {
if (responseData == nil) {
responseData = [NSNull null];
WVJBMessage* msg = @{ @&responseId&:callbackId, @&responseData&:responseData };
[self _queueMessage:msg];
responseCallback = ^(id ignoreResponseData) {
// Do nothing
if (message[@&handlerName&]) {
handler = _messageHandlers[message[@&handlerName&]];
handler = _messageH
if (!handler) {
[NSException raise:@&WVJBNoHandlerException& format:@&No handler for message from JS: %@&, message];
handler(message[@&data&], responseCallback);
这下牛逼了,不忍直视啊!这么多,哈哈,多不可怕,可怕是你坚持不下去了。
我们逐行来看:
NSString *messageQueueString = [_webView stringByEvaluatingJavaScriptFromString:@&WebViewJavascriptBridge._fetchQueue();&];
我们必须回去到js文件中去,这里是webview直接调用js中的方法:
function _fetchQueue() {
var messageQueueString = JSON.stringify(sendMessageQueue)
sendMessageQueue = []
return messageQueueString
谢天谢地这个方法代码不多,这个消息很眼熟,SendMessageQueue,刚才我们说什么来?他是一个字典,那里面有哪些东西,我么来看看
handlerName:handlerName,
data:data,
callbackId:callbackId
这个消息字典此时被取出来准备做什么,这里提示下我们已经走到webview 的delegate里面了,所以拿到这些信息肯定是调用native的method对吧?肯定是的。接着往下走,接着会把json字符串转成数组,然后进行判断,
NSString* responseId = message[@&responseId&];
有没有responseid,你说又没,肯定没有啊(你不行看看上面),所以就这这里了
WVJBResponseCallback responseCallback = NULL;
NSString* callbackId = message[@&callbackId&];
if (callbackId) {
responseCallback = ^(id responseData) {
if (responseData == nil) {
responseData = [NSNull null];
WVJBMessage* msg = @{ @&responseId&:callbackId, @&responseData&:responseData };
[self _queueMessage:msg];
responseCallback = ^(id ignoreResponseData) {
// Do nothing
if (message[@&handlerName&]) {
handler = _messageHandlers[message[@&handlerName&]];
handler = _messageH
if (!handler) {
[NSException raise:@&WVJBNoHandlerException& format:@&No handler for message from JS: %@&, message];
handler(message[@&data&], responseCallback);
这部分是重点,到底他是怎么要调用本地function的,callbackId大家熟悉吧,判断是否为空,不为空给他指定一个block,这个不说了,block指定,此时不调用(手动调用才会执行),这个刚才说了用来处理native的function处理的result用于把处理后的值返回给js的,接着往下去,看到handler这个方法会从message找到handlerName,这里我们看一下多了一个_messageHandlers字典,从这个字典获取一个block(WVJBHandler是一个block),直接执行了。那我们看看_messageHandlers是怎么被添加block的:
- (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler {
_messageHandlers[handlerName] = [handler copy];
那又是谁调用了这个方法:
找到了(在文件 ExampleAppViewController.m的viewdidload中),这里有方法testObjecCallback
[_bridge registerHandler:@&testObjcCallback& handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@&testObjcCallback called: %@&, data);
responseCallback(@&Response from testObjcCallback&);
有点乱了。刚才我们的思路都是倒推的,如果我们整过来,首先肯定是viewdidload初始化,初始化之后会把这个block加入到_messageHandlers中,之后因为js调用动态读取这个block调用,在调用之前,我们又把定一个block付给回掉处理的responseCallback的block,这个block在handler中调用而调用,有点绕,自己可以多想想。
我们接着来看看:
responseCallback = ^(id responseData) {
if (responseData == nil) {
responseData = [NSNull null];
WVJBMessage* msg = @{ @&responseId&:callbackId, @&responseData&:responseData };
[self _queueMessage:msg];
这个就是你绕的地方,他是后被定义的,所以一开不执行,只有在处理数据后回调才会被调用,这里有个方法_queueMessage:
- (void)_queueMessage:(WVJBMessage*)message {
if (_startupMessageQueue) {
[_startupMessageQueue addObject:message];
[self _dispatchMessage:message];
这里面还有个方法:
- (void)_dispatchMessage:(WVJBMessage*)message {
NSString *messageJSON = [self _serializeMessage:message];
[self _log:@&SEND& json:messageJSON];
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@&\\& withString:@&\\\\&];
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@&\&& withString:@&\\\&&];
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@&\'& withString:@&\\\'&];
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@&\n& withString:@&\\n&];
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@&\r& withString:@&\\r&];
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@&\f& withString:@&\\f&];
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@&\u2028& withString:@&\\u2028&];
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@&\u2029& withString:@&\\u2029&];
NSString* javascriptCommand = [NSString stringWithFormat:@&WebViewJavascriptBridge._handleMessageFromObjC('%@');&, messageJSON];
if ([[NSThread currentThread] isMainThread]) {
[_webView stringByEvaluatingJavaScriptFromString:javascriptCommand];
__strong WVJB_WEBVIEW_TYPE* strongWebView = _webV
dispatch_sync(dispatch_get_main_queue(), ^{
[strongWebView stringByEvaluatingJavaScriptFromString:javascriptCommand];
我们在回到WebViewJavascriptBridge.js.txt文件中看到
function _handleMessageFromObjC(messageJSON) {
if (receiveMessageQueue) {
receiveMessageQueue.push(messageJSON)
} else {//肯定走这个
为什么呢?
_dispatchMessageFromObjC(messageJSON)
再来看看:
function _dispatchMessageFromObjC(messageJSON) {
setTimeout(function _timeoutDispatchMessageFromObjC() {
var message = JSON.parse(messageJSON)
var messageHandler
var responseCallback
if (message.responseId) {
responseCallback = responseCallbacks[message.responseId]
if (!responseCallback) { }
responseCallback(message.responseData)
delete responseCallbacks[message.responseId]
if (message.callbackId) {
var callbackResponseId = message.callbackId
responseCallback = function(responseData) {
_doSend({ responseId:callbackResponseId, responseData:responseData })
var handler = WebViewJavascriptBridge._messageHandler
if (message.handlerName) {
handler = messageHandlers[message.handlerName]
handler(message.data, responseCallback)
} catch(exception) {
if (typeof console != 'undefined') {
console.log(&WebViewJavascriptBridge: WARNING: javascript handler threw.&, message, exception)
大家还记得我们返回的对象是:
@{ @&responseId&:callbackId, @&responseData&:responseData }
所以这里messageHandlers刚才也说过了用来存方法的,callbackId被换了个名字叫responseId意思一样,只要值没变就行,所以就会执行:
bridge.callHandler('testObjcCallback', {'foo': 'cccccccccccc'}, function(response) {
log('JS got response', response)
中的方法,好了,完了。
总结一下:js这边 先把方法名字、参数、处理方法保存成一个字典在转成json字符串,在通过UIWebview调用js中某个方法把这个json字符串传到Native中去(不是通过url传的,这样太low了),同时把这个处理的方法以key-value形式放到一个js的字典中。
UIWebView在收到这个json之后,进行数据处理、还有js的回掉的处理方法(就是那个callbackId)处理完成后也会拼成一个key-value字典通过调用js传回去(可以直接调用js)。
js在接到这个json后,根据responseId读取responseCallbacks中处理方法进行处理Native code返回的数据。
3.Native调用js method
过程不是直接调用js,也是通过js调用Native过程一样的处理方式。
大体来看一下,先看一个按钮的单击事件:
- (void)callHandler:(id)sender {
id data = @{ @&greetingFromObjC&: @&Hi there, JS!& };
[_bridge callHandler:@&testJavascriptHandler& data:data responseCallback:^(id response) {
NSLog(@&testJavascriptHandler responded: %@&, response);
看看callHandler:
- (void)callHandler:(NSString *)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback {
[self _sendData:data responseCallback:responseCallback handlerName:handlerName];
看看_sendData:
- (void)_sendData:(id)data responseCallback:(WVJBResponseCallback)responseCallback handlerName:(NSString*)handlerName {
NSMutableDictionary* message = [NSMutableDictionary dictionary];
if (data) {
message[@&data&] =
if (responseCallback) {
NSString* callbackId = [NSString stringWithFormat:@&objc_cb_%ld&, ++_uniqueId];
_responseCallbacks[callbackId] = [responseCallback copy];
message[@&callbackId&] = callbackId;
if (handlerName) {
message[@&handlerName&] = handlerN
[self _queueMessage:message];
到_queueMessage:之后流程就和上面一样了,这里面native也有个:
NSString* responseId = message[@&responseId&];
if (responseId) {
WVJBResponseCallback responseCallback = _responseCallbacks[responseId];
responseCallback(message[@&responseData&]);
[_responseCallbacks removeObjectForKey:responseId];
这个和js中的处理思想是一样的。
总结:native将方法名、参数、回到的id放到一个对象中传给js。
js根据方法名字调用相应方法,之后将返回数据和responseId拼装,最后通过src 重定向到UIWebview 的delegate。
native得到数据后根据responseId调用事先装入_responseCallbacks的block,动态读取调用,从而完成交互。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)iOS-js与iOS的交互(基于WKWebViewJavascriptBridge第三方) - 简书
iOS-js与iOS的交互(基于WKWebViewJavascriptBridge第三方)
后天就要去北京出差了,据说那边的项目主要是与网页交互,所以就简单的研究了一下js与iOS的交互。其交互方式有很多种一、native(app)通过UIWebView的代理方法拦截url scheme判断是否是我们需要拦截处理的url及其所对应的要处理的逻辑(可以实现对网页的返回、前景、刷新),比较通用和简单。self.webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];self.webView.delegate =[self.webView setUserInteractionEnabled:YES];//是否支持交互[self.webView setOpaque:NO];//opaque是不透明的意思[self.webView setScalesPageToFit:YES];//自动缩放以适应屏幕[self.view addSubview:self.webView];if (sender.tag == 101) {// 返回(点击页面才会有返回)[self.mWebView goBack];}else if (sender.tag == 102) {// 前进(点击过的页面)[self.mWebView goForward];}else {// 刷新页面[self.mWebView reload];}二、iOS7之后出了JavaScriptCore.framework用于与JS交互,通过JSContext调用JS代码的方法:1、直接调用JS代码2、在ObjC中通过JSContext注入模型,然后调用模型的方法通过evaluateScript:方法就可以执行JS代码三、React Native (不是很了解,只知道是Facebook的,能编译很多的语音,兼容性很强,可移植也很强,有很多很好的原生控件,有兴趣的朋友可以了解一下)四、WebViewJavascriptBridge(第三方)是基于方式一封装的(主要是两个回调函数)。在iOS端:1.self.bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];链接iOS与js,self.webView就是展示你用来显示需要交换页面的UIWebView2.[self.bridge registerHandler:@"testJavascriptHandler" handler:^(id data, WVJBResponseCallback responseCallback) {NSLog(@"ObjC Echo called with: %@", data);// 反馈给JSresponseCallback(data);}];// 在JS中如果调用了bridge.send(),那么将触发OC端_bridge初始化方法中的回调。// 在JS中调用了bridge.callHandler('testJavascriptHandler'),它将触发OC端注册的同名方法// oc 同理// JS主动调用OjbC的方法// 这是JS会调用ObjC Echo方法,这是OC注册给JS调用的// JS需要回调,当然JS也可以传参数过来。data就是JS所传的参数,不一定需要传// OC端通过responseCallback回调JS端,JS就可以得到所需要的数据3.[self.bridge callHandler:@"sayHello" data:@{@"hello": @"你好"} responseCallback:^(id responseData) {NSLog(@"回调结果: %@", responseData);}];直接调用JS端注册的HandleName,一定注意此次的名字一定要与js端的相同。js调用时也一样在JS端:1.Copy and paste setupWebViewJavascriptBridge into your JS:(此段代码为固定格式,直接放在js端就行)function setupWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }window.WVJBCallbacks = [callback];var WVJBIframe = document.createElement('iframe');WVJBIframe.style.display = 'none';WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';document.documentElement.appendChild(WVJBIframe);setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)}后面几步与iOS端一样如有错误,望请指出。
在代码中寻找成就感
前言:iOS 开发中,h5 和原生实现通信有多种方式, JSBridge 就是最常用的一种,各 JSBridge 类库的实现原理大同小异,这篇文章主要是针对当前使用最为广泛的 WebViewJavascriptBridge(v6.0.2),从功能 API、实现原理到源码解读...
1 原理 在写 JavaScript 的时候,可以使用一个叫做 window 的对象,像是我们想要从现在的网页跳到另外一个网页的时候,就会去修改 window.location.href 的位置;在我们的 Objective-C 程序码中,如果我们可以取得指定的 WebVi...
WebViewJavascriptBridge 是一个封装处理好的第三方库.功能非常强大.下面就简单介绍一下如何使用这个WebViewJavascriptBridge库,以供大家交流探讨和学习. 在学习前 先去github 下载这个库 ,下载: https://github...
事情的起因还是因为项目需求驱动。折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾。 我要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写...
一、JS给OC传值 1. 技术方案:使用JavaScriptCore.framework框架 2. 使用场景: 网页中代码中的某个方法,比如点击事件方法,将该方法的参数传值给OC,供OC使用。 3. 代码实现如下: 拖入JavaScriptCore.framework静态库...
这世界上最“难搞”的关系我觉得应该非婆媳关系莫属了。(以下都属于个人言论) 婆婆不同于自己的亲妈,她是处于一个亲人和非亲人之间的关系。说是亲人是因为按道理来说你嫁给你老公了,他妈妈就是你妈妈。可是她又不同于自己的亲妈,因为我们不可能在婆婆面前耍一些小性子,发大小姐脾气,继续...
【每天一问QQ】:QQ,妈妈问你知道什么是无聊吗? QQ说:就是QQ吃豌豆 哈哈哈哈对,你是有多无聊没事儿就吃豌豆,还有谁无聊? QQ说:爸爸打游戏 点赞,说到点上了,这才是真正的无聊。 第二百七十三个英语单词:豌豆 peas 汉字:豌 QQ今天做的事情:套垃圾袋、整理书籍
伟星管产品的保障服务解决了业主担心的痛点,双层保险,让他的产品销售直线上升。 这就是把传统的售后服务提高一个新的层次!服务性产品。把服务变成了产品! 感想:装修之前你要考虑到如何把服务提前,而不是装修完之后出现问题才去服务。
昨天,和一位业主讨好装修事情,有一项是卫...
1、创意其实是可以学习的。创意不是一种技巧,创意的功夫,在创意之外。创意是人生资源的积累和能量的开发。所以如何创作出优秀的创意,首先要学习如何创造性地生活。只有掌握生活的技巧,不断丰富和深化人生的质量,才能在需要的时候,使能量瞬间迸发,从而产生优秀的创意。 2、创意的技巧是...
《雅各书》是《圣经》新约的一卷书,本卷书共5章。本书写成时间大约在62年左右,应是新约中保罗书信之外的书信中最早写成的书卷。记载了信心跟行为是同等重要,因为“身体没有灵魂是死的,信心没有行为也是死的”。 圣经的记载也表明复活了的耶稣曾向雅各显现,这使雅各确信同母异父的哥哥耶...

我要回帖

更多关于 wkwebviewbridge 的文章

 

随机推荐