iOS WKWebView适配实战篇的完整攻略主要涉及以下几个方面:
1. 了解WKWebView
WKWebView是苹果官方提供的一个用于iOS和macOS平台的现代化Web视图,可以直接预览网页,还支持JavaScriptCore和WebViewJavascriptBridge等桥接方式。相比于旧版的UIWebView,WKWebView更加内存友好、性能强劲、与Web交互更加高效。
2. 适配WKWebView
在使用WKWebView时,一般需要考虑以下几个问题:
2.1 网络协议
WKWebView默认只支持HTTPS协议的请求,如果需要支持HTTP请求,需要在info.plist文件里面追加 NSAppTransportSecurity 项,并设置 NSAllowsArbitraryLoads 为YES。
2.2 JavaScript交互
为了实现JavaScript与原生iOS应用程序之间的相互调用,可以使用JavaScriptCore或WebViewJavascriptBridge等桥接方式。
其中JavaScriptCore是苹果官方提供的一种框架,它允许直接在iOS中运行JavaScript代码,并提供OC和JS代码之间的转换。
而WebViewJavascriptBridge的主要功能是JS和原生OC之间通信,它使用桥接方式实现了JS和OC之间的互相调用,并实现了数据序列化和反序列化,提供了相对完善的API接口。
2.3 JS与原生应用程序通信
在JS与原生应用程序通信时,需要通过JSContext或WKScriptMessageHandler进行实现。其中JSContext是JavaScriptCore框架提供的一种接口,可以实现JS与OC之间的通信。而WKScriptMessageHandler则是WKWebView中提供的一种接口,用于实现WKWebView与iOS原生应用程序之间的JavaScript消息传递。
3. WKWebView示例说明
下面以两个实例说明如何在适配WKWebView中实现JS与原生应用程序之间的通信。
3.1 示例1
在该示例中,我们将通过JavaScriptCore框架实现JS与原生应用程序之间的通信。
首先,我们需要将JS代码和OC代码进行桥接,具体代码如下所示:
// 执行JS代码
- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *))completionHandler;
// 桥接JS和OC之间的相互调用
_property context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"name"] = ^(id obj) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", obj);
});
};
在执行完上述代码后,JS和OC之间的相互调用就已经实现了。接下来,在JS中可以直接调用OC代码,示例如下:
name('hello OC!');
在OC中,可以通过evaluateJavaScript方法执行JS代码,示例如下:
[self.webView evaluateJavaScript:@"alert('hello JS!');" completionHandler:nil];
3.2 示例2
在该示例中,我们将通过WebViewJavascriptBridge实现JS与原生应用程序之间的通信。
首先,我们需要按照要求将WebViewJavascriptBridge集成到项目中,并建立OC和JS之间的桥接,具体代码如下所示:
// 初始化WebViewJavascriptBridge
self.bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];
// OC与JS之间的相互调用
[self.bridge registerHandler:@"getNativeInfo" handler:^(id data, WVJBResponseCallback responseCallback) {
NSDictionary *infoDict = @{@"id": @"123456", @"name": @"iOS开发"};
responseCallback(infoDict);
}];
[self.bridge callHandler:@"getWebInfo" data:@{@"id": @"123456", @"name": @"iOS开发"} responseCallback:^(id responseData) {
NSDictionary *infoDict = (NSDictionary *)responseData;
NSLog(@"%@", infoDict);
}];
在上述代码中,我们实现了OC与JS之间的相互调用,其中getNativeInfo为OC代码提供的获取本地信息的接口,getWebInfo为JS代码提供的获取Web信息的接口。
接下来,在JS中可以通过WebViewJavascriptBridge调用相关OC代码,示例如下:
WebViewJavascriptBridge.callHandler('getNativeInfo', {}, function(response) {
alert(JSON.stringify(response));
});
在OC中,可以通过registerHandler注册JS调用OC代码的处理函数,示例如下:
[self.bridge registerHandler:@"getWebInfo" handler:^(id data, WVJBResponseCallback responseCallback) {
NSDictionary *infoDict = @{@"id": @"123456", @"name": @"iOS开发"};
responseCallback(infoDict);
}];
这里,我们实现了在JS中调用OC代码,以及在OC中调用JS代码的功能。
这就是iOS WKWebView适配实战篇的完整攻略,希望对读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:iOS WKWebView适配实战篇 - Python技术站