重新加载 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 中断的主要内容,如果未能解决你的问题,请参考以下文章

当蓝牙断开连接或重新连接时,我的webview会重新加载

当 ViewPager 中的 Fragment 从 BackStack 保留时 WebView 重新加载

Objective C - WebView无法从顶部重新加载

React native - Webview 视频在父状态更改时重新加载

带有 Javascript 的 WebView 不断重新加载

SwiftUi 按钮操作重新加载 WebView