iOS 8今天的小部件在一段时间后停止工作

时间:2014-09-21 16:47:14

标签: widget ios8 ios-app-extension

我为德国冰球联盟DEL制作了今天的小部件。

我从我们的服务器加载下一个游戏并在tableView中显示它们。加载过程在建议的方法" widgetPerformUpdateWithCompletionHandler"中开始。最初我在" viewWillAppear"中加载一些缓存数据。

到目前为止一切都很好!

Screenshot of the working widget.

但过了一会儿(一天),小工具停止工作。当我打开通知中心时,窗口小部件显示正常,但它永远不会再次更新。我必须从通知中心删除小部件,并且必须再次添加它。之后,小部件可以工作一天,然后再次停止工作。

要查看小部件正在做什么,我在桌面视图上方添加了一个简单的白色视图,同时在" widgetPerformUpdateWithCompletionHandler"中加载数据。查看窗口小部件是否正在执行任何操作。小部件工作时会显示白色视图。当它不工作时,状态视图不会出现。所以我认为方法" widgetPerformUpdateWithCompletionHandler"在窗口小部件在通知中心活动一段时间后,不会调用它。

我不知道导致小部件停止工作的原因。有什么想法吗?

4 个答案:

答案 0 :(得分:19)

我遇到了同样的问题,我通过致电completionHandler(NCUpdateResultNoData);解决了这个问题 在您的网络请求后,即使没有返回响应。我发现如果没有调用完成处理程序widgetPerformUpdateWithCompletionHandler 将不再被调用,因此不再有任何更新。还要确保在请求调用返回后在所有分支中调用完成处理程序。

答案 1 :(得分:13)

正如其他人所提到的,这是因为在调用completionHandler之后没有事先调用widgetPerformUpdateWithCompletionHandler您需要确保completionHandler被调用,无论是什么

我建议处理这个问题的方法是将completionHandler保存为实例变量,然后在viewDidDisappear中调用它失败:

@property(nonatomic, copy) void (^completionHandler)(NCUpdateResult);
@property(nonatomic) BOOL hasSignaled;

- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
    self.completionHandler = completionHandler;
    // Do work.
}

- (void)viewDidDisappear:(BOOL)animated {
  [super viewDidDisappear:animated];
  if (!self.hasSignaled) [self signalComplete:NCUpdateResultFailed];
}

- (void)signalComplete:(NCUpdateResult)updateResult {
  NSLog(@"Signaling complete: %lu", updateResult);
  self.hasSignaled = YES;
  if (self.completionHandler) self.completionHandler(updateResult);
}

答案 2 :(得分:3)

另一个问题是,一旦widgetPerformUpdateWithCompletionHandler:被停止被调用,就永远不会有另一个完成处理程序来调用。我还没有办法让系统再次调用widgetPerformUpdateWithCompletionHandler:。因此,请确保您的小部件还会尝试通过viewWillAppear:重新加载数据作为后备,或者某些用户可能会遇到非加载小部件。

答案 3 :(得分:1)

在异步调用返回之前,在widgetPerformUpdateWithCompletionHandler中使用NCUpdateResultNewData调用completionHandler并使用NCUpdateResultNewData或NCUpdateResultFailed再次调用它似乎有效。