1. //
  2. // JSViewController.m
  3. // Library
  4. //
  5. // Created by 朱逸 on 16/7/7.
  6. // Copyright © 2016年 朱逸. All rights reserved.
  7. //
  8.  
  9. #import "JSViewController.h"
  10. #import <WebKit/WebKit.h>
  11.  
  12. @interface JSViewController ()<WKScriptMessageHandler,WKUIDelegate,WKNavigationDelegate>{
  13. }
  14.  
  15. @property (nonatomic, strong)WKWebView *wk;
  16. @property (nonatomic, strong)UIProgressView *progressView;
  17.  
  18. @end
  19.  
  20. @implementation JSViewController
  21.  
  22. - (void)viewDidLoad {
  23. [super viewDidLoad];
  24. // Do any additional setup after loading the view.
  25. self.edgesForExtendedLayout = UIRectEdgeNone;
  26. self.automaticallyAdjustsScrollViewInsets = NO;
  27.  
  28. self.view.backgroundColor = [UIColor grayColor];
  29. WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
  30.  
  31. /*
  32. * 用户配置
  33. */
  34. config.preferences = [[WKPreferences alloc] init];
  35.  
  36. /*
  37. * 用户交互管理
  38. */
  39. config.userContentController = [[WKUserContentController alloc] init];
  40.  
  41. /*
  42. * 申明代理和Native方法名
  43. */
  44. [config.userContentController addScriptMessageHandler:self name:@"AppModel"];
  45.  
  46. // 设置偏好设置
  47. config.preferences = [[WKPreferences alloc] init];
  48. // 默认为0
  49. config.preferences.minimumFontSize = ;
  50. // 默认认为YES
  51. config.preferences.javaScriptEnabled = YES;
  52. // 在iOS上默认为NO,表示不能自动通过窗口打开
  53. config.preferences.javaScriptCanOpenWindowsAutomatically = NO;
  54.  
  55. self.wk = [[WKWebView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width, self.view.frame.size.height - ) configuration:config];
  56. NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"];
  57. NSURL *url = [NSURL fileURLWithPath:path];
  58. NSURLRequest *request = [NSURLRequest requestWithURL:url];
  59. [self.wk loadRequest:request];
  60. /*
  61. * 申明导航代理
  62. */
  63. self.wk.navigationDelegate = self;
  64. /*
  65. * 申明UI代理
  66. */
  67. self.wk.UIDelegate = self;
  68. [self.view addSubview:self.wk];
  69.  
  70. /*
  71. * 进度条
  72. */
  73. self.progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(, , self.view.frame.size.width, )];
  74. self.progressView.backgroundColor = [UIColor redColor];
  75. [self.view addSubview:self.progressView];
  76.  
  77. /*
  78. * KVO
  79. */
  80. [self.wk addObserver:self
  81. forKeyPath:@"loading"
  82. options:NSKeyValueObservingOptionNew
  83. context:nil];
  84. [self.wk addObserver:self
  85. forKeyPath:@"title"
  86. options:NSKeyValueObservingOptionNew
  87. context:nil];
  88. [self.wk addObserver:self
  89. forKeyPath:@"estimatedProgress"
  90. options:NSKeyValueObservingOptionNew
  91. context:nil];
  92.  
  93. UIBarButtonItem *goback = [[UIBarButtonItem alloc] initWithTitle:@"后退" style:UIBarButtonItemStyleDone target:self action:@selector(goback)];
  94. UIBarButtonItem *gofarward = [[UIBarButtonItem alloc] initWithTitle:@"前进" style:UIBarButtonItemStyleDone target:self action:@selector(gofarward)];
  95. NSArray *array = @[gofarward,goback];
  96. self.navigationItem.rightBarButtonItems = array;
  97. }
  98.  
  99. - (void)goback {
  100. if ([self.wk canGoBack]) {
  101. [self.wk goBack];
  102. }
  103. }
  104.  
  105. - (void)gofarward {
  106. if ([self.wk canGoForward]) {
  107. [self.wk goForward];
  108. }
  109. }
  110.  
  111. - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
  112. if ([message.name isEqualToString:@"AppModel"]) {
  113. NSLog(@"响应");
  114. }
  115. }
  116.  
  117. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
  118. if ([keyPath isEqualToString:@"loading"]) {
  119. NSLog(@"loading");
  120. } else if ([keyPath isEqualToString:@"title"]) {
  121. self.title = self.wk.title;
  122. } else if ([keyPath isEqualToString:@"estimatedProgress"]) {
  123. self.progressView.progress = self.wk.estimatedProgress;
  124. }
  125.  
  126. if (!self.wk.loading) {
  127. NSString *js = @"callJsAlert()";
  128. [self.wk evaluateJavaScript:js completionHandler:^(id _Nullable response, NSError * _Nullable error) {
  129. NSLog(@"response: %@ error: %@", response, error);
  130. NSLog(@"call js alert by native");
  131. }];
  132.  
  133. [UIView animateWithDuration:0.5 animations:^{
  134. self.progressView.alpha = ;
  135. }];
  136. }
  137. }
  138.  
  139. #pragma mark--WKNavigationDelegate
  140. // 决定导航的动作,通常用于处理跨域的链接能否导航。WebKit对跨域进行了安全检查限制,不允许跨域,因此我们要对不能跨域的链接
  141. // 单独处理。但是,对于Safari是允许跨域的,不用这么处理。
  142. // 这个是决定是否Request
  143. - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
  144. NSString *hostname = navigationAction.request.URL.host.lowercaseString;
  145. if (navigationAction.navigationType == WKNavigationTypeLinkActivated
  146. && ![hostname containsString:@".baidu.com"]) {
  147. // 对于跨域,需要手动跳转
  148. [[UIApplication sharedApplication] openURL:navigationAction.request.URL];
  149.  
  150. // 不允许web内跳转
  151. decisionHandler(WKNavigationActionPolicyCancel);
  152. } else {
  153. self.progressView.alpha = 1.0;
  154. decisionHandler(WKNavigationActionPolicyAllow);
  155. }
  156. }
  157. // 决定是否接收响应
  158. // 这个是决定是否接收response
  159. // 要获取response,通过WKNavigationResponse对象获取
  160. - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigation ResponsedecisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
  161.  
  162. }
  163. // 当main frame的导航开始请求时,会调用此方法
  164. - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation{
  165.  
  166. }
  167.  
  168. // 当main frame接收到服务重定向时,会回调此方法
  169. - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation{
  170.  
  171. }
  172.  
  173. // 当main frame开始加载数据失败时,会回调
  174. - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error{
  175.  
  176. }
  177.  
  178. // 当main frame的web内容开始到达时,会回调
  179. - (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation{
  180.  
  181. }
  182.  
  183. // 当main frame导航完成时,会回调
  184. - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
  185.  
  186. }
  187.  
  188. // 当main frame最后下载数据失败时,会回调
  189. - (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error{
  190.  
  191. }
  192.  
  193. // 这与用于授权验证的API,与AFN、UIWebView的授权验证API是一样的
  194. - (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *__nullable credential))completionHandler{
  195. completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
  196. }
  197.  
  198. // 当web content处理完成时,会回调
  199. - (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView{
  200.  
  201. }
  202.  
  203. #pragma mark - WKUIDelegate
  204. - (void)webViewDidClose:(WKWebView *)webView {
  205. NSLog(@"%s", __FUNCTION__);
  206. }
  207.  
  208. - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
  209. NSLog(@"%s", __FUNCTION__);
  210. UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"alert" message:@"JS调用alert" preferredStyle:UIAlertControllerStyleAlert];
  211. [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  212. completionHandler();
  213. }]];
  214.  
  215. [self presentViewController:alert animated:YES completion:NULL];
  216. NSLog(@"%@", message);
  217. }
  218.  
  219. - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler {
  220. NSLog(@"%s", __FUNCTION__);
  221.  
  222. UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"confirm" message:@"JS调用confirm" preferredStyle:UIAlertControllerStyleAlert];
  223. [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  224. completionHandler(YES);
  225. }]];
  226. [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
  227. completionHandler(NO);
  228. }]];
  229. [self presentViewController:alert animated:YES completion:NULL];
  230.  
  231. NSLog(@"%@", message);
  232. }
  233.  
  234. - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler {
  235. NSLog(@"%s", __FUNCTION__);
  236.  
  237. NSLog(@"%@", prompt);
  238. UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"textinput" message:@"JS调用输入框" preferredStyle:UIAlertControllerStyleAlert];
  239. [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
  240. textField.textColor = [UIColor redColor];
  241. }];
  242.  
  243. [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  244. completionHandler([[alert.textFields lastObject] text]);
  245. }]];
  246.  
  247. [self presentViewController:alert animated:YES completion:NULL];
  248. }
  249.  
  250. - (void)didReceiveMemoryWarning {
  251. [super didReceiveMemoryWarning];
  252. // Dispose of any resources that can be recreated.
  253. }
  254.  
  255. /*
  256. #pragma mark - Navigation
  257.  
  258. // In a storyboard-based application, you will often want to do a little preparation before navigation
  259. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  260. // Get the new view controller using [segue destinationViewController].
  261. // Pass the selected object to the new view controller.
  262. }
  263. */
  264.  
  265. @end

webkit框架的使用的更多相关文章

  1. WebKit框架 浅析

    摘要 WebKit是iOS8之后引入的专门负责处理网页视图的框架,其比UIWebView更加强大,性能也更优. iOS中WebKit框架应用与解析 一.引言 在iOS8之前,在应用中嵌入网页通常需要使 ...

  2. iOS中WebKit框架应用与解析

    WebKit是iOS8之后引入的专门负责处理网页视图的框架,其比UIWebView更加强大,性能也更优. 引言 在iOS8之前,在应用中嵌入网页通常需要使用UIWebView这样一个类,这个类通过UR ...

  3. Firemonkey实现Mac OS程序中内嵌浏览器的功能(自己动手翻译,调用苹果提供的webkit框架)

    XE系列虽然可以跨平台,但是在跨平台的道路上只是走了一小半的路,很多平台下的接口都没实现彻底,所以为了某些功能,还必须自己去摸索. 想实现程序中可以内嵌浏览器的功能,但是Firemonkey还没有对应 ...

  4. iOS:WebKit内核框架的应用与解析

    原文:http://www.cnblogs.com/fengmin/p/5737355.html 一.摘要: WebKit是iOS8之后引入的专门负责处理网页视图的框架,其比UIWebView更加强大 ...

  5. iOS引入JavaScriptCore引擎框架(二)

    为何放弃第一种方案 UIWebView的JSContext获取     上篇中,我们通过简单的kvc获取UIWebVIew的JSContext,但是实际上,apple并未给开发者提供访问UIWebVi ...

  6. 网络天荒地老之UIWebView&WebKit

    UIWebView 是苹果提供的用来展示网页的UI控件,它也是最占内存的控件. iOS8.0之后出现了webkit框架,WKWebView相比UIWebView节省了1/4~1/3的内存,速度快,但是 ...

  7. iOS10通知框架UserNotification理解与应用

    iOS10通知框架UserNotification理解与应用 一.引言 关于通知,无论与远程Push还是本地通知,以往的iOS系统暴漏给开发者的接口都是十分有限的,开发者只能对标题和内容进行简单的定义 ...

  8. WebKit示例解读

    如果你曾经在你的App中使用UIWebView加载网页内容的话,你应该体会到了它的诸多不尽人意之处.UIWebView是基于移动版的Safari的,所以它的性能表现十分有限.特别是在对几乎每个Web应 ...

  9. 谈谈iOS9中的WebKit 与 Safari

    每个用过 UIWebView 的iOS开发者对其诸多的限制和有限的功能也深有感触.悻然,自iOS8推出 WebKit 框架后将改变这一窘境.在本文我将会深入WebKit来体验一下它给我们带来的好处,同 ...

随机推荐

  1. UML和模式应用学习笔记-1(面向对象分析和设计)

    UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...

  2. 筛法求质——poj2262&2909

    这两道题都是哥赫巴德猜想的内容.基本的技术点都是在一个很大的数字范围里面求质数.直接判断两个数是不是质数,这种方法虽然可行但是还是很慢的.所以这两题我们使用打表! 而建立质数表的方法就是筛法求质,速度 ...

  3. C语言面试问答5

    12个滑稽的C语言面试问答——<12个有趣的C语言问答>评析(5) 前文链接:http://www.cnblogs.com/pmer/archive/2013/09/17/3327262. ...

  4. 输出一个string的所有排列情况

    问题: 1.加入输入是{a,b,c}; 2.输出abc,acb,bac,bca,cab,cba; 代码描述: 1.递归遍历所有情况 2.方法FUN输入为:要排列的字符串char inp[];inp[] ...

  5. 利用WCF与Android实现图片上传并传参

    利用WCF与Android实现图片上传并传参 最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想 ...

  6. Matlab内置函数

    [原创]Matlab.NET混编技巧之——找出Matlab内置函数   Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破脑袋, ...

  7. C语言和C++篇

    C语言和C++篇 基本上所有主流的编程语言都有String的标准库,因为字符串操作是我们每个程序员几乎每天都要遇到的.想想我们至今的代码,到底生成和使用了多少String!标题上所罗列的语言,可以看成 ...

  8. escape,encodeURI,encodeURIComponent函数比较

    escape,encodeURI,encodeURIComponent函数比较 js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数 ...

  9. PHP之-json转数组,支持多层嵌套json

    function json_to_array($str) { if (is_string($str)) $str = json_decode($str); $arr=array(); foreach( ...

  10. hive 不同用户 权限设置 出错处理

    今天安装了hive 在a账号安装的,一切正常 但是到其他账户下,报错 >show tables; Error in metadata: java.lang.RuntimeException: U ...