【问题标题】:Load UIWebView in a background fetch在后台获取中加载 UIWebView
【发布时间】:2013-11-10 10:08:49
【问题描述】:

短版:在我的应用程序后台 fetch 就像一个魅力,除了当我尝试在 web 视图中加载内容时它什么都不做!

长版:我在项目中设置了正确的能力,设置了获取间隔并实现了

- (void) application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

示例中的方法并且它有效。但是,为了完成我的后台获取,我需要在 UIWebView 中加载一些内容。这是行不通的。当我打电话时,这个过程会以某种方式“迷路”:

[myWebview loadRequest:request];

(当然它在前台工作,但在后台什么也不做)。

我还尝试强制将 webview 加载到主线程中,但随后系统会简单地停止它,直到应用程序返回前台模式(这是有道理的,我们在后台!)

那么,有办法在后台加载 UIWebView 吗?请注意,我不能简单地使用 NSURLSession 下载内容,因为网页包含加载某些框架的 javascript(我不能要求重新设计网页)。

编辑:可能是我写问题时不够认真,而是尝试在 后台执行 main_queue 中的任务(使用 dispatch_async 或类似的方法)提取 不起作用。问之前我试过了...

【问题讨论】:

  • 什么时候调用完成处理程序?
  • 网页视图加载完毕后我等待调用它,但加载甚至没有开始
  • 当您在后台运行时,Web 视图实际上是否在视图层次结构中(即它的 window 属性是否返回某些内容)?
  • 是的:我的目标是在应用程序处于后台时重新加载 webview(这是我的应用程序的主 UI),以便在用户将应用程序返回到前台时显示它是最新的。
  • 据我所知,如果 webview 不在视图层次结构中,则 webview 根本没有响应,当您执行 loadRequest 时,您的 webview 是否有 superView?我猜不是..

标签: ios uiwebview ios7


【解决方案1】:

当您想从用户界面更新元素时​​,您必须在应用程序的主队列(或线程)中访问它们。我建议您在后台继续获取所需的数据,但是当需要更新您的UIWebView 时,请在主线程中进行。你可以这样做:

    dispatch_async(dispatch_get_main_queue(), ^{

        // Load fetched data in the Web View

    });   

或者您可以创建一个方法来更新UIWebView 上的数据并使用以下方法从后台线程调用它:

[self performSelectorOnMainThread:@selector(method:) withObject:fetchedData waitUntilDone:YES];

这将确保您从正确的线程访问 UIWebView。

希望这会有所帮助。

【讨论】:

  • 不,它不起作用!我已经尝试过了,但是正如我所写的,如果我在主队列中加载 web 视图,块执行就会停止,直到应用程序返回前台(然后它立即开始,但当然为时已晚......)
  • 我的意思是你需要将你的代码分成两部分。一个从服务器获取数据(我相信您希望收到一些 html 和 javascript),另一个将获取的数据加载到UIWebView。第一部分应该从后台线程调用,这样它就不会阻塞用户界面,一旦你得到数据,你应该更新主线程中的UIWebView,以确保视图确实得到更新。考虑到这一点,使用[myWebview loadRequest:request];可能对您不起作用,您应该找到另一种方法来更新您的网络视图。
  • 我无法分离...我下载的 javascript 触发了更多的下载,所以我需要 web 视图来执行它们..
  • 我相信您可以使用loadData:MIMEType:textEncodingName:baseURL:,但老实说,我不确定这是否会按照您需要的方式运行 Javascript。如果是这样,它可能会解决您的问题。
  • 如果你像这里一样尝试使用 GCD 在多个线程上执行代码,你必须小心使用 dispatch_async 而不是 dispatch_sync,很容易错误地导致线程死锁,这会导致应用看起来像你描述的那样卡住了。显然,并非所有情况都需要 dispatch_async,但这种情况似乎是问题的根源。
【解决方案2】:

在 2013 年 11 月 11 日(iOS 7.0.3)看起来是不可能的。 我只是留下这个答案,这样人们就不会得到错误的信息。

如果您的应用程序在前台,但遗憾的是,在后台提取中,Eduardo Arenas Prada 的解决方案可以完美运行。

【讨论】:

  • 今天仍然如此:2014 年 4 月 27 日。
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2012-07-09
  • 1970-01-01
  • 2012-10-03
相关资源
最近更新 更多