我的iOS 7+应用程序中有一个模块,它是一个UIWebView.html页面加载一个javascript,创建自定义形状的按钮(使用Raphaeljs库).使用UIWebView,我将委托设置为self.每次按下一个自定义按钮时,都会调用委托方法webView: shouldStartLoadWithRequest: navigationType:.请求不应该由html处理,而应该由iOS代码处理.因此,我使用了一个请求约定(请阅读stackoverflow上的某个地方),使用"inapp"作为我请求的方案.然后我判断主机并采取适当的措施.

这段代码在iOS 7上运行良好.但iOS 8上的网络视图显示为空白(bug?),所以我决定在iOS 8设备上使用WKWebView.网络视图现在呈现得很好(而且速度惊人!),但我的按钮没有效果.

我试着用- (WKNaviation *)loadRequest:(NSURLRequest *)request,但没人叫.

我找不到UIWebView委托方法webView: shouldStartLoadWithRequest: navigationType:的直接等效方法.使用WKWebView处理这些请求的最佳方式是什么?

推荐答案

重新阅读您的描述,看起来您真正需要了解的是如何使用WKWebView重新实现Javascript/Objective-C桥.

我刚刚自己做了这件事,按照http://tetontech.wordpress.com/2014/07/17/objective-c-wkwebview-to-javascript-and-back/的教程和http://nshipster.com/wkwebkit/的信息

WKWebView在Javascript和Objective-C/Swift:WKScriptMessageHandler之间有一种内置的通信方式.

首先,在视图控制器的标题中包括WebKit标题和WKScriptMessageHandler协议:

#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>
@interface ViewController : UIViewController <WKScriptMessageHandler>

@end

初始化WKWebView时,需要使用脚本消息处理程序对其进行配置.你想怎么命名就怎么命名,但对我来说,为你的应用命名似乎很有意义.

    WKWebViewConfiguration *theConfiguration = 
          [[WKWebViewConfiguration alloc] init];
    [theConfiguration.userContentController 
          addScriptMessageHandler:self name:@"myApp"];

    _theWebView = [[WKWebView alloc] initWithFrame:self.view.frame 
                      configuration:theConfiguration];
    [_theWebView loadRequest:request];
    [self.view addSubview:_theWebView];

现在,执行userContentController:didReceiveScriptMessage:.当你的webview收到一条消息时,它就会触发,这样它就完成了你之前使用webView:shouldStartLoadWithRequest:navigationType:所做的工作.

- (void)userContentController:(WKUserContentController *)userContentController 
                        didReceiveScriptMessage:(WKScriptMessage *)message {
    NSDictionary *sentData = (NSDictionary *)message.body;
    NSString *messageString = sentData[@"message"];
    NSLog(@"Message received: %@", messageString);
}

现在,您可以接收来自Javascript的消息了.需要添加到Javascript中的函数调用如下:

window.webkit.messageHandlers.myApp.postMessage({"message":"Hello there"});

Objective-c相关问答推荐

NSDateFormatter,我做错了什么还是这是一个错误?

如何使用第一个字符作为部分名称

等到多个网络请求都执行完毕 - 包括它们的完成块

UIApplication.sharedApplication.delegate.window 和 UIApplication.sharedApplication.keyWindow 有什么区别?

如何在 Cocoa 中创建字符串的 MD5 哈希?

负数的奇怪 Objective-C Mod 行为

UITableView 无限滚动

Objective-C 浮点舍入

NSUInteger 不应该在格式字符串中使用吗?

当单元格全屏时,为什么 UICollectionView 会记录错误?

Crashlytics iOS - 记录捕获的异常

如何在 iPhone 上显示来自 API 的 HTML 文本?

StoryBoard 助理编辑器停止显示相关文件

NSURLConnection sendAsynchronousRequest:queue:completionHandler:连续发出多个请求?

如何为 iPhone 应用程序创建多个主题/皮肤?

如何配置我的应用程序 - 菜单项被禁用?

UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效?

UIImageView 并不总是为模板图像着色

如何在不管理 UDID 和重新编译的情况下无线分发 ios 应用程序

围绕其中心旋转 UIView 保持其大小