1. http://blog.csdn.net/chenyong05314/article/details/53735215

2. http://www.jianshu.com/p/6ba2507445e4

js的代码如下:

<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, maximum-scale=2, minimum-scale=1, user-scalable=no">
<title>首页</title>
<style type="text/css">
*{
margin:0;
padding: 0;
}
body,html{
height: 100%;
width: 100%;
}
section{
height: 100%;
width: 100%;
text-align:center;
}
.div{
float: left;
position: relative;
left: 50%;
top: 30%;
margin-left: -113px;
margin-top: -20px;
}
</style>
<script>
// $解析器
function $ (ele) {
return document.querySelector(ele);
}; // 点击确定按钮
function onClickButton() {
// 复杂数据
var list = [1,2,3];
var dict = {"name":"阳君", "qq":"937447974", "data":input.value, "list":list};
alert(dict);
// JS通知WKWebView
//window.webkit.messageHandlers.jsCallOC.postMessage(dict); 注意:内容不能未空
//服务器的格式:window.webkit.messageHandlers.名字.postMessage(内容);
window.webkit.messageHandlers.WXPay.postMessage("111111");
window.webkit.messageHandlers.WXPayzhuzhu.postMessage(dict);
window.webkit.messageHandlers.DictionaryFunTest111.postMessage("3333");
} function onClickButtonZhuZHuTest() {
// 复杂数据
var list = [1,2,3];
var dict = {"name":"阳君", "qq":"937447974", "data":input.value, "list":list};
alert(dict); window.webkit.messageHandlers.WXPay.postMessage("111111");
window.webkit.messageHandlers.WXPayzhuzhu.postMessage(dict);
window.webkit.messageHandlers.DictionaryFunTest111.postMessage("3333");
} function DictionaryFunTest() {
alert("hahaha");
window.webkit.messageHandlers.WXPay.postMessage("111111");
window.webkit.messageHandlers.DictionaryFunTest111.postMessage("3333");
} // WKWebView调用JS
function ocCallJS(params) {
show.innerHTML = "111111122222";
alert("55555555");
} function zhuzhuCallTest() {
alert("55555");
} // alert对话框
function ale1() {
alert("这是一个警告对话框!");
} // confirm选择框
function firm() {
if(confirm("去百度看看?")) {
alert("你选择了去!");
} else {
alert("你选择了不去!");
}
} // prompt输入框
function prom() {
var result = prompt("演示一个带输入的对话框", "这里输入你的信息");
if(result) {
alert("谢谢使用,你输入的是:" + result)
}
} //调用格式: post('URL', {"key": "value"});
function post(path) {
alert("谢谢使用,你输入的是:" );
var method = "post";
var form = document.createElement("form");
form.setAttribute("method", method);
form.setAttribute("action", path); for(var key in params) {
if(params.hasOwnProperty(key)) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", key);
hiddenField.setAttribute("value", params[key]); form.appendChild(hiddenField);
}
}
document.body.appendChild(form);
form.submit();
} function postZhuDicTest(params) {
alert("测试成功");
} </script>
</head> <body >
<section>
<div class="div">
<input type="text" id="input" style="width:150px;line-height:30px">
<a style="margin-left:10px;width:50px;line-height:30px;display:inline-block;background-color:blue;color:#fff;text-align:center;" id="button11" >确定</a>
<br>
<span id="show" style="display:inline-block;width:100%;text-align:left;font-size:18px;font-family:'微软雅黑';color:#000;margin-top:20px;" ></span>
<br><br>
<input type="submit" value="警告框" onclick="ale1()" />
<input type="submit" value="选择框" style="margin-left:20px;" onclick="firm()" />
<input type="submit" value="输入框" style="margin-left:20px;" onclick="prom()" />
<a style="margin-left:10px;width:50px;line-height:30px;display:inline-block;background-color:blue;color:#fff;text-align:center;" id="button22" >从OC返回字典</a>
</div>
</section>
<script type="text/javascript">
// 界面渲染完毕执行
var input = $('#input'),
button = $('#button11'),
show = $('#show');
// 按钮监听
button.addEventListener('click', onClickButton); button22 = $('#button22'),
button22.addEventListener('click',onClickButtonZhuZHuTest ) </script>
</body>
</html>

oc中实现WKWebView的代码如下:

//
// WKWebViewController.m
// WKWebViewOC
//
// Created by XiaoFeng on 2016/11/24.
// Copyright © 2016年 XiaoFeng. All rights reserved.
// QQ群: 384089763 欢迎加入
// github链接: https://github.com/XFIOSXiaoFeng/WKWebView /**
参照一下的1-9个步骤就差不多了
*/ #import "WKWebViewController.h" #import <WebKit/WKWebView.h>
#import <WebKit/WebKit.h> #import <JavaScriptCore/JavaScriptCore.h> typedef enum{
loadWebURLString = 0,
loadWebHTMLString,
POSTWebURLString,
}wkWebLoadType; static void *WkwebBrowserContext = &WkwebBrowserContext; @interface WKWebViewController ()<WKNavigationDelegate,WKUIDelegate,WKScriptMessageHandler,UINavigationControllerDelegate,UINavigationBarDelegate> @property (nonatomic, strong) WKWebView *wkWebView;
//设置加载进度条
@property (nonatomic,strong) UIProgressView *progressView;
//仅当第一次的时候加载本地JS
@property(nonatomic,assign) BOOL needLoadJSPOST;
//网页加载的类型
@property(nonatomic,assign) wkWebLoadType loadType;
//保存的网址链接
@property (nonatomic, copy) NSString *URLString;
//保存POST请求体
@property (nonatomic, copy) NSString *postData;
//保存请求链接
@property (nonatomic)NSMutableArray* snapShotsArray;
//返回按钮
@property (nonatomic)UIBarButtonItem* customBackBarItem;
//关闭按钮
@property (nonatomic)UIBarButtonItem* closeButtonItem; @end @implementation WKWebViewController - (void)viewDidLoad {
[super viewDidLoad]; //加载web页面
[self webViewloadURLType]; //添加到主控制器上
[self.view addSubview:self.wkWebView]; //添加进度条
[self.view addSubview:self.progressView]; //添加右边刷新按钮
UIBarButtonItem *roadLoad = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(roadLoadClicked)];
self.navigationItem.rightBarButtonItem = roadLoad;
} - (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated]; if (_isNavHidden == YES) {
self.navigationController.navigationBarHidden = YES;
//创建一个高20的假状态栏
UIView *statusBarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 20)];
//设置成绿色
statusBarView.backgroundColor=[UIColor whiteColor];
// 添加到 navigationBar 上
[self.view addSubview:statusBarView];
}else{
self.navigationController.navigationBarHidden = NO;
}
} - (void)roadLoadClicked{
[self.wkWebView reload];
} -(void)customBackItemClicked{
if (self.wkWebView.goBack) {
[self.wkWebView goBack];
}else{
[self.navigationController popViewControllerAnimated:YES];
}
}
-(void)closeItemClicked{
[self.navigationController popViewControllerAnimated:YES];
} #pragma mark ================ 懒加载 ================ - (WKWebView *)wkWebView{
if (!_wkWebView) {
#pragma mark - 1.初始化并配置 webview
//设置网页的配置文件
WKWebViewConfiguration * Configuration = [[WKWebViewConfiguration alloc]init];
//允许视频播放
Configuration.allowsAirPlayForMediaPlayback = YES;
// 允许在线播放
Configuration.allowsInlineMediaPlayback = YES;
// 允许可以与网页交互,选择视图
Configuration.selectionGranularity = YES;
// web内容处理池
Configuration.processPool = [[WKProcessPool alloc] init];
#pragma mark - 2.自定义配置,便于js调用oc的方法;注意:oc与js的交互,有个js与oc的回调,就添加几个消息处理
//自定义配置,一般用于 js调用oc方法(OC拦截URL中的数据做自定义操作)
WKUserContentController * UserContentController = [[WKUserContentController alloc]init];
// 添加消息处理,注意:self指代的对象需要遵守WKScriptMessageHandler协议,结束时需要移除
[UserContentController addScriptMessageHandler:self name:@"WXPay"];
[UserContentController addScriptMessageHandler:self name:@"WXPayzhuzhu"];
[UserContentController addScriptMessageHandler:self name:@"DictionaryFunTest111"]; // 是否支持记忆读取
Configuration.suppressesIncrementalRendering = YES;
// 允许用户更改网页的设置
Configuration.userContentController = UserContentController;
_wkWebView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:Configuration];
_wkWebView.backgroundColor = [UIColor colorWithRed:240.0/255 green:240.0/255 blue:240.0/255 alpha:1.0]; #pragma mark - 3.设置代理:navigation代理和UIdelegate的代理
// 设置代理
_wkWebView.navigationDelegate = self;
_wkWebView.UIDelegate = self; #pragma mark - 添加kvo监听:可添加监听的有,title estimatedProgress loding 等等,从wkwebview.h 中查看
//kvo 添加进度监控
[_wkWebView addObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress)) options:0 context:WkwebBrowserContext];
//开启手势触摸
_wkWebView.allowsBackForwardNavigationGestures = YES;
// 设置 可以前进 和 后退
//适应你设定的尺寸
[_wkWebView sizeToFit];
}
return _wkWebView;
} -(void)viewWillDisappear:(BOOL)animated{
#pragma mark - 4.注销js添加消息的标识
[self.wkWebView.configuration.userContentController removeScriptMessageHandlerForName:@"WXPay"];
[self.wkWebView.configuration.userContentController removeScriptMessageHandlerForName:@"WXPayzhuzhu"];
[self.wkWebView.configuration.userContentController removeScriptMessageHandlerForName:@"DictionaryFunTest111"];
[self.wkWebView setNavigationDelegate:nil];
[self.wkWebView setUIDelegate:nil];
} #pragma mark ================ WKNavigationDelegate ================ #pragma mark - 5.实现navigationDelegate的代理方法
//这个是网页加载完成,导航的变化
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
/*
主意:这个方法是当网页的内容全部显示(网页内的所有图片必须都正常显示)的时候调用(不是出现的时候就调用),,否则不显示,或则部分显示时这个方法就不调用。
*/
// 判断是否需要加载(仅在第一次加载)
if (self.needLoadJSPOST) {
// 调用使用JS发送POST请求的方法
[self postRequestWithJS];
// 将Flag置为NO(后面就不需要加载了)
self.needLoadJSPOST = NO;
}
// 获取加载网页的标题
self.title = self.wkWebView.title; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
[self updateNavigationItems];
} //开始加载
-(void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{
//开始加载的时候,让加载进度条显示
self.progressView.hidden = NO;
} //内容返回时调用
-(void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{} //服务器请求跳转的时候调用
-(void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation{} //服务器开始请求的时候调用
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
// NSString* orderInfo = [[AlipaySDK defaultService]fetchOrderInfoFromH5PayUrl:[navigationAction.request.URL absoluteString]];
// if (orderInfo.length > 0) {
// [self payWithUrlOrder:orderInfo];
// }
// //拨打电话
// //兼容安卓的服务器写法:<a class = "mobile" href = "tel://电话号码"></a>
// NSString *mobileUrl = [[navigationAction.request URL] absoluteString];
// mobileUrl = [mobileUrl stringByRemovingPercentEncoding];
// NSArray *urlComps = [mobileUrl componentsSeparatedByString:@"://"];
// if ([urlComps count]){
//
// if ([[urlComps objectAtIndex:0] isEqualToString:@"tel"]) {
//
// UIAlertController *mobileAlert = [UIAlertController alertControllerWithTitle:nil message:[NSString stringWithFormat:@"拨号给 %@ ?",urlComps.lastObject] preferredStyle:UIAlertControllerStyleAlert];
// UIAlertAction *suerAction = [UIAlertAction actionWithTitle:@"拨号" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
//
// [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mobileUrl]];
// }];
// UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
// return ;
// }];
//
// [mobileAlert addAction:suerAction];
// [mobileAlert addAction:cancelAction];
//
// [self presentViewController:mobileAlert animated:YES completion:nil];
// }
// } switch (navigationAction.navigationType) {
case WKNavigationTypeLinkActivated: {
[self pushCurrentSnapshotViewWithRequest:navigationAction.request];
break;
}
case WKNavigationTypeFormSubmitted: {
[self pushCurrentSnapshotViewWithRequest:navigationAction.request];
break;
}
case WKNavigationTypeBackForward: {
break;
}
case WKNavigationTypeReload: {
break;
}
case WKNavigationTypeFormResubmitted: {
break;
}
case WKNavigationTypeOther: {
[self pushCurrentSnapshotViewWithRequest:navigationAction.request];
break;
}
default: {
break;
}
}
[self updateNavigationItems];
decisionHandler(WKNavigationActionPolicyAllow);
} // 内容加载失败时候调用
-(void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error{
NSLog(@"页面加载超时");
} //跳转失败的时候调用
-(void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error{} //进度条
-(void)webViewWebContentProcessDidTerminate:(WKWebView *)webView{} #pragma mark ================ WKUIDelegate ================ #pragma mark - 6.实现uidelegate的代理方法
/** 系统提供了3种提示框,UIDelegate负责与这三个提示框的交互:js的代码 */
// 获取js 里面的提示 --表示js调用了alert提示框 对应的js代码: alert("hahaha");
-(void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{ UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
completionHandler();
}]]; [self presentViewController:alert animated:YES completion:NULL];
} // js 信息的交流
/**
*对应js的代码如下:
if(confirm("去百度看看?")) {
alert("你选择了去!");
} else {
alert("你选择了不去!");
}
*/
-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
completionHandler(YES);
}]];
[alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
completionHandler(NO);
}]];
[self presentViewController:alert animated:YES completion:NULL];
} // 交互。可输入的文本。
/**
* 对应js的代码如下:
// prompt输入框
function prom() {
var result = prompt("演示一个带输入的对话框", "这里输入你的信息");
if(result) {
alert("谢谢使用,你输入的是:" + result)
}
}
*/
-(void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{ UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"textinput" message:prompt preferredStyle:UIAlertControllerStyleAlert];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.textColor = [UIColor redColor];
}];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
completionHandler([[alert.textFields lastObject] text]);
}]]; [self presentViewController:alert animated:YES completion:NULL]; } #pragma mark ================ WKScriptMessageHandler ================ #pragma mark - 7.实现js调用oc的方法
//拦截执行网页中的JS方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{ //服务器固定格式写法 window.webkit.messageHandlers.名字.postMessage(内容); 注意:内容不能为空;名字在步骤2 中已添加了消息处理的配置
//客户端写法 message.name isEqualToString:@"名字"]
if ([message.name isEqualToString:@"WXPay"]) {
NSLog(@"%@WXPay", message.body);
//调用微信支付方法
// [self WXPayWithParam:message.body];
} if ([message.name isEqualToString:@"jsCallOC"]) {
NSLog(@"-----点击js的交互jsCallOC-----");
} if ([message.name isEqualToString:@"WXPayzhuzhu"]) {
NSLog(@"-----点击js的交互WXPayzhuzhu-----");
} if ([message.name isEqualToString:@"DictionaryFunTest111"]) {
NSLog(@"-----点击js的交互DictionaryFun-----"); #pragma mark - 8.实现oc调用js的方法 注意:现在只能实现 输入字符串或者不传参数的交互; 如果需要传字符串的参数的话,如下 NSString *jsStr = [NSString stringWithFormat:@"DictionaryFun('%@');", @"11111"];
/**
jsStr 表示调用js的那个方法
NSString *jscriptDic = [NSString stringWithFormat:@"postZhuDicTest('%@')",@"33333333"]; --带字符串参数的
*/
NSString *jsStr = [NSString stringWithFormat:@"DictionaryFun();"]; //调用js的DictionnaryFun() 这个方法
[self.wkWebView evaluateJavaScript:jsStr completionHandler:^(id object, NSError * _Nullable error) {
NSLog(@"-----postRequestWithJS-----");
}];
} } #pragma mark- 9.kvo的实现
#pragma mark - kvo的设置
//KVO监听进度条
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:NSStringFromSelector(@selector(estimatedProgress))] && object == self.wkWebView) {
[self.progressView setAlpha:1.0f];
BOOL animated = self.wkWebView.estimatedProgress > self.progressView.progress;
[self.progressView setProgress:self.wkWebView.estimatedProgress animated:animated]; // Once complete, fade out UIProgressView
if(self.wkWebView.estimatedProgress >= 1.0f) {
[UIView animateWithDuration:0.3f delay:0.3f options:UIViewAnimationOptionCurveEaseOut animations:^{
[self.progressView setAlpha:0.0f];
} completion:^(BOOL finished) {
[self.progressView setProgress:0.0f animated:NO];
}];
}
}
else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
} #pragma mark - 配置界面
-(UIBarButtonItem*)customBackBarItem{
if (!_customBackBarItem) {
UIImage* backItemImage = [[UIImage imageNamed:@"backItemImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImage* backItemHlImage = [[UIImage imageNamed:@"backItemImage-hl"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; UIButton* backButton = [[UIButton alloc] init];
[backButton setTitle:@"返回" forState:UIControlStateNormal];
[backButton setTitleColor:self.navigationController.navigationBar.tintColor forState:UIControlStateNormal];
[backButton setTitleColor:[self.navigationController.navigationBar.tintColor colorWithAlphaComponent:0.5] forState:UIControlStateHighlighted];
[backButton.titleLabel setFont:[UIFont systemFontOfSize:17]];
[backButton setImage:backItemImage forState:UIControlStateNormal];
[backButton setImage:backItemHlImage forState:UIControlStateHighlighted];
[backButton sizeToFit]; [backButton addTarget:self action:@selector(customBackItemClicked) forControlEvents:UIControlEventTouchUpInside];
_customBackBarItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}
return _customBackBarItem;
} - (UIProgressView *)progressView{
if (!_progressView) {
_progressView = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleDefault];
if (_isNavHidden == YES) {
_progressView.frame = CGRectMake(0, 20, self.view.bounds.size.width, 3);
}else{
_progressView.frame = CGRectMake(0, 64, self.view.bounds.size.width, 3);
}
// 设置进度条的色彩
[_progressView setTrackTintColor:[UIColor colorWithRed:240.0/255 green:240.0/255 blue:240.0/255 alpha:1.0]];
_progressView.progressTintColor = [UIColor greenColor];
}
return _progressView;
} -(UIBarButtonItem*)closeButtonItem{
if (!_closeButtonItem) {
_closeButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"关闭" style:UIBarButtonItemStylePlain target:self action:@selector(closeItemClicked)];
}
return _closeButtonItem;
} -(NSMutableArray*)snapShotsArray{
if (!_snapShotsArray) {
_snapShotsArray = [NSMutableArray array];
}
return _snapShotsArray;
}
#pragma mark ================ 加载方式 ================ - (void)webViewloadURLType{
self.needLoadJSPOST = YES;
//POST使用预先加载本地JS方法的html实现,请确认WKJSPOST存在
[self loadHostPathURL:@"WKJSPOST"];
// switch (self.loadType) {
// case loadWebURLString:{
// //创建一个NSURLRequest 的对象
// NSURLRequest * Request_zsj = [NSURLRequest requestWithURL:[NSURL URLWithString:self.URLString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
// //加载网页
// [self.wkWebView loadRequest:Request_zsj];
// break;
// }
// case loadWebHTMLString:{
// [self loadHostPathURL:self.URLString];
// break;
// }
// case POSTWebURLString:{
// // JS发送POST的Flag,为真的时候会调用JS的POST方法
// self.needLoadJSPOST = YES;
// //POST使用预先加载本地JS方法的html实现,请确认WKJSPOST存在
// [self loadHostPathURL:@"WKJSPOST"];
// break;
// }
// }
} - (void)loadHostPathURL:(NSString *)url{
//获取JS所在的路径
NSString *path = [[NSBundle mainBundle] pathForResource:url ofType:@"html"];
//获得html内容
NSString *html = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
//加载js
[self.wkWebView loadHTMLString:html baseURL:[[NSBundle mainBundle] bundleURL]]; } // 调用JS发送POST请求
- (void)postRequestWithJS {
// 拼装成调用JavaScript的字符串
// NSString *jscript = [NSString stringWithFormat:@"post('%@',{%@});", self.URLString, @{@"key":@"value"}];
NSString *jscript = [NSString stringWithFormat:@"post('%@');", self.URLString];
// 调用JS代码
NSDictionary *prams = @{@"key":@"value"};
NSString *jscriptDic = [NSString stringWithFormat:@"postZhuDicTest('%@')",@"33333333"];
NSString *jsStr = @"postZhuTest();";
[self.wkWebView evaluateJavaScript:jscriptDic completionHandler:^(id object, NSError * _Nullable error) {
NSLog(@"-----postRequestWithJS-----");
}];
} - (void)loadWebURLSring:(NSString *)string{
self.URLString = string;
self.loadType = loadWebURLString;
} - (void)loadWebHTMLSring:(NSString *)string{
self.URLString = string;
self.loadType = loadWebHTMLString;
} - (void)POSTWebURLSring:(NSString *)string postData:(NSString *)postData{
self.URLString = string;
self.postData = postData;
self.loadType = POSTWebURLString;
} //#pragma mark ============== URL pay 开始支付 ==============
//
//- (void)payWithUrlOrder:(NSString*)urlOrder
//{
// if (urlOrder.length > 0) {
// __weak XFWkwebView* wself = self;
// [[AlipaySDK defaultService] payUrlOrder:urlOrder fromScheme:@"giftcardios" callback:^(NSDictionary* result) {
// // 处理支付结果
// NSLog(@"===============%@", result);
// // isProcessUrlPay 代表 支付宝已经处理该URL
// if ([result[@"isProcessUrlPay"] boolValue]) {
// // returnUrl 代表 第三方App需要跳转的成功页URL
// NSString* urlStr = result[@"returnUrl"];
// [wself loadWithUrlStr:urlStr];
// }
// }];
// }
//}
//
//- (void)WXPayWithParam:(NSDictionary *)WXparam{
//
//}
////url支付成功回调地址
//- (void)loadWithUrlStr:(NSString*)urlStr
//{
// if (urlStr.length > 0) {
// dispatch_async(dispatch_get_main_queue(), ^{
// NSURLRequest *webRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:urlStr] cachePolicy:NSURLRequestReturnCacheDataElseLoad
// timeoutInterval:15];
// [self.wkWebView loadRequest:webRequest];
// });
// }
//} #pragma mark ================ 自定义返回/关闭按钮 ================ -(void)updateNavigationItems{
if (self.wkWebView.canGoBack) {
UIBarButtonItem *spaceButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
spaceButtonItem.width = -6.5; [self.navigationItem setLeftBarButtonItems:@[spaceButtonItem,self.customBackBarItem,self.closeButtonItem] animated:NO];
}else{
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
[self.navigationItem setLeftBarButtonItems:@[self.customBackBarItem]];
}
}
//请求链接处理
-(void)pushCurrentSnapshotViewWithRequest:(NSURLRequest*)request{
// NSLog(@"push with request %@",request);
NSURLRequest* lastRequest = (NSURLRequest*)[[self.snapShotsArray lastObject] objectForKey:@"request"]; //如果url是很奇怪的就不push
if ([request.URL.absoluteString isEqualToString:@"about:blank"]) {
// NSLog(@"about blank!! return");
return;
}
//如果url一样就不进行push
if ([lastRequest.URL.absoluteString isEqualToString:request.URL.absoluteString]) {
return;
}
UIView* currentSnapShotView = [self.wkWebView snapshotViewAfterScreenUpdates:YES];
[self.snapShotsArray addObject:
@{@"request":request,@"snapShotView":currentSnapShotView}];
} //注意,观察的移除
-(void)dealloc{
[self.wkWebView removeObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress))];
} @end

WKWebView的了解的更多相关文章

  1. WKWebView浅析

    原文链接:supermokey WKWebView 一个WKWebView对象展示交互的web内容,例如应用于app内的浏览器.你可以在你的App中使用WKWebView. 综述 Important: ...

  2. iOS网络3—UIWebView与WKWebView使用详解

    一.整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView.通过简单的测试即可发现UIWebView占用过多内存,且 ...

  3. WKWebView与JavaScript交互基础

    login.html 代码 <!DOCTYPE html> <html> <head> <title>使用JavaScript</title> ...

  4. IOS进阶之WKWebView

    前言 Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到 ...

  5. iOS 开发之路(WKWebView内嵌HTML5之图片上传) 五

    HTML5页面的图片上传功能在iOS端的实现. 首先,页面上用的是plupload组件,在wkwebview上存在两个坑需要修复才能正常使用. 问题:在webview上点击选择照片/相机拍摄,就会出现 ...

  6. WKWebView与JS交互,UIWebView+JavascriptCore和JS交互

    最近一直在做有关Swift和JavaScript交互的程序,所以有关UIWebView和WKWebView在使用上的差别在此总结下: UIWebView: (1)创建 var webView: UIW ...

  7. iOS WKWebView的javascript alert 不弹的解决方案

    - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiate ...

  8. 使用WKWebView遇到的坑

    苹果从iOS8开始推出了WKWebView,大有替换UIWebView的意思(尽管Xcode中还没给UIWebView标记过期版本),所以决定将项目进行适配,iOS8及以上版本,改用WKWebView ...

  9. [原创]WKWebview点击图片查看大图

    大家都知道,WKWebview是没有查看大图的属性或者方法的,所以只能通过js与之交互来实现这一功能,原理:通过js获取页面的图片,把它存放到数组,给图片添加点击事件,通过index显示大图就行了 其 ...

  10. WKWebView

    按错了...,原帖地址http://blog.csdn.net/cyforce/article/details/37657009 webkit使用WKWebView来代替IOS的UIWebView和O ...

随机推荐

  1. HTML的历史与历史遗留问题

    1. <style type="text/css"> 从前,HTML的设计者认为以后应该还会有其他样式,不过如今我们已经醒悟,事实表明,完全可以只使用<style ...

  2. Xilinx器件原语

    原语,其英文名为primitive,是FPGA厂商针对其器件特征开发的一系列常用模块的名称.原语是FPGA芯片中基本元件,代表FPGA中实际拥有的硬件逻辑单元,如LUT,D触发器,RAM等.相当于软件 ...

  3. ios项目中引用其他开源项目

    1. 将开源项目的.xcodeproj拖入项目frameworks 2. Build Phases下 Links Binary With Libraries 引入.a文件.Target Depende ...

  4. SVN与TFS自动同步脚本(很实用)

    一直都在园子里看文章,因为各种原因懒得写文章.最近稍得空闲,把这几天的工作成果分享一下. 因为工作需要,开发人员使用Qt进行系统移动端的开发,Qt的版本控制却不提供连接TFS的设置,只有使用svn.没 ...

  5. 图解GitHub

    转自:http://marklodato.github.io/visual-git-guide/index-zh-cn.html 个人觉得这一篇比一些入门教程更值得看,图解很详细到位,很容易理解其工作 ...

  6. Redis学习笔记(二)字符串进阶

    1.增减操作 字符串可以储存字节串.整数.浮点数三种类型的值,如果值无法被解释为十进制的整数或浮点数,那么对此值进行增减操作会返回错误,如果对一个不存在的或者保存了空串的键进行增减操作,Redis将当 ...

  7. AS400服务程序总结

    1.服务程序的创建和调用过程 1.1生成module 1.2编写BND文件确定输出接口 1.3生成服务程序 1.3.运行调用程序时,将服务程序导入到作业内存区active group,常驻内存 2.结 ...

  8. docker 搭建 Java Web 运行环境

    安装环境:jdk,tomcat,mysql,nginx

  9. Metinfo 5.3.19管理员密码重置漏洞复现

     Metinfo 5.3.19管理员密码重置漏洞 操作系统:Windows 10专业版   kali linux  网站环境:UPUPW 5.3 使用工具:burpsuite 1.7 beta 漏洞分 ...

  10. CreateProcess Access violation(越界访问)

    https://stackoverflow.com/questions/11339186/createprocess-fails-with-an-access-violation My aim is ...