求助,WKWebviewjs获取当前页面url的URL

ios wkwebview白屏 iOS开发之WKWebView简单使用和常用使用场景 - 手机 - 云图网
<meta name="description" content="iOS开发之 WKWebVeiw使用
想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版。本着对新事物的好奇,就上网查了一下,但是找了好" />
ios wkwebview白屏 iOS开发之WKWebView简单使用和常用使用场景
iOS开发之 WKWebVeiw使用
想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版。本着对新事物的好奇,就上网查了一下,但是找了好多个都没说的多了详细,于是就问谷歌,找文档,看看使用方法,试用了一下,果然不错,记录下来,大家分享!
WKWebView的特点:
性能高,稳定性好,占用的内存比较小,
支持JS交互
支持HTML5 新特性
可以添加进度条(然并卵,不好用,还是习惯第三方的)。
支持内建手势,
据说高达60fps的刷新频率(不卡)
创建时候很简单
导入Wbkit这个类库(WKWebVeiw包含在里面的)
@interface ViewController : UIViewController&WKNavigationDelegate,WKUIDelegate,WKScriptMessageHandler&
3.创建个WebView的对象
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:webView];
WKWebView有两个委托
WKWebView代理有两个,是WKNavigationDelegate和WKUIDelegate,可以根据需要来决定用那些方法(当然使用之前不要忘了遵守协议)。
他们两个的代理方法有好多个,不过有的不常用就不写了,需要的自己点进去看一下就行啦。。。
1. WKNavigationDelegate来追踪加载过程
// 页面开始加载时调用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)
// 当内容开始返回时调用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)
// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)
// 页面加载失败时调用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)
WKNavigtionDelegate来进行页面跳转
// 接收到服务器跳转请求之后再执行
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)
// 在收到响应后,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionH
// 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionH
2. WKUIDelegate
//1.创建一个新的WebVeiw
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowF
//2.WebVeiw关闭(9.0中的新方法)
- (void)webViewDidClose:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0);
//3.显示一个JS的Alert(与JS交互)
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionH
//4.弹出一个输入框(与JS交互的)
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionH
//5.显示一个确认框(JS的)
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionH
暂时就用到了这么多,这个demo纯粹是为了初学试验的,具体复杂的使用方法等以后遇到了再说啊!!!!
这篇文章写得非常详细,大家也可以参考下
补充加载页面后自动关闭的问题
问题描述,我加载一web页面后,进行各种操作,比说我充值,什么的,然后想要在充值提出成功后自顶关闭这个web页面回到上一层或者返回到某一个界面,就用下面的方法,一般判断URL 包含的字符串都是后台给定的,在这里只需要判断就好了!
//**WKNavigationDelegate**里面的代理方法(上面有)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
//获取请求的url路径.
NSString *requestString = navigationResponse.response.URL.absoluteS
WKLog(@"requestString:%@",requestString);
// 遇到要做出改变的字符串
NSString *subStr = @"";
if ([requestString rangeOfString:subStr].location != NSNotFound) {
WKLog(@"这个字符串中有subStr");
//回调的URL中如果含有百度,就直接返回,也就是关闭了webView界面
[self.navigationController
popViewControllerAnimated:YES];
decisionHandler(WKNavigationResponsePolicyAllow);WKWebView的新特性与使用 | // TODO:WKWebView是在Apple的WWDC 2014随iOS 8和OS X 10.10出来的,是为了解决UIWebView加载速度慢、占用内存大的问题。使用UIWebView加载网页的时候,我们会发现内存会无限增长,还有内存泄漏的问题存在。WebKit中更新的WKWebView控件的新特性与使用方法,它很好的解决了UIWebView存在的内存、加载速度等诸多问题。
一、WKWebView新特性
在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存);允许JavaScript的Nitro库加载并使用(UIWebView中限制);支持了更多的HTML5特性;高达60fps的滚动刷新率以及内置手势;将UIWebViewDelegate与UIWebView重构成了14类与3个协议;
二、WebKit框架概览
如上图所示,WebKit框架中最核心的类应该属于WKWebView了,这个类专门用来渲染网页视图,其他类和协议都将基于它和服务于它。WKWebView:网页的渲染与展示,通过WKWebViewConfiguration可以进行自定义配置。WKWebViewConfiguration:这个类专门用来配置WKWebView。WKPreference:这个类用来进行相关webView设置。WKProcessPool:这个类用来配置进程池,与网页视图的资源共享有关。WKUserContentController:这个类主要用来做native与JavaScript的交互管理。WKUserScript:用于进行JavaScript注入。WKScriptMessageHandler:这个类专门用来处理JavaScript调用native的方法。WKNavigationDelegate:网页跳转间的导航管理协议,这个协议可以监听网页的活动。WKNavigationAction:网页某个活动的示例化对象。WKUIDelegate:用于交互处理JavaScript中的一些弹出框。WKBackForwardList:堆栈管理的网页列表。WKBackForwardListItem:每个网页节点对象。
三、WKWebView的属性
/// webView的自定义配置
@property (nonatomic, readonly, copy) WKWebViewConfiguration *
/// 导航代理
@property (nullable, nonatomic, weak) id &WKNavigationDelegate& navigationD
/// UI代理
@property (nullable, nonatomic, weak) id &WKUIDelegate& UID
/// 访问过网页历史列表
@property (nonatomic, readonly, strong) WKBackForwardList *backForwardL
/// 自定义初始化webView
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
/// url加载webView视图
- (nullable WKNavigation *)loadRequest:(NSURLRequest *)
/// 文件加载webView视图
- (nullable WKNavigation *)loadFileURL:(NSURL *)URL allowingReadAccessToURL:(NSURL *)readAccessURL API_AVAILABLE(macosx(<span style="color: #.11), ios(<span style="color: #.0));
/// HTMLString字符串加载webView视图
- (nullable WKNavigation *)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
/// NSData数据加载webView视图
- (nullable WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL API_AVAILABLE(macosx(<span style="color: #.11), ios(<span style="color: #.0));
/// 返回上一个网页节点
- (nullable WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)
/// 网页的标题
@property (nullable, nonatomic, readonly, copy) NSString *
/// 网页的URL地址
@property (nullable, nonatomic, readonly, copy) NSURL *URL;
/// 网页是否正在加载
@property (nonatomic, readonly, getter=isLoading) BOOL
/// 加载的进度 范围为[0, 1]
@property (nonatomic, readonly) double estimatedP
/// 网页链接是否安全
@property (nonatomic, readonly) BOOL hasOnlySecureC
/// 证书服务
@property (nonatomic, readonly, nullable) SecTrustRef serverTrust API_AVAILABLE(macosx(<span style="color: #.12), ios(<span style="color: #.0));
/// 是否可以返回
@property (nonatomic, readonly) BOOL canGoB
/// 是否可以前进
@property (nonatomic, readonly) BOOL canGoF
/// 返回到上一个网页
- (nullable WKNavigation *)goB
/// 前进到下一个网页
- (nullable WKNavigation *)goF
/// 重新加载
- (nullable WKNavigation *)
/// 忽略缓存 重新加载
- (nullable WKNavigation *)reloadFromO
/// 停止加载
- (void)stopL
/// 执行JavaScript
- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionH
/// 是否允许左右滑动,返回-前进操作
@property (nonatomic) BOOL allowsBackForwardNavigationG
/// 自定义代理字符串
@property (nullable, nonatomic, copy) NSString *customUserAgent API_AVAILABLE(macosx(<span style="color: #.11), ios(<span style="color: #.0));
/// 在iOS上默认为NO,标识不允许链接预览
@property (nonatomic) BOOL allowsLinkPreview API_AVAILABLE(macosx(<span style="color: #.11), ios(<span style="color: #.0));
/// 滚动视图
@property (nonatomic, readonly, strong) UIScrollView *scrollV
/// 是否支持放大手势,默认为NO
@property (nonatomic) BOOL allowsM
/// 放大因子,默认为1
@property (nonatomic) CGF
/// 据设置的缩放因子来缩放页面,并居中显示结果在指定的点
- (void)setMagnification:(CGFloat)magnification centeredAtPoint:(CGPoint)
/// 证书列表
@property (nonatomic, readonly, copy) NSArray *certificateChain API_DEPRECATED_WITH_REPLACEMENT("serverTrust", macosx(<span style="color: #.11, <span style="color: #.12), ios(<span style="color: #.0, <span style="color: #.0));
四、WKWebView的使用
简单使用,直接加载url地址
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"/reference/webkit"]]];
[self.view addSubview:webView];
自定义配置再WKWebView里面注册供JS调用的方法,是通过WKUserContentController类下面的方法:
- (void)addScriptMessageHandler:(id &WKScriptMessageHandler&)scriptMessageHandler name:(NSString *)
// 创建配置
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
// 创建UserContentController(提供JavaScript向webView发送消息的方法)
WKUserContentController* userContent = [[WKUserContentController alloc] init];
// 添加消息处理,注意:self指代的对象需要遵守WKScriptMessageHandler协议,结束时需要移除
[userContent addScriptMessageHandler:self name:@"NativeMethod"];
// 将UserConttentController设置到配置文件
config.userContentController = userC
// 高端的自定义配置创建WKWebView
WKWebView *webView = [[WKWebView alloc] initWithFrame:[UIScreen mainScreen].bounds configuration:config];
// 设置访问的URL
NSURL *url = [NSURL URLWithString:@"/reference/webkit"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
[self.view addSubview:webView];
实现WKScriptMessageHandler协议方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
  // 判断是否是调用原生的
if ([@"NativeMethod" isEqualToString:message.name]) {
   // 判断message的内容,然后做相应的操作
  if ([@"close" isEqualToString:message.body]) {
注意:上面将当前ViewController设置为MessageHandler之后需要在当前ViewController销毁前将其移除,否则会造成内存泄漏。
[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"NativeMethod"];
五、WKNavigationDelegate代理方法
如果实现了代理方法,一定要在decidePolicyForNavigationAction和decidePolicyForNavigationResponse方法中的回调设置允许跳转。
typedef NS_ENUM(NSInteger, WKNavigationActionPolicy) {WKNavigationActionPolicyCancel, // 取消跳转WKNavigationActionPolicyAllow, // 允许跳转} API_AVAILABLE(macosx(10.10), ios(8.0));
// 1 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSLog(@"<span style="color: #-------在发送请求之前,决定是否跳转
--&%@",navigationAction.request);
decisionHandler(WKNavigationActionPolicyAllow);
// 2 页面开始加载时调用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
NSLog(@"<span style="color: #-------页面开始加载时调用");
// 3 在收到响应后,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
/// 在收到服务器的响应头,根据response相关信息,决定是否跳转。decisionHandler必须调用,来决定是否跳转,参数WKNavigationActionPolicyCancel取消跳转,WKNavigationActionPolicyAllow允许跳转
NSLog(@"<span style="color: #-------在收到响应后,决定是否跳转");
decisionHandler(WKNavigationResponsePolicyAllow);
// 4 当内容开始返回时调用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
NSLog(@"<span style="color: #-------当内容开始返回时调用");
// 5 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
NSLog(@"<span style="color: #-------页面加载完成之后调用");
// 6 页面加载失败时调用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation {
NSLog(@"<span style="color: #-------页面加载失败时调用");
// 接收到服务器跳转请求之后调用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation {
NSLog(@"-------接收到服务器跳转请求之后调用");
// 数据加载发生错误时调用
- (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error {
NSLog(@"----数据加载发生错误时调用");
// 需要响应身份验证时调用 同样在block中需要传入用户身份凭证
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler {
//用户身份信息
NSLog(@"----需要响应身份验证时调用 同样在block中需要传入用户身份凭证");
NSURLCredential *newCred = [NSURLCredential credentialWithUser:@""
password:@""
persistence:NSURLCredentialPersistenceNone];
// 为 challenge 的发送方提供 credential
[[challenge sender] useCredential:newCred forAuthenticationChallenge:challenge];
completionHandler(NSURLSessionAuthChallengeUseCredential,newCred);
// 进程被终止时调用
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView {
NSLog(@"----------进程被终止时调用");
六、WKUIDelegate代理方法
web界面中有弹出警告框时调用
@param webView
实现该代理的webview
@param message
警告框中的内容
@param completionHandler 警告框消失调用
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionHandler {
NSLog(@"-------web界面中有弹出警告框时调用");
// 创建新的webView时调用的方法
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
NSLog(@"-----创建新的webView时调用的方法");
return webV
// 关闭webView时调用的方法
- (void)webViewDidClose:(WKWebView *)webView {
NSLog(@"----关闭webView时调用的方法");
// 下面这些方法是交互JavaScript的方法
// JavaScript调用confirm方法后回调的方法 confirm是js中的确定框,需要在block中把用户选择的情况传递进去
-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {
NSLog(@"%@",message);
completionHandler(YES);
// JavaScript调用prompt方法后回调的方法 prompt是js中的输入框 需要在block中把用户输入的信息传入
-(void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{
NSLog(@"%@",prompt);
completionHandler(@"<span style="color: #3");
// 默认预览元素调用
- (BOOL)webView:(WKWebView *)webView shouldPreviewElement:(WKPreviewElementInfo *)elementInfo {
NSLog(@"-----默认预览元素调用");
return YES;
// 返回一个视图控制器将导致视图控制器被显示为一个预览。返回nil将WebKit的默认预览的行为。
- (nullable UIViewController *)webView:(WKWebView *)webView previewingViewControllerForElement:(WKPreviewElementInfo *)elementInfo defaultActions:(NSArray&id &WKPreviewActionItem&& *)previewActions {
NSLog(@"----返回一个视图控制器将导致视图控制器被显示为一个预览。返回nil将WebKit的默认预览的行为。");
// 允许应用程序向它创建的视图控制器弹出
- (void)webView:(WKWebView *)webView commitPreviewingViewController:(UIViewController *)previewingViewController {
NSLog(@"----允许应用程序向它创建的视图控制器弹出");
// 显示一个文件上传面板。completionhandler完成处理程序调用后打开面板已被撤销。通过选择的网址,如果用户选择确定,否则为零。如果不实现此方法,Web视图将表现为如果用户选择了取消按钮。
- (void)webView:(WKWebView *)webView runOpenPanelWithParameters:(WKOpenPanelParameters *)parameters initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSArray&NSURL *& * _Nullable URLs))completionHandler {
NSLog(@"----显示一个文件上传面板");
阅读(...) 评论()问题:(swift)iOS WebView中如何实现点开链接获取当前URL并显示
描述:使用的是Swift,想知道有什么方法让地址栏自动显示当前URL。urlInput.text = self.wv.request?.URL?.absoluteString这串代码可以实现让地址栏显示当前URL,但是不知道有没有什么事件可以让每次跳转到新链接时,自动更改地址栏为当前URL解决方案1:UIWebViewDelegate- webView:shouldStartLoadWithRequest:navigationType:还有delegate中的其他几个方法也是可以拿来在这里对地址栏展示的URL做修改的。doc
以上介绍了“(swift)iOS WebView中如何实现点开链接获取当前URL并显示”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:/itwd/1087234.html
上一篇: 下一篇:Swift使用WKWebView在iOS应用中调用Web的方法详解
作者:全能酸奶
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Swift使用WKWebView在iOS应用中调用Web的方法详解,使用WKWebView便等于使用和Safari中相同的JavaScript解释器,用来替代过去的UIWebView,需要的朋友可以参考下
自从iOS8开始,Apple引入了WKWebView欲代替UIWebView。相比而言,WKWebView消耗内从更少,功能也更加强大。让我们来看看WKWebView怎么使用吧!
(1)首先需要引入WebKit库
#import &WebKit/WebKit.h&
(2)初始化方法分为以下两种
// 默认初始化
- (instancetype)initWithFrame:(CGRect)
// 根据对webview的相关配置,进行初始化
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
(3)加载网页与HTML代码的方式与UIWebView相同,代码如下:
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]]];
[self.view addSubview:webView];
1. WKWebView的代理方法
(1) WKNavigationDelegate
该代理提供的方法,可以用来追踪加载过程(页面开始加载、加载完成、加载失败)、决定是否执行跳转。
// 页面开始加载时调用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)
// 当内容开始返回时调用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)
// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)
// 页面加载失败时调用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)
页面跳转的代理方法有三种,分为(收到跳转与决定是否跳转两种)
// 接收到服务器跳转请求之后调用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)
// 在收到响应后,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionH
// 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionH
(2)WKUIDelegate
// 创建一个新的WebView
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowF
剩下三个代理方法全都是与界面弹出提示框相关的,针对于web界面的三种提示框(警告框、确认框、输入框)分别对应三种代理方法。下面只举了警告框的例子。
&*& web界面中有弹出警告框时调用
&*& @param webView&&&&&&&&&& 实现该代理的webview
&*& @param message&&&&&&&&&& 警告框中的内容
&*& @param frame&&&&&&&&&&&& 主窗口
&*& @param completionHandler 警告框消失调用
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionH
(3)WKScriptMessageHandler
这个协议中包含一个必须实现的方法,这个方法是提高App与web端交互的关键,它可以直接将接收到的JS脚本转为OC或Swift对象。(当然,在UIWebView也可以通过“曲线救国”的方式与web进行交互,著名的Cordova框架就是这种机制)
// 从web界面中接收到一个脚本时调用
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)
2.修改Info.plist
注意从iOS9开始,凡是涉及到网络操作的,都要在Info.plist中加入:
3.加载网页
先要在ViewController 导入WebKit:
import WebKit
var webview = WKWebView()
override func viewDidLoad() {
& super.viewDidLoad()
&&& //创建wkwebview
&&& let webview = WKWebView(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height))
&&& //创建网址
&&& let url = NSURL(string: "/users/0c/latest_articles")
&&& //创建请求
&&& let request = NSURLRequest(URL: url!)
&&& //加载请求
&&& webview.loadRequest(request)
&&& //添加wkwebview
&&& self.view.addSubview(webview)
运行效果如图:
4.获取网页标题
为了显示标题,首先给ViewController嵌入一个NavigationController。有了导航栏后,我们要调整一下webview的y轴位置,防止导航栏遮住网页上面部分,在viewDidLoad()里写上:
//获取导航栏高度
let navHeight = self.navigationController&#63;.navigationBar.frame.height
//获取状态栏高度
let statusHeight = UIApplication.sharedApplication().statusBarFrame.height
webview = WKWebView(frame: CGRectMake(0, statusHeight+navHeight!,self.view.frame.width, self.view.frame.height))
其次,这里要用到WKNavigationDelegate,所以在viewDidLoad()里加上
self.webview.navigationDelegate = self
注意网页标题要在网页加载完成后才能获取,否则为空,于是我们用到'处理网页加载完成'这个方法:
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
&&& self.navigationItem.title = self.webview.title
运行效果如图:
5.前进和后退
首先我们要在navgationBar上添加前进和后退按钮:
var btnBack = UIBarButtonItem()
var btnForward = UIBarButtonItem()
func setNavBar() {
& btnBack = UIBarButtonItem(title: "后退", style: UIBarButtonItemStyle.Plain, target: self, action: "toBack")
& btnForward = UIBarButtonItem(title: "前进", style: UIBarButtonItemStyle.Plain, target: self, action: "toForward")
& self.navigationItem.leftBarButtonItem = btnBack
& self.navigationItem.rightBarButtonItem = btnForward
然后我们用到了goBack()和goForward()方法,在前进或后退之前我们要判断一下网页是否能够前进或后退:
func toBack() {
&& if self.webview.canGoBack {
&&&& self.webview.goBack()
func toForward() {
& if self.webview.canGoForward {
&&& self.webview.goForward()
最后在viewDidLoad()里加上调用setNavBar()方法:
setNavBar()
运行效果如图:
6.修改网页配置
现在,一个看似很简单的浏览器完成了,但如果我们把网址换成:
/homepage/article/Class_1166_Time_1.html
即在viewDidLoad()里修改:
let url = NSURL(string: "/homepage/article/Class_1166_Time_1.html")
我们会发现网页上列表里的文字,包括顶栏上的文字点击了没反应,问题出在哪里呢&#63;这是因为系统阻止了不安全的连接。怎么解决呢?我们就要用到WKUIDelegate中的createWebViewWithConfiguration()这个方法让其允许导航,首先我们要设置自身代理,在viewDidLoad()里加上:
self.webview.UIDelegate = self
func webView(webView: WKWebView, createWebViewWithConfiguration configuration: WKWebViewConfiguration, forNavigationAction navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -& WKWebView&#63; {
&&&& //如果目标主视图不为空,则允许导航
& if !(navigationAction.targetFrame&#63;.mainFrame != nil) {
&&& self.webview.loadRequest(navigationAction.request)
& return nil
运行一下,发现点击跳转了!
7.处理js的提示框
现在把网址修改为
/csol2/1565/home/index.php
即在viewDidLoad()里修改:
let url = NSURL(string: "/csol2/1565/home/index.php")
往下拉,点击'立即领取',本应该出现提示框,却发现什么也没发生。为此,我们要处理一下js的提示框事件。还记得一开始提到的那个方法吧,如下:
func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: () -& Void) {
& let alert = UIAlertController(title: nil, message: message, preferredStyle: .Alert)
& alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (_) -& Void in
&&& completionHandler()
&& self.presentViewController(alert, animated: true, completion: nil)
这里要创建一个警告框来显示,现在再运行一下看看&#63;!
8.添加进度条
我们知道UIWebView是无法获取网页加载的进度的,于是也就无法创建进度条了,当然我们可以以某种算法模拟网页加载,自己设置进度条的值。而WKWebView却提供了获取网页加载进度的方法,支持KVO,也就是estimatedProgress。另外还有loading是否正在加载和title页面标题。
我们得创建一个进度条:
var progBar = UIProgressView()
//以下代码添加到viewDidLoad()
progBar = UIProgressView(frame: CGRectMake(0, 0, self.view.frame.width, 30))
& progBar.progress = 0.0
& progBar.tintColor = UIColor.redColor()
& self.webview.addSubview(progBar)
然后给网页添加监听进度,同样在viewDidLoad()里:
self.webview.addObserver(self, forKeyPath: "estimatedProgress", options: NSKeyValueObservingOptions.New, context: nil)
再处理KVO:
override func observeValueForKeyPath(keyPath: String&#63;, ofObject object: AnyObject&#63;, change: [String : AnyObject]&#63;, context: UnsafeMutablePointer&Void&) {
& if keyPath == "estimatedProgress" {
&&& self.progBar.alpha = 1.0
&&& progBar.setProgress(Float(webview.estimatedProgress), animated: true)
&&&&&&&& //进度条的值最大为1.0
&&&& if(self.webview.estimatedProgress &= 1.0) {
&&&&& UIView.animateWithDuration(0.3, delay: 0.1, options: UIViewAnimationOptions.CurveEaseInOut, animations: { () -& Void in
&&&&&&& self.progBar.alpha = 0.0
&&&&&&& }, completion: { (finished:Bool) -& Void in
&&&&&&&&& self.progBar.progress = 0
&&&&&&& })
这里设置进度条的值很重要,因为我们发现,其实进度条的值总比网页加载的实际值慢一些,两者并不同步。如果你不添加动画使进度条加载完成后消失,你会发现进度条还没到最右边中途就不见了。所以我们要用个动画来实现。此外,如果把self.progBar.progress = 0这句语句,即清零的功能放到别的方法中去,比如说放到开始导航的时候来清零,你会发现进度条的动画有问题,会来回转。总之,怎么处理进度条的动画很讲究,我试了好多次发现这个方法相对来说稳定一些。所以我建议大家可以换个进度条的样式,即不依赖于值的显示,如可以转圈圈等等。现在有好多第三方库可以使用,大家可以上cocoapods去查找。
还有一点别忘了,对于KVO模式,有add一定要remove,否则会崩溃。我们可以在视图消失的时候添加remove:
override func viewWillDisappear(animated: Bool) {
& webview.removeObserver(self, forKeyPath: "estimatedProgress")
大家可以换些网址试试!
9.最终效果图
WKWebView的简单使用就介绍到这里了!大家有兴趣可以为其添加更多功能!如果喜欢本文的话别忘了点击喜欢哦!
既然说WKWebView相比UIWebView消耗的内存更少,那么我们就来实际对比一下,我们让它们加载同一个网站,结果如图
(左为UIWebView,右为WKWebView):
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 js获取当前页面url 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信