iOS 与 js交互的其一方法 WebViewJavascriptBridge的使用
#import <WebViewJavascriptBridge.h>
///
@interface ZWBridgeViewController ()<WKNavigationDelegate, WKUIDelegate, UIGestureRecognizerDelegate>
@property (nonatomic, strong) ZWCommonNavBar *navBar;
@property (nonatomic, strong) WKWebView *webView;
@property (nonatomic, strong) WebViewJavascriptBridge *bridge;
@property (nonatomic, copy) NSString *urlStr;
@property (nonatomic, copy) NSString *webTitle;
@end
@implementation ZWBridgeViewController
- (instancetype)initWithParams:(NSDictionary *)params {
self = [super init];
if (self) {
}
return self;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[SVProgressHUD dismiss];
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
}
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return NO;
}
- (void)viewDidLoad {
[super viewDidLoad];
[SVProgressHUD show];
NSLog(@"%@",self.urlStr);
[self configNavBar];
[self configWebView];
[self configBridge];
[self configBridgeRegister];
[self configBridgeCallHander];
}
- (void)configNavBar {
self.titlle = ""
}
- (void)configWebView {
NSURL *url = [NSURL URLWithString:self.urlStr];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
}
- (void)configBridge {
// 开启日志
[WebViewJavascriptBridge enableLogging];
self.bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];
[self.bridge setWebViewDelegate:self];
}
#pragma mark JS Call OC
- (void)configBridgeRegister {
kWeakSelf(self);
// 商品详情
[self.bridge registerHandler:@"func" handler:^(id data, WVJBResponseCallback responseCallback) {
NSDictionary *params = data;
NSDictionary *dic = @{
@"goodsId" : @([params[@"productId"] integerValue])
};
UIViewController *vc =
[weakself.navigationController pushViewController:vc animated:YES];
}];
[self.bridge registerHandler:@"nativeHomePage" handler:^(id data, WVJBResponseCallback responseCallback) {
[weakself zw_toHomeRootViewController];
}];
[self.bridge registerHandler:@"nativeGoback" handler:^(id data, WVJBResponseCallback responseCallback) {
[weakself.navigationController popviewcontroller]
}];
[self.bridge registerHandler:@"nativeOrderList" handler:^(id data, WVJBResponseCallback responseCallback) {
NSDictionary *params = @{
@"index" : @(0)
};
UIViewController *vc = [[CTMediator sharedInstance] ymd_mediator_MyOrderViewControllerWithParams:params];
[weakself.navigationController pushViewController:vc animated:YES];
BOOL closePage = [data[@"closePage"] integerValue];
if (closePage) {
NSMutableArray *mArray = [NSMutableArray arrayWithArray: weakself.navigationController.viewControllers];
[mArray removeObjectAtIndex: weakself.navigationController.viewControllers.count - 2];
weakself.navigationController.viewControllers = [NSArray arrayWithArray: mArray];
}
}];
[self.bridge registerHandler:@"nativeOrderListDetail" handler:^(id data, WVJBResponseCallback responseCallback) {
NSDictionary *resultData = data[@"resultData"];
NSDictionary *dic = @{
@"orderId" : @([resultData[@"orderId"] integerValue])
};
UIViewController *vc = [[CTMediator sharedInstance] ymd_mediator_MyOrderDetailViewControllerWithParams:dic];
[self.navigationController pushViewController:vc animated:YES];
BOOL closePage = [data[@"closePage"] integerValue];
if (closePage) {
NSMutableArray *mArray = [NSMutableArray arrayWithArray: weakself.navigationController.viewControllers];
[mArray removeObjectAtIndex: weakself.navigationController.viewControllers.count - 2];
weakself.navigationController.viewControllers = [NSArray arrayWithArray: mArray];
}
}];
[self.bridge registerHandler:@"nativeShare" handler:^(id data, WVJBResponseCallback responseCallback) {
NSDictionary *resultData = data[@"resultData"];
ZWFreeOrderShareVC *vc = [[ZWFreeOrderShareVC alloc] init];
vc.shareModel = shareModel;
[self.navigationcontroller push:vc animate:ture]
}];
[self.bridge registerHandler:@"nativeDominosDetail" handler:^(id data, WVJBResponseCallback responseCallback) {
NSDictionary *resultData = data[@"resultData"];
// NSDictionary *relayParams = @{
// @"dominosId" : @([resultData[@"dominosId"] integerValue]),
// @"dominosOrderId" : @([resultData[@"dominosOrderId"] integerValue]),
// @"type" : @(1)
// };
NSDictionary *userInfo = @{
@"dominosOrderId" : @([resultData[@"dominosOrderId"] integerValue]),
};
[[NSNotificationCenter defaultCenter] postNotificationName:kZWFreeOderSuccessNotification object:nil userInfo:userInfo];
NSMutableArray *mArray = [NSMutableArray arrayWithArray: self.navigationController.viewControllers];
[mArray removeObjectAtIndex: self.navigationController.viewControllers.count - 1];
self.navigationController.viewControllers = [NSArray arrayWithArray: mArray];
//[self.navigationcontroller push:vc animate:ture]
}];
}
#pragma mark OC Call JS
- (void)configBridgeCallHander {
[self.bridge callHandler:@"ocCallJs" data:@{@"name": @"James call"} responseCallback:^(id responseData) {
}];
}
#pragma mark WKNavigationDelegate
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
[webView evaluateJavaScript:@"document.documentElement.style.webkitUserSelect='none';" completionHandler:nil];
[webView evaluateJavaScript:@"document.documentElement.style.webkitTouchCallout='none';" completionHandler:nil];
[SVProgressHUD dismiss];
}
#pragma mark KVO
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:@"title"]) {
if (object == self.webView) {
self.navBar.title = self.webView.title;
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
#pragma mark Lazy
- (WKWebView *)webView {
if (!_webView) {
_webView = [[WKWebView alloc] init];
_webView.navigationDelegate = self;
_webView.UIDelegate = self;
[_webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];
[self.view addSubview:_webView];
[_webView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(UIEdgeInsetsMake(k_Height_NavBar, 0, 0, 0));
}];
}
return _webView;
}
iOS 与 js交互的其一方法 WebViewJavascriptBridge的使用的更多相关文章
- iOS与JS交互实战篇(ObjC版)
前言 ObjectiveC与Js交互是常见的需求,可对于新手或者所谓的高手而言,其实并不是那么简单明了.这里只介绍iOS7.0后出来的JavaScriptCore framework. 关于JavaS ...
- iOS javascript js 交互
//JS里的一个回调.比如网页上的某个按钮点一下之后.JS会调用setKey这个方法. JSContext *context1 = [self.startView valueForKeyPath:@& ...
- ios与js交互获取webview元素和赋值
使用webview的stringByEvaluatingJavaScriptFromString的方法交互,直接提供实例. 下载:http://download.csdn.net/detail/hey ...
- iOS与JS交互-WKWebView
iOS移动端应用中,一般都会嵌入网页,在网页中处理的结果需要反馈给iOS让移动端做出相应的处理(例如页面跳转), 1.webview的配置 2.代理方法中拿到事件进行处理 二.JS中的配套出发事件 当 ...
- android与JS交互,互相调用方法,跳转到网页
在main下面New - Folder - Assets Folder,在Assets下面新建一个js_android.html <html><head> <meta h ...
- html与ios交互方法 WebViewJavascriptBridge
WebViewJavascriptBridge 1.html调用ios的方法 <!DOCTYPE html> <html lang="en"> <he ...
- iOS(WKWebView)OC与JS交互 之三
随着H5功能愈发的强大,没进行过混合开发的小伙们都不好意思说自己能够独立进行iOS的app开发,在iOS7操作系统下,常用的native,js交互框架有easy-js,WebViewJavascr ...
- iOS与JS开发交互总结
hybrid.jpg 前言 Web 页面中的 JS 与 iOS Native 如何交互是每个 iOS 猿必须掌握的技能.而说到 Native 与 JS 交互,就不得不提一嘴 Hybrid. Hybri ...
- OC与JS交互之UIWebView
随着H5的强大,hybrid app已经成为当前互联网的大方向,单纯的native app和web app在某些方面显得就很劣势.关于H5的发展史,这里有一篇文章推荐给大家,今天我们来学习最基础的基于 ...
随机推荐
- js控制日期的前或后N天,前或后一个月
/*获取指定日期前或者后指定间隔时间* sdate:指定日期* interval:时间间隔* caret:间隔符*/function getNowFormatDate(sdate,interval,c ...
- nginx知识学习
设备: macbook 有用的命令行: sudo nginx -t 测试nginx是否正常 sudo nginx -s reload 平滑重启 配置目录: /usr/local/etc/nginx ...
- 用fgets()和fputs()代替gets()和puts()
gets()和puts不安全,有些平台会报错,如pat. gets输入字符串时,不进行数组下标的检查,也就是说当你的数组长度是n时,输入超过该长度的字符串的时候,编译不会出错,但是运行的时候会出现数组 ...
- C语言究竟是一门怎样的语言?
对于大部分程序员,C语言是学习编程的第一门语言,很少有不了解C的程序员. C语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的,程序在 ...
- command failed: npm install --loglevel error --registry=https://registry.npm 用vue-cli 4.0 新建项目总是报错
昨天新买的本本,今天布环境,一安装vue-cli发现都4.0+的版本了,没管太多,就开始新建个项目感受哈,一切运行顺利,输入 "vue create app" 的时候,一切貌似进展 ...
- Pycharm调试django项目时发现断点失效
解决方法: 第一步: 第二步: 点击 Edit Configuration 第三步 : 点击 + 选择python 填写相关参数信息 或者 点击ok 完成配置 重启 IDE 注意 重启IDE ...
- python使用信号机制实例:
python使用信号机制实例: 程序会一直等待,直到其他程序发送CTRL-C信号给本进程.需要其他程序配合测试. 或者打开新的终端使用kill -sig PID 向一个进程发送信号,来测试. from ...
- SSM项目 以及 springboot 中引入swagger2的方法
swagger2是一个非常好用的接口文档,在开发的过程中方便前后端接口的交接. 下面我们就来讲讲在使用java时,分别在SSM框架,以及springboot+mybatis框架中引入swagger2的 ...
- openshift3.10集群部署
简介 openshift是基于k8s的开源容器云. 要求 系统环境:CentOS 7.5 搭建一个master节点,两个node节点 注意: openshift3 依赖docker的版本为1.13.1 ...
- 用Emmet写前端代码
Emmet插件:可以用 emmet代码+Tap 写出更多并快捷的html代码,主流编辑器均可安装,安装方法也均不相同! <!-- html:5或者!可以生成html5文档 --> < ...