EasyJSWebView二次加载时JS无法调用原生代码解决办法

来源:互联网 发布:中国证券软件下载 编辑:程序博客网 时间:2024/05/18 00:29

研究了很长时间,终于解决了,当二次加载页面的时候需要先在shouldStartLoadWithRequest中remove掉第一次加载的webview.然后重新建一个webview.


//

//  ReloadAccountVC.m
//  PayHere
//
//  Created by snow on 2017/5/3.
//  Copyright © 2017年 com.ghl.PayHere. All rights reserved.
//


#import "ReloadAccountVC.h"
#import "MyJSInterface.h"
#import "EasyJSWebView.h"
@interface ReloadAccountVC ()<MyJSInterfaceDelegate,UIWebViewDelegate>


@property (nonatomic,strong) EasyJSWebView *webView;
@property (nonatomic,strong) EasyJSWebView *mWebV;
@end


@implementation ReloadAccountVC


- (void)viewDidLoad {
    [super viewDidLoad];
    [self initUI];
}


- (void)initUI{
    
    TerminalCfg *terminalCfg = [Global shareData].terminalCfg;
    
    _webView = [[EasyJSWebView alloc]initWithFrame:self.view.bounds];
    _webView.scalesPageToFit = YES;
    _webView.delegate = self;
    [_webView goBack];
    _webView.scrollView.showsVerticalScrollIndicator= NO;
    [self.view addSubview:_webView];
    

    MyJSInterface  *jsInterface = [MyJSInterface new];

    jsInterface.delegate = self;  //这个一定要加上

    [_webView addJavascriptInterfaces:jsInterface WithName:@"Android"];
    


    NSURL *url = [NSURL URLWithString: @"http://219.92.28.137:18082/oglipg/ProviderInit"];
    NSString *body = [NSString stringWithFormat: @"x=xitpt&hidRetailerAcc=%@&hidTerminalId=%@&hidUserName=%@&hidSessionId=%@&hidChannel=androidBase",terminalCfg.retailerAcc,[SessionManager getUserDetails:KEY_TID],[SessionManager getUserDetails:KEY_USR],[SessionManager getUserDetails:KEY_SID]];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url];
    [request setHTTPMethod: @"POST"];
    [request setHTTPBody: [body dataUsingEncoding: NSUTF8StringEncoding]];
    [_webView loadRequest: request];
   
}


- (void)webViewDidStartLoad:(UIWebView *)webView{
    
    NSLog(@"webViewDidStartLoad");
    
}


- (void)webViewDidFinishLoad:(UIWebView *)web{
    
    NSLog(@"webViewDidFinishLoad");
    
}


-(void)webView:(UIWebView*)webView  didFailLoadWithError:(NSError*)error{
    
        if([error code] == NSURLErrorCancelled)
        return;
    
    NSLog(@"DidFailLoadWithError:%@",error);
    
}




static BOOL isNotFirstLoad=NO;//定义一个静态变量,判断是否是第二次加载


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    
    NSLog(@"======url: %@", request.URL.absoluteString);
    
    if (isNotFirstLoad) {
        
        [_webView removeFromSuperview];
        
        _webView = nil;
        _webView.delegate = nil;
        __weak typeof(self) _weakself = self;
        _mWebV = [[EasyJSWebView alloc] initWithFrame:CGRectMake(0, 64, _weakself.view.frame.size.width, _weakself.view.frame.size.height)];
        
        
        [self.view addSubview:_mWebV];
        
        _mWebV.backgroundColor = [UIColor whiteColor];
        
        _mWebV.delegate = self; //这个一定要加上
        

        MyJSInterface  *javascriptInterface = [MyJSInterface new];

javascriptInterface.delegate = self;   //这个一定要加上

        [_mWebV addJavascriptInterfaces:javascriptInterface  WithName:@"Android"];
        
        [_mWebV loadRequest:request];
        
        isNotFirstLoad = NO;
        
        return NO;
    }
    
    isNotFirstLoad = YES;
    
    return YES;
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end