重新加载 webview 时 EasyJSWebView 中断
Posted
技术标签:
【中文标题】重新加载 webview 时 EasyJSWebView 中断【英文标题】:EasyJSWebView breaks when reloading the webview 【发布时间】:2014-03-28 13:33:41 【问题描述】:我一直在将EasyJSWebView 实施到一个项目中,该项目会在收到推送消息时弹出一个 Web 视图。这在大多数情况下都可以正常工作,直到您想要重新加载当前的 webview。此时 EasyJSWebView 的功能中断,网页中的 javascript 无法与应用中运行的目标 C 通信。
这是我用来将界面添加到 web 视图然后在视图上加载页面的代码。
_webView.delegate = self;
javaScriptInterface* interface = [javaScriptInterface new];
[self.webView addJavascriptInterfaces:interface WithName:@"interface"];
interface.webView = self;
[interface release];
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"mywebpage.com"]]];
如果我在 web 视图上调用另一个 loadrequest
,即使它是在同一页面上,它也会停止工作。我曾尝试在重新加载之前向 webview 添加另一个接口对象,但这似乎也没有任何作用。
目前,我正在销毁当前的 webview 并在每次需要重新加载或收到另一条推送消息时创建一个新的。
是否有任何修复或解决方法?我希望能够对所有内容都使用一个 webview,而不用担心它是否会重新加载。
【问题讨论】:
对我来说也是同样的问题,你有任何解决方案可以解决@mBeckham 很遗憾没有@ios Developer。我们在我们的 javascript 中使用主干路由,所以我认为对我们来说是一个问题(必须重新加载页面以刷新它)是通过一个简单的路由调用来处理让 javascript 刷新页面上的数据。抱歉,我没有更好的信息。 如何更改接口名称?WithName:@"interface" 【参考方案1】:原始 EasyJSWebView 存储库中存在错误。
只需使用此处的分叉:https://github.com/andiradulescu/EasyJSWebView
【讨论】:
这不起作用。你只是分叉了它,如果你做了一些修改,它并不能解决这里的问题......我尝试使用它但是每次重新加载 UIWebView 时,JavaScript 都会说它找不到变量。 @AdromilBalais 抱歉。我忘了提到,如果你想在重新加载后立即调用你的函数,你必须把它放在一个 1ms 的 setTimeout 内,因为注入是在页面加载后进行的,因此在注入完成之前变量将不存在。试试这个: setTimeout(function() yourJSInterface.yourFunction() , 1); 我尝试在我的 setTimeout 上设置 1 秒的差异(1000 毫秒),但这也没有解决问题。 @AdromilBalais 从这里尝试修改后的示例github.com/andiradulescu/EasyJSWebViewSample【参考方案2】:我不确定这是否是解决问题的最佳方法,但它适用于我的项目。我的方法是在每次重新加载或重定向请求之前创建一个新的 UIWebView。详情如下:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
//'isNotFirstLoad' marks if it is the fisrt load.
if (isNotFirstLoad)
//create an new webview
CGRect frame = _myWebView.frame;
[_myWebView removeFromSuperview];
_myWebView = [[EasyJSWebView alloc] initWithFrame:frame];
[self.view addSubview:_myWebView];
//init the new webview
_webView.delegate = self;
javaScriptInterface* interface = [javaScriptInterface new];
[self.webView addJavascriptInterfaces:interface WithName:@"interface"];
[_myWebView loadRequest:request];
//reset the firstload flag to load the new request
isNotFirstLoad = NO;
return NO;
isNotFirstLoad = YES;
return YES;
【讨论】:
以上是关于重新加载 webview 时 EasyJSWebView 中断的主要内容,如果未能解决你的问题,请参考以下文章
当 ViewPager 中的 Fragment 从 BackStack 保留时 WebView 重新加载
Objective C - WebView无法从顶部重新加载
React native - Webview 视频在父状态更改时重新加载