ios webview html交互,IOS中UIWebView、WKWebView之JS交互

做客户端开发,肯定避免不了JS交互,于是自己对苹果接口做了个简易封装:

JSExport-->UIWebView+Interaction、WKScriptMessageHandler -->WKWebView+Interaction以备以后使用。

旧方式

旧的交互方式有通过UIWebViewDelegate实现的:JS与客户端定义好跳转页面参数,在将要跳转时捕获关键字,然后处理业务。

iOS端:

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

NSString *urlString = [[request URL] absoluteString];

if ([urlString isEqualToString:@"objc://loading"]) {

if (_gotoRootViewController) {

_gotoRootViewController();

}

}

return YES;

}

JS端:

test

这是交互按钮

UIWebView+JSExport方式

导入JavaScriptCore.framework,并导入我的扩展类#import "UIWebView+Interaction.h"。

使用方式

OC调JS:

[_webView InterActionToJs:@"alertMobile('15625298071')"];

JS调OC:

- (void)webViewDidFinishLoad:(UIWebView *)webView {

[self.webView InterActionToOc:^(InterActionOcType functionType, NSDictionary *param) {

switch (functionType) {

case InterActionOcType_alert:

{

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:param[@"title"] message:param[@"content"] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil];

[alert show];

}

break;

case InterActionOcType_present:

{

self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

Class Cls = NSClassFromString(param[@"toController"]);

BOOL isAnimate = [param[@"animate"] boolValue];

UIViewController *ctl = [[Cls alloc] init];

[self presentViewController:ctl animated:isAnimate completion:nil];

}

break;

default:

break;

}

}];

}

添加动作

//自定义添加功能类型

typedef NS_ENUM(NSUInteger, InterActionOcType) {

InterActionOcType_alert = 0,

InterActionOcType_present,

InterActionOcType_xxxxxxx, //有啥需求就和这里添加

};

并且对应的html中添加JS,参数封装为字典形式。例:

function myPresent(ctl) {

var param = new Array();

param["animate"] = 1;

param["toController"] = "SecondViewController";

WebViewInteraction.callBack(1, param);

}

其中callBack是通过这个JSExport实现的

@protocol WebViewJSExport

JSExportAs

(callBack /** callBack 作为js方法的别名 */,

- (void)awakeOC:(InterActionOcType)type param:(NSDictionary *)param

);

@end

WKWebView+WKScriptMessageHandler方式

导入WebKit.framework,并导入我的扩展类#import "WKWebView+Interaction.h"。

使用方式

OC调JS:

[self.wkWebView InterActionToJs:@"JSReloadTitle('你点了刷新JS按钮,我没猜错!')"];

JS调OC:

//注册交互类型

[self.wkWebView registerScriptTypes:@{@"OCDismiss" : @(WKInterActionOcType_dismiss),

@"OCShowAlert" : @(WKInterActionOcType_alert)}];

[self.wkWebView InterActionToOc:^(WKInterActionOcType functionType, NSDictionary *param) {

switch (functionType) {

case WKInterActionOcType_dismiss:

{

BOOL isAnimate = [param[@"animate"] boolValue];

[self dismissViewControllerAnimated:isAnimate completion:nil];

}

break;

case WKInterActionOcType_alert:

{

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"JS去做平方" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];

alert.alertViewStyle = UIAlertViewStylePlainTextInput;

[alert show];

}

break;

default:

break;

}

}];

添加动作

//自定义添加功能类型

typedef NS_ENUM(NSUInteger, WKInterActionOcType) {

WKInterActionOcType_alert = 0,

WKInterActionOcType_dismiss,

WKInterActionOcType_xxxxxxx, //有啥需求就和这里添加

};

并且对应的html中添加JS,参数封装为字典形式。例:

//js调oc

function myDismiss() {

window.webkit.messageHandlers.OCDismiss.postMessage({"animate" : 1}); //这里的OCDismiss对应注册类型

}

其中callBack是通过WKScriptMessageHandler实现的

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {

dispatch_async(dispatch_get_main_queue(), ^{

NSString *name = message.name;

NSDictionary *value = message.body;

WKInterActionOcType type = [self.typeDict[name] integerValue];

if (self.block) {

self.block(type, value);

}

});

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值