之前要做这样一个流程:
1.商城首页-2.订单详情-3.收货人详情-4.收银柜-5.调用支付宝或者微信-6.显示支付结果-7.点击右上角返回到“页面1”。点击“页面1”的左上角,返回到OC原生的地方。
页面1
-页面7
都是H5页面。
实际的效果是这样的:
要求点击左上角回到首页
在首页点击的时候,要返回到原生的pushh5
的页面
这个的解决方法有两个:
- 1.在支付成功页面,点击返回的时候,从新生成一个webview,然后加载
home页面的url
。 - 2.在支付成功页面,点击返回的时候,调用JS代码,直接操作,返回到首页去,但是有缓存!!!
第一种方法
#pragma mark - 返回
- (void)backAction{
//判断是不是要回到商城首页
if(self.isMallHome){
//reload回到首页
_urlStr = _mallHomeURL;
//创建一个新的webView
[_webView removeFromSuperview];
_webView = nil;
_webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:_webView];
[self setupWebView];
//这里必须走一波这个,因为我发现没有调用完成这个方法,
(到了后来,我才知道为什么没有调用,后来就不要这个方法了。是以为没有代理,所以没有代理方法,)
[self webViewDidFinishLoad:_webView];
return;
}
if(_webView.canGoBack){
[_webView goBack];
}else{
[self.navigationController popViewControllerAnimated:YES];
}
}
但是一直不调用webViewDidFinishLoad:(UIWebView *)webView
方法。这个方法中是这样写的:
- (void)webViewDidFinishLoad:(UIWebView *)webView{
[self checkLeftItemsStatus];
self.disBaseConnectView.hidden = YES;
self.helpContext = [self buildJSParamsWithWebView:webView];
NSString *jsonString = [webView stringByEvaluatingJavaScriptFromString:@"getShareInfo()"];
NSDictionary *jsDic = [GXTools dictionaryWithJsonString:jsonString];
self.jsDictionary = jsDic;
//判断是不是支付成功页面
[self checkIfPaySuccessState:jsDic];
}
JS原生代码写的类
import Foundation
import JavaScriptCore
//OC webView 交互
extension HelpViewController {
@objc func buildJSParams(webView:UIWebView) -> JSContext{
let pushContext = webView.value(forKeyPath: "documentView.webView.mainFrame.javaScriptContext") as! JSContext
let model = JSSwiftModel()
model.jsController = self
model.jsContext = pushContext
pushContext.setObject(model, forKeyedSubscript: "JSSwiftModel" as (NSCopying & NSObjectProtocol)!)
return pushContext
}
}
我写的东西一直没有调用,所以就起了怪了。刚开始没有在意。后来除了bug才发现的。
回到首页,在次购物,就出现这个问题
解决思路:
1.后台调用我的JSSwiftModel
对象,调用不到了,所以报错
2.第一次走这个流程的时候,不会出现问题。只有第二次才发生这个问题
3.- (void)webViewDidFinishLoad:(UIWebView *)webView
这个方法没有调用啊,只有调用这个方法,JSSwiftModel
才会生成对象。每个页面都要生成一次,每一次获取一个新的图形上下文,获取页面的各种信息,每一个页面都要!!!
4.如上代码,首页没有问题,但是页面2就出现问题了,后来去除自己手动调用didload:request方法,首页也出了问题。
可以确定的是,一定是我的JSSwiftModel
对象没有了,后台才报错,主要错在我,因为第一遍流程没有问题,第二次才有,一定是我的锅,后来想想,可能是没有走- (void)webViewDidFinishLoad:(UIWebView *)webView
方法导致的,最后断点测试,果然。
为毛线不调用代理方法:忘了设置代理方法,所以以后一定要记住,一旦代理方法不走了,一定要是不是代理没有设置!!!!
方法二:多哥去网上找了一下,然后通过JS修改了h5的代码,直接回到了首页,但是有缓存,不过也挺好的!!!
#pragma mark - 返回
- (void)backAction{
//判断是不是要回到商城首页
if(self.isMallHome){
//reload回到首页
_urlStr = _mallHomeURL;
[_webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"if( window.history.length > 1 ) { window.history.go( -( window.history.length - 1 ) ) }; window.setTimeout( \"window.location.replace( '%@' )\", 300 );", self.mallHomeURL]];
return;
}
if(_webView.canGoBack){
[_webView goBack];
}else{
[self.navigationController popViewControllerAnimated:YES];
}
}
今天要感谢多哥帮我找到了stackOverFlow文档,没有代理,JS解决返回的问题,非常感谢!!!
过去一直没有了解JS,现在看来有时间要看看了~真好!!!