Make WXWebView inherit from WKWebView instead of UIWebView and make WXWebComponent implement WKNavigationDelegate instead of UIWebViewDelegate
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXWebComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXWebComponent.h
index 97800a6..41db2e2 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXWebComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXWebComponent.h
@@ -18,8 +18,9 @@
*/
#import "WXComponent.h"
+#import <WebKit/WebKit.h>
-@interface WXWebComponent : WXComponent<UIWebViewDelegate>
+@interface WXWebComponent : WXComponent<WKNavigationDelegate>
- (void)notifyWebview:(NSDictionary *) data;
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXWebComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXWebComponent.m
index cd10078..1b37c28 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXWebComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXWebComponent.m
@@ -26,7 +26,7 @@
#import <JavaScriptCore/JavaScriptCore.h>
-@interface WXWebView : UIWebView
+@interface WXWebView : WKWebView
@end
@@ -84,17 +84,27 @@
return self;
}
+- (WKWebViewConfiguration *)baseConfiguration {
+ WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
+ NSString *scalesPageToFitScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
+ WKUserScript *userScript = [[WKUserScript alloc] initWithSource:scalesPageToFitScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
+ WKUserContentController *userContentController = [[WKUserContentController alloc] init];
+ [userContentController addUserScript:userScript];
+ configuration.userContentController = userContentController;
+ configuration.allowsInlineMediaPlayback = YES;
+
+ return configuration;
+}
+
- (UIView *)loadView
{
- return [[WXWebView alloc] init];
+ return [[WXWebView alloc] initWithFrame:self.view.frame configuration:[self baseConfiguration]];
}
- (void)viewDidLoad
{
_webview = (WXWebView *)self.view;
- _webview.delegate = self;
- _webview.allowsInlineMediaPlayback = YES;
- _webview.scalesPageToFit = YES;
+ _webview.navigationDelegate = self;
[_webview setBackgroundColor:[UIColor clearColor]];
_webview.opaque = NO;
_jsContext = [_webview valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
@@ -254,56 +264,61 @@
#pragma mark Webview Delegate
-- (NSMutableDictionary<NSString *, id> *)baseInfo
-{
+- (void)baseInfoWithCompletion:(void (^)(NSMutableDictionary<NSString *, id> *data))completion {
NSMutableDictionary<NSString *, id> *info = [NSMutableDictionary new];
- [info setObject:self.webview.request.URL.absoluteString ?: @"" forKey:@"url"];
- [info setObject:[self.webview stringByEvaluatingJavaScriptFromString:@"document.title"] ?: @"" forKey:@"title"];
+ [info setObject:self.webview.URL.absoluteString ?: @"" forKey:@"url"];
[info setObject:@(self.webview.canGoBack) forKey:@"canGoBack"];
[info setObject:@(self.webview.canGoForward) forKey:@"canGoForward"];
- return info;
+ [self.webview evaluateJavaScript:@"document.title" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
+ [info setObject:result ? result : @"" forKey:@"title"];
+ if (completion) {
+ completion(result);
+ }
+ }];
}
-- (void)webViewDidStartLoad:(UIWebView *)webView
+- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation
{
}
-- (void)webViewDidFinishLoad:(UIWebView *)webView
+- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
if (_finishLoadEvent) {
- NSDictionary *data = [self baseInfo];
- [self fireEvent:@"pagefinish" params:data domChanges:@{@"attrs": @{@"src":self.webview.request.URL.absoluteString}}];
+ [self baseInfoWithCompletion:^(NSMutableDictionary<NSString *,id> *data) {
+ [self fireEvent:@"pagefinish" params:data domChanges:@{@"attrs": @{@"src":self.webview.URL.absoluteString}}];
+ }];
}
}
-- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
+- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error
{
if (_failLoadEvent) {
- NSMutableDictionary *data = [self baseInfo];
- [data setObject:[error localizedDescription] forKey:@"errorMsg"];
- [data setObject:[NSString stringWithFormat:@"%ld", (long)error.code] forKey:@"errorCode"];
-
- NSString * urlString = error.userInfo[NSURLErrorFailingURLStringErrorKey];
- if (urlString) {
- // webview.request may not be the real error URL, must get from error.userInfo
- [data setObject:urlString forKey:@"url"];
- if (![urlString hasPrefix:@"http"]) {
- return;
+ [self baseInfoWithCompletion:^(NSMutableDictionary<NSString *,id> *data) {
+ [data setObject:[error localizedDescription] forKey:@"errorMsg"];
+ [data setObject:[NSString stringWithFormat:@"%ld", (long)error.code] forKey:@"errorCode"];
+
+ NSString * urlString = error.userInfo[NSURLErrorFailingURLStringErrorKey];
+ if (urlString) {
+ // webview.request may not be the real error URL, must get from error.userInfo
+ [data setObject:urlString forKey:@"url"];
+ if (![urlString hasPrefix:@"http"]) {
+ return;
+ }
}
- }
- [self fireEvent:@"error" params:data];
+ [self fireEvent:@"error" params:data];
+ }];
}
}
-- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
-{
- if (_startLoadEvent) {
- NSMutableDictionary<NSString *, id> *data = [NSMutableDictionary new];
- [data setObject:request.URL.absoluteString ?:@"" forKey:@"url"];
- [self fireEvent:@"pagestart" params:data];
- }
- return YES;
+- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
+ if (_startLoadEvent) {
+ NSMutableDictionary<NSString *, id> *data = [NSMutableDictionary new];
+ [data setObject:navigationAction.request.URL.absoluteString ?:@"" forKey:@"url"];
+ [self fireEvent:@"pagestart" params:data];
+ }
+
+ decisionHandler(WKNavigationActionPolicyAllow);
}
@end