1
|
(
BOOL
)
webView
:
(
UIWebView
*
)
webView
shouldStartLoadWithRequest
:
(
NSURLRequest
*
)
request
navigationType
:
(
UIWebViewNavigationType
)
navigationType
|
方法来做拦截,并在这个方法中,根据url来调用Objective-C方法
一.javascript调用Objective-C
方法1 直接改变当前页面的url 这种方法在电脑浏览器中会直接跳转,在手机中正常
javascript代码:
方法2 动态添加个iframe改变其地址 最后删除,这种方法不会使当前页面跳转 效果更佳
javascript代码:
Objective-C代码:
二.Objective-C调用javascript
(PS)如果你想去掉webview弹出的alert 中的来自XXX网页
1
|
(
BOOL
)
webView
:
(
UIWebView
*
)
webView
shouldStartLoadWithRequest
:
(
NSURLRequest
*
)
request
navigationType
:
(
UIWebViewNavigationType
)
navigationType
|
方法来做拦截,并在这个方法中,根据url来调用Objective-C方法
但是iOS7之后, iOS 7 引入了 JavaScriptCore.framework库,它把 WebKit 的 JavaScript 引擎用 Objective-C 封装,让JavaScript与Objective-C之间的通信变的非常简单。首先导入JavaScriptCore.framework框架, 然后
JS端:
1
|
TXBB_IOS_SDK.callPay(charge,
this
.success,
this
.cancel);
|
OC端:
.h中引入头文件,并实现协议和对应的方法
.m中在webViewDidFinishLoad中给context赋值,并把self指针给TXBB_IOS_SDK,JS端即可经过TXBB_IOS_SDK.callPay调用起Native方法
1
2
3
4
5
6
7
8
9
10
11
12
|
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
self.context = [webView valueForKeyPath:@
"documentView.webView.mainFrame.javaScriptContext"
];
self.context[@
"TXBB_IOS_SDK"
] = self;
}
#pragma mark - JSExport Methods
- (void)callPay:(NSString *)charge success:(NSString *) success cancel:(NSString *)cancel {
...
[Pingpp createPayment:charge appURLScheme:@
"msc"
withCompletion:completion];
}
|
Native -> Js
OC端调用JS代码则只需通过context调用evaluateScript方法即可,下列代码即会用JS显示Hello World,而在iOS7.0之前你可能通过[webView stringByEvaluatingJavaScriptFromString:@"document.title"]方法来获取WebView的title。
1
2
3
4
5
6
|
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
JSContext *context=[webView valueForKeyPath:@
"documentView.webView.mainFrame.javaScriptContext"
];
NSString *alertJs=@
"alert('Hello Word')"
;
[context evaluateScript:alertJs];
}
|
最后
JS和OC通信还有个非常著名的第三方库WebViewJavascriptBridge,如果你的项目需要支持iOS6之前的系统,你可以通过这个项目实现JS和OC的通信。
参考链接:
http://www.skyfox.org/javascript-ios-navive-message.html
http://www.cocoachina.com/ios/20150906/13320.html
1
|
(
BOOL
)
webView
:
(
UIWebView
*
)
webView
shouldStartLoadWithRequest
:
(
NSURLRequest
*
)
request
navigationType
:
(
UIWebViewNavigationType
)
navigationType
|
方法来做拦截,并在这个方法中,根据url来调用Objective-C方法