webkit框架的使用
- //
- // JSViewController.m
- // Library
- //
- // Created by 朱逸 on 16/7/7.
- // Copyright © 2016年 朱逸. All rights reserved.
- //
- #import "JSViewController.h"
- #import <WebKit/WebKit.h>
- @interface JSViewController ()<WKScriptMessageHandler,WKUIDelegate,WKNavigationDelegate>{
- }
- @property (nonatomic, strong)WKWebView *wk;
- @property (nonatomic, strong)UIProgressView *progressView;
- @end
- @implementation JSViewController
- - (void)viewDidLoad {
- [super viewDidLoad];
- // Do any additional setup after loading the view.
- self.edgesForExtendedLayout = UIRectEdgeNone;
- self.automaticallyAdjustsScrollViewInsets = NO;
- self.view.backgroundColor = [UIColor grayColor];
- WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
- /*
- * 用户配置
- */
- config.preferences = [[WKPreferences alloc] init];
- /*
- * 用户交互管理
- */
- config.userContentController = [[WKUserContentController alloc] init];
- /*
- * 申明代理和Native方法名
- */
- [config.userContentController addScriptMessageHandler:self name:@"AppModel"];
- // 设置偏好设置
- config.preferences = [[WKPreferences alloc] init];
- // 默认为0
- config.preferences.minimumFontSize = ;
- // 默认认为YES
- config.preferences.javaScriptEnabled = YES;
- // 在iOS上默认为NO,表示不能自动通过窗口打开
- config.preferences.javaScriptCanOpenWindowsAutomatically = NO;
- self.wk = [[WKWebView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width, self.view.frame.size.height - ) configuration:config];
- NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"];
- NSURL *url = [NSURL fileURLWithPath:path];
- NSURLRequest *request = [NSURLRequest requestWithURL:url];
- [self.wk loadRequest:request];
- /*
- * 申明导航代理
- */
- self.wk.navigationDelegate = self;
- /*
- * 申明UI代理
- */
- self.wk.UIDelegate = self;
- [self.view addSubview:self.wk];
- /*
- * 进度条
- */
- self.progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width, )];
- self.progressView.backgroundColor = [UIColor redColor];
- [self.view addSubview:self.progressView];
- /*
- * KVO
- */
- [self.wk addObserver:self
- forKeyPath:@"loading"
- options:NSKeyValueObservingOptionNew
- context:nil];
- [self.wk addObserver:self
- forKeyPath:@"title"
- options:NSKeyValueObservingOptionNew
- context:nil];
- [self.wk addObserver:self
- forKeyPath:@"estimatedProgress"
- options:NSKeyValueObservingOptionNew
- context:nil];
- UIBarButtonItem *goback = [[UIBarButtonItem alloc] initWithTitle:@"后退" style:UIBarButtonItemStyleDone target:self action:@selector(goback)];
- UIBarButtonItem *gofarward = [[UIBarButtonItem alloc] initWithTitle:@"前进" style:UIBarButtonItemStyleDone target:self action:@selector(gofarward)];
- NSArray *array = @[gofarward,goback];
- self.navigationItem.rightBarButtonItems = array;
- }
- - (void)goback {
- if ([self.wk canGoBack]) {
- [self.wk goBack];
- }
- }
- - (void)gofarward {
- if ([self.wk canGoForward]) {
- [self.wk goForward];
- }
- }
- - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
- if ([message.name isEqualToString:@"AppModel"]) {
- NSLog(@"响应");
- }
- }
- - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
- if ([keyPath isEqualToString:@"loading"]) {
- NSLog(@"loading");
- } else if ([keyPath isEqualToString:@"title"]) {
- self.title = self.wk.title;
- } else if ([keyPath isEqualToString:@"estimatedProgress"]) {
- self.progressView.progress = self.wk.estimatedProgress;
- }
- if (!self.wk.loading) {
- NSString *js = @"callJsAlert()";
- [self.wk evaluateJavaScript:js completionHandler:^(id _Nullable response, NSError * _Nullable error) {
- NSLog(@"response: %@ error: %@", response, error);
- NSLog(@"call js alert by native");
- }];
- [UIView animateWithDuration:0.5 animations:^{
- self.progressView.alpha = ;
- }];
- }
- }
- #pragma mark--WKNavigationDelegate
- // 决定导航的动作,通常用于处理跨域的链接能否导航。WebKit对跨域进行了安全检查限制,不允许跨域,因此我们要对不能跨域的链接
- // 单独处理。但是,对于Safari是允许跨域的,不用这么处理。
- // 这个是决定是否Request
- - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
- NSString *hostname = navigationAction.request.URL.host.lowercaseString;
- if (navigationAction.navigationType == WKNavigationTypeLinkActivated
- && ![hostname containsString:@".baidu.com"]) {
- // 对于跨域,需要手动跳转
- [[UIApplication sharedApplication] openURL:navigationAction.request.URL];
- // 不允许web内跳转
- decisionHandler(WKNavigationActionPolicyCancel);
- } else {
- self.progressView.alpha = 1.0;
- decisionHandler(WKNavigationActionPolicyAllow);
- }
- }
- // 决定是否接收响应
- // 这个是决定是否接收response
- // 要获取response,通过WKNavigationResponse对象获取
- - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigation ResponsedecisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
- }
- // 当main frame的导航开始请求时,会调用此方法
- - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation{
- }
- // 当main frame接收到服务重定向时,会回调此方法
- - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation{
- }
- // 当main frame开始加载数据失败时,会回调
- - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error{
- }
- // 当main frame的web内容开始到达时,会回调
- - (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation{
- }
- // 当main frame导航完成时,会回调
- - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
- }
- // 当main frame最后下载数据失败时,会回调
- - (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error{
- }
- // 这与用于授权验证的API,与AFN、UIWebView的授权验证API是一样的
- - (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *__nullable credential))completionHandler{
- completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
- }
- // 当web content处理完成时,会回调
- - (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView{
- }
- #pragma mark - WKUIDelegate
- - (void)webViewDidClose:(WKWebView *)webView {
- NSLog(@"%s", __FUNCTION__);
- }
- - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
- NSLog(@"%s", __FUNCTION__);
- UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"alert" message:@"JS调用alert" preferredStyle:UIAlertControllerStyleAlert];
- [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
- completionHandler();
- }]];
- [self presentViewController:alert animated:YES completion:NULL];
- NSLog(@"%@", message);
- }
- - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler {
- NSLog(@"%s", __FUNCTION__);
- UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"confirm" message:@"JS调用confirm" 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];
- NSLog(@"%@", message);
- }
- - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler {
- NSLog(@"%s", __FUNCTION__);
- NSLog(@"%@", prompt);
- UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"textinput" message:@"JS调用输入框" 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];
- }
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
- /*
- #pragma mark - Navigation
- // In a storyboard-based application, you will often want to do a little preparation before navigation
- - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
- // Get the new view controller using [segue destinationViewController].
- // Pass the selected object to the new view controller.
- }
- */
- @end
webkit框架的使用的更多相关文章
- WebKit框架 浅析
摘要 WebKit是iOS8之后引入的专门负责处理网页视图的框架,其比UIWebView更加强大,性能也更优. iOS中WebKit框架应用与解析 一.引言 在iOS8之前,在应用中嵌入网页通常需要使 ...
- iOS中WebKit框架应用与解析
WebKit是iOS8之后引入的专门负责处理网页视图的框架,其比UIWebView更加强大,性能也更优. 引言 在iOS8之前,在应用中嵌入网页通常需要使用UIWebView这样一个类,这个类通过UR ...
- Firemonkey实现Mac OS程序中内嵌浏览器的功能(自己动手翻译,调用苹果提供的webkit框架)
XE系列虽然可以跨平台,但是在跨平台的道路上只是走了一小半的路,很多平台下的接口都没实现彻底,所以为了某些功能,还必须自己去摸索. 想实现程序中可以内嵌浏览器的功能,但是Firemonkey还没有对应 ...
- iOS:WebKit内核框架的应用与解析
原文:http://www.cnblogs.com/fengmin/p/5737355.html 一.摘要: WebKit是iOS8之后引入的专门负责处理网页视图的框架,其比UIWebView更加强大 ...
- iOS引入JavaScriptCore引擎框架(二)
为何放弃第一种方案 UIWebView的JSContext获取 上篇中,我们通过简单的kvc获取UIWebVIew的JSContext,但是实际上,apple并未给开发者提供访问UIWebVi ...
- 网络天荒地老之UIWebView&WebKit
UIWebView 是苹果提供的用来展示网页的UI控件,它也是最占内存的控件. iOS8.0之后出现了webkit框架,WKWebView相比UIWebView节省了1/4~1/3的内存,速度快,但是 ...
- iOS10通知框架UserNotification理解与应用
iOS10通知框架UserNotification理解与应用 一.引言 关于通知,无论与远程Push还是本地通知,以往的iOS系统暴漏给开发者的接口都是十分有限的,开发者只能对标题和内容进行简单的定义 ...
- WebKit示例解读
如果你曾经在你的App中使用UIWebView加载网页内容的话,你应该体会到了它的诸多不尽人意之处.UIWebView是基于移动版的Safari的,所以它的性能表现十分有限.特别是在对几乎每个Web应 ...
- 谈谈iOS9中的WebKit 与 Safari
每个用过 UIWebView 的iOS开发者对其诸多的限制和有限的功能也深有感触.悻然,自iOS8推出 WebKit 框架后将改变这一窘境.在本文我将会深入WebKit来体验一下它给我们带来的好处,同 ...
随机推荐
- UML和模式应用学习笔记-1(面向对象分析和设计)
UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...
- 筛法求质——poj2262&2909
这两道题都是哥赫巴德猜想的内容.基本的技术点都是在一个很大的数字范围里面求质数.直接判断两个数是不是质数,这种方法虽然可行但是还是很慢的.所以这两题我们使用打表! 而建立质数表的方法就是筛法求质,速度 ...
- C语言面试问答5
12个滑稽的C语言面试问答——<12个有趣的C语言问答>评析(5) 前文链接:http://www.cnblogs.com/pmer/archive/2013/09/17/3327262. ...
- 输出一个string的所有排列情况
问题: 1.加入输入是{a,b,c}; 2.输出abc,acb,bac,bca,cab,cba; 代码描述: 1.递归遍历所有情况 2.方法FUN输入为:要排列的字符串char inp[];inp[] ...
- 利用WCF与Android实现图片上传并传参
利用WCF与Android实现图片上传并传参 最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想 ...
- Matlab内置函数
[原创]Matlab.NET混编技巧之——找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破脑袋, ...
- C语言和C++篇
C语言和C++篇 基本上所有主流的编程语言都有String的标准库,因为字符串操作是我们每个程序员几乎每天都要遇到的.想想我们至今的代码,到底生成和使用了多少String!标题上所罗列的语言,可以看成 ...
- escape,encodeURI,encodeURIComponent函数比较
escape,encodeURI,encodeURIComponent函数比较 js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数 ...
- PHP之-json转数组,支持多层嵌套json
function json_to_array($str) { if (is_string($str)) $str = json_decode($str); $arr=array(); foreach( ...
- hive 不同用户 权限设置 出错处理
今天安装了hive 在a账号安装的,一切正常 但是到其他账户下,报错 >show tables; Error in metadata: java.lang.RuntimeException: U ...