You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							314 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							314 lines
						
					
					
						
							11 KiB
						
					
					
				// | 
						|
//  TFWebViewController.m | 
						|
//  WXReader | 
						|
// | 
						|
//  Created by 谢腾飞 on 2020/12/3. | 
						|
//  Copyright © 2020 xtfei_2011@126.com. All rights reserved. | 
						|
// | 
						|
 | 
						|
#import "TFWebViewController.h" | 
						|
#import "TFScriptMessageHandler.h" | 
						|
#import "TFShareManager.h" | 
						|
#import <WebKit/WKWebView.h> | 
						|
#import <WebKit/WebKit.h> | 
						|
#import "NSObject+Observer.h" | 
						|
 | 
						|
static void *WkWebBrowserContext = &WkWebBrowserContext; | 
						|
@interface TFWebViewController ()<WKNavigationDelegate, WKUIDelegate, WKScriptMessageHandler> | 
						|
 | 
						|
@property (nonatomic, strong) WKWebView *webView; | 
						|
 | 
						|
@property (nonatomic, strong) UIProgressView *progressView; | 
						|
 | 
						|
@property (nonatomic, strong) NSMutableArray *snapShotsArray; | 
						|
//返回按钮 | 
						|
@property (nonatomic, strong) UIButton *customBackButton; | 
						|
//关闭按钮 | 
						|
@property (nonatomic, strong) UIButton *closeButton; | 
						|
 | 
						|
@end | 
						|
 | 
						|
@implementation TFWebViewController | 
						|
 | 
						|
- (void)viewDidLoad | 
						|
{ | 
						|
    [super viewDidLoad]; | 
						|
    [self initialize]; | 
						|
    [self createSubviews]; | 
						|
} | 
						|
 | 
						|
- (void)viewWillAppear:(BOOL)animated | 
						|
{ | 
						|
    [super viewWillAppear:animated]; | 
						|
    [[NSNotificationCenter defaultCenter] postNotificationName:Notification_Hidden_Tabbar object:@"1"]; | 
						|
} | 
						|
 | 
						|
- (void)viewWillDisappear:(BOOL)animated | 
						|
{ | 
						|
    [super viewWillDisappear:animated]; | 
						|
     | 
						|
    [self.webView setNavigationDelegate:nil]; | 
						|
    [self.webView setUIDelegate:nil]; | 
						|
     | 
						|
    NSArray *t_arr = self.navigationController.viewControllers; | 
						|
    if (t_arr.count == 0) { | 
						|
        [[NSNotificationCenter defaultCenter] postNotificationName:Notification_Show_Tabbar object:nil]; | 
						|
    } | 
						|
} | 
						|
 | 
						|
- (void)viewDidAppear:(BOOL)animated | 
						|
{ | 
						|
    [super viewDidAppear:animated]; | 
						|
    [self setStatusBarDefaultStyle]; | 
						|
} | 
						|
 | 
						|
- (void)initialize | 
						|
{ | 
						|
    [self setNavigationBarTitle:self.navTitle]; | 
						|
    [self hiddenNavigationBarLeftButton]; | 
						|
    [self.navigationBar addSubview:self.customBackButton]; | 
						|
    [self.navigationBar addSubview:self.closeButton]; | 
						|
     | 
						|
    [self.view addSubview:self.webView]; | 
						|
    [self.view addSubview:self.progressView]; | 
						|
} | 
						|
 | 
						|
- (void)createSubviews | 
						|
{ | 
						|
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:self.URLString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; | 
						|
     | 
						|
    [self.webView loadRequest:request]; | 
						|
} | 
						|
 | 
						|
- (void)customBackItemClicked | 
						|
{ | 
						|
    if (self.webView.goBack) { | 
						|
        [self.webView goBack]; | 
						|
    } else { | 
						|
        if (self.isPresentState) { | 
						|
            [self dismissViewControllerAnimated:YES completion:nil]; | 
						|
        } else { | 
						|
            [self.navigationController popViewControllerAnimated:YES]; | 
						|
        } | 
						|
    } | 
						|
} | 
						|
 | 
						|
- (void)closeItemClicked | 
						|
{ | 
						|
    if (self.isPresentState) { | 
						|
        [self dismissViewControllerAnimated:YES completion:nil]; | 
						|
    } else { | 
						|
        [self.navigationController popViewControllerAnimated:YES]; | 
						|
    } | 
						|
} | 
						|
 | 
						|
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message | 
						|
{ | 
						|
    if ([message.name isEqualToString:@"share"]) { | 
						|
        NSDictionary *dic = [TFUtilsHelper dictionaryWithJsonString:message.body]; | 
						|
         | 
						|
         | 
						|
        NSString *title = [TFUtilsHelper formatStringWithObject:[dic objectForKey:@"title"]]; | 
						|
        NSString *desc = [TFUtilsHelper formatStringWithObject:[dic objectForKey:@"desc"]]; | 
						|
        NSString *imageUrl = [TFUtilsHelper formatStringWithObject:[dic objectForKey:@"image"]]; | 
						|
        NSString *url = [TFUtilsHelper formatStringWithObject:[dic objectForKey:@"url"]]; | 
						|
         | 
						|
        [TFShareManager shareWithTitle:title desc:desc imageUrl:imageUrl shareUrl:url]; | 
						|
    } | 
						|
} | 
						|
 | 
						|
// 这个是网页加载完成,导航的变化 | 
						|
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation | 
						|
{ | 
						|
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; | 
						|
    [self updateNavigationItems]; | 
						|
} | 
						|
 | 
						|
// 开始加载 | 
						|
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation | 
						|
{ | 
						|
    self.progressView.hidden = NO; | 
						|
} | 
						|
 | 
						|
// 内容返回时调用 | 
						|
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation | 
						|
{} | 
						|
 | 
						|
// 服务器请求跳转的时候调用 | 
						|
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation | 
						|
{} | 
						|
 | 
						|
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler | 
						|
{ | 
						|
    switch (navigationAction.navigationType) { | 
						|
        case WKNavigationTypeLinkActivated: { | 
						|
            [self pushCurrentSnapshotViewWithRequest:navigationAction.request]; | 
						|
            break; | 
						|
        } | 
						|
        case WKNavigationTypeFormSubmitted: { | 
						|
            [self pushCurrentSnapshotViewWithRequest:navigationAction.request]; | 
						|
            break; | 
						|
        } | 
						|
        case WKNavigationTypeBackForward: { | 
						|
            break; | 
						|
        } | 
						|
        case WKNavigationTypeReload: { | 
						|
            break; | 
						|
        } | 
						|
        case WKNavigationTypeFormResubmitted: { | 
						|
            break; | 
						|
        } | 
						|
        case WKNavigationTypeOther: { | 
						|
            [self pushCurrentSnapshotViewWithRequest:navigationAction.request]; | 
						|
            break; | 
						|
        } | 
						|
        default: { | 
						|
            break; | 
						|
        } | 
						|
    } | 
						|
    [self updateNavigationItems]; | 
						|
    decisionHandler(WKNavigationActionPolicyAllow); | 
						|
} | 
						|
 | 
						|
// 内容加载失败时候调用 | 
						|
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error | 
						|
{} | 
						|
 | 
						|
// 跳转失败的时候调用 | 
						|
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error | 
						|
{} | 
						|
 | 
						|
// 进度条 | 
						|
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView | 
						|
{} | 
						|
 | 
						|
- (void)updateNavigationItems | 
						|
{ | 
						|
    if (self.webView.canGoBack) { | 
						|
        self.closeButton.hidden = NO; | 
						|
    }else{ | 
						|
        self.navigationController.interactivePopGestureRecognizer.enabled = YES; | 
						|
        self.closeButton.hidden = YES; | 
						|
    } | 
						|
} | 
						|
 | 
						|
// 请求链接处理 | 
						|
- (void)pushCurrentSnapshotViewWithRequest:(NSURLRequest *)request | 
						|
{ | 
						|
    NSURLRequest *lastRequest = (NSURLRequest *)[[self.snapShotsArray lastObject] objectForKey:@"request"]; | 
						|
    if ([request.URL.absoluteString isEqualToString:@"about:blank"]) { | 
						|
        return; | 
						|
    } | 
						|
    if ([lastRequest.URL.absoluteString isEqualToString:request.URL.absoluteString]) { | 
						|
        return; | 
						|
    } | 
						|
     | 
						|
    UIView *currentSnapShotView = [self.webView snapshotViewAfterScreenUpdates:YES]; | 
						|
    [self.snapShotsArray addObject:@{@"request":request,@"snapShotView":currentSnapShotView}]; | 
						|
} | 
						|
 | 
						|
- (UIButton *)customBackButton | 
						|
{ | 
						|
    if (!_customBackButton) { | 
						|
         | 
						|
        UIButton *backButton = [[UIButton alloc] init]; | 
						|
        backButton.frame = CGRectMake(kHalfMargin, PUB_NAVBAR_OFFSET + 20, 44, 44); | 
						|
        [backButton.titleLabel setFont:kMainFont]; | 
						|
        [backButton setTitleColor:[UIColor grayColor] forState:UIControlStateNormal]; | 
						|
        [backButton setTitleColor:[UIColor grayColor] forState:UIControlStateHighlighted]; | 
						|
        [backButton setImage:[UIImage imageNamed:@"public_back"] forState:UIControlStateNormal]; | 
						|
        [backButton setImageEdgeInsets:UIEdgeInsetsMake(12, 6, 12, 18)]; | 
						|
         | 
						|
        [backButton addTarget:self action:@selector(customBackItemClicked) forControlEvents:UIControlEventTouchUpInside]; | 
						|
         | 
						|
        _customBackButton = backButton; | 
						|
    } | 
						|
    return _customBackButton; | 
						|
} | 
						|
 | 
						|
- (UIButton *)closeButton | 
						|
{ | 
						|
    if (!_closeButton) { | 
						|
         | 
						|
        UIButton *backButton = [[UIButton alloc] init]; | 
						|
        backButton.frame = CGRectMake(kHalfMargin + 44, PUB_NAVBAR_OFFSET + 20, 44, 44); | 
						|
        backButton.hidden = YES; | 
						|
        backButton.adjustsImageWhenHighlighted = NO; | 
						|
        backButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; | 
						|
        [backButton setTitle:TFLocalizedString(@"关闭") forState:UIControlStateNormal]; | 
						|
        [backButton.titleLabel setFont:kMainFont]; | 
						|
        [backButton setTitleColor:kBlackColor forState:UIControlStateNormal]; | 
						|
        [backButton addTarget:self action:@selector(closeItemClicked) forControlEvents:UIControlEventTouchUpInside]; | 
						|
         | 
						|
        _closeButton = backButton; | 
						|
    } | 
						|
    return _closeButton; | 
						|
} | 
						|
 | 
						|
- (WKWebView *)webView | 
						|
{ | 
						|
    if (!_webView) { | 
						|
         | 
						|
        WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; | 
						|
        if (@available(iOS 9.0, *)) { | 
						|
            configuration.allowsAirPlayForMediaPlayback = YES; | 
						|
        } | 
						|
        configuration.allowsInlineMediaPlayback = YES; | 
						|
        configuration.selectionGranularity = YES; | 
						|
        configuration.processPool = [[WKProcessPool alloc] init]; | 
						|
        configuration.preferences.javaScriptCanOpenWindowsAutomatically = YES; | 
						|
        configuration.suppressesIncrementalRendering = YES; | 
						|
        configuration.userContentController = [WKUserContentController new]; | 
						|
        [configuration.userContentController addScriptMessageHandler:[[TFScriptMessageHandler alloc] initWithDelegate:self] name:@"handleGoMall"]; | 
						|
         | 
						|
        _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, PUB_NAVBAR_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT - PUB_NAVBAR_HEIGHT) configuration:configuration]; | 
						|
        _webView.backgroundColor = [UIColor colorWithRed:240.0/255 green:240.0/255 blue:240.0/255 alpha:1.0]; | 
						|
        _webView.navigationDelegate = self; | 
						|
        _webView.UIDelegate = self; | 
						|
         | 
						|
        WS(weakSelf) | 
						|
        [_webView addObserver:NSStringFromSelector(@selector(estimatedProgress)) complete:^(WKWebView * _Nonnull obj, id  _Nullable oldVal, id  _Nullable newVal) { | 
						|
             | 
						|
            [weakSelf.progressView setAlpha:1.0f]; | 
						|
             | 
						|
            BOOL animated = obj.estimatedProgress > weakSelf.progressView.progress; | 
						|
            [weakSelf.progressView setProgress:obj.estimatedProgress animated:animated]; | 
						|
             | 
						|
            if (obj.estimatedProgress >= 1.0f) { | 
						|
                [UIView animateWithDuration:0.3f delay:0.3f options:UIViewAnimationOptionCurveEaseOut animations:^{ | 
						|
                    [weakSelf.progressView setAlpha:0.0f]; | 
						|
                } completion:^(BOOL finished) { | 
						|
                    [weakSelf.progressView setProgress:0.0f animated:NO]; | 
						|
                }]; | 
						|
            } | 
						|
        }]; | 
						|
        _webView.allowsBackForwardNavigationGestures = YES; | 
						|
    } | 
						|
    return _webView; | 
						|
} | 
						|
 | 
						|
- (UIProgressView *)progressView | 
						|
{ | 
						|
    if (!_progressView) { | 
						|
        _progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault]; | 
						|
        _progressView.frame = CGRectMake(0, PUB_NAVBAR_HEIGHT, self.view.bounds.size.width, 3); | 
						|
        _progressView.progressTintColor = kMainColor; | 
						|
        [_progressView setTrackTintColor:[UIColor clearColor]]; | 
						|
    } | 
						|
    return _progressView; | 
						|
} | 
						|
 | 
						|
- (NSMutableArray *)snapShotsArray | 
						|
{ | 
						|
    if (!_snapShotsArray) { | 
						|
        _snapShotsArray = [NSMutableArray array]; | 
						|
    } | 
						|
    return _snapShotsArray; | 
						|
} | 
						|
 | 
						|
- (void)dealloc | 
						|
{ | 
						|
    [_webView.configuration.userContentController removeScriptMessageHandlerForName:@"handleGoMall"]; | 
						|
} | 
						|
 | 
						|
@end
 | 
						|
 |