Widget iOS 8 today小部件在一段时间后停止工作

Widget iOS 8 today小部件在一段时间后停止工作,widget,ios8,ios-app-extension,Widget,Ios8,Ios App Extension,我为德国冰球联盟制作了一个今日小部件 我正在从服务器加载下一个游戏,并在tableView中显示它们。加载过程在建议的方法“widgetPerformUpdateWithCompletionHandler”中启动。最初,我在“ViewWillDisplay”中加载一些缓存数据 到目前为止一切都很好 但是过了一段时间(一天),小部件停止工作。当我打开通知中心时,小部件显示正常,但它不再更新。我必须从通知中心删除小部件,然后再次添加它。之后,小部件工作一天,然后再次停止工作 为了查看小部件列表正在

我为德国冰球联盟制作了一个今日小部件

我正在从服务器加载下一个游戏,并在tableView中显示它们。加载过程在建议的方法“widgetPerformUpdateWithCompletionHandler”中启动。最初,我在“ViewWillDisplay”中加载一些缓存数据

到目前为止一切都很好

但是过了一段时间(一天),小部件停止工作。当我打开通知中心时,小部件显示正常,但它不再更新。我必须从通知中心删除小部件,然后再次添加它。之后,小部件工作一天,然后再次停止工作

为了查看小部件列表正在做什么,我在“widgetPerformUpdateWithCompletionHandler”中加载数据时,在表视图上方添加了一个简单的白色视图,其中包含一个状态文本,以查看小部件是否正在做什么。当小部件工作时,白色视图出现。当它不工作时,状态视图不会出现。因此,我认为在通知中心小部件处于活动状态一段时间后,不会调用“widgetPerformUpdateWithCompletionHandler”方法


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

我也遇到了同样的问题,我通过调用
completionHandler(NCUpdateResultNoData)解决了这个问题
即使响应尚未返回,也会在网络请求之后立即执行。我发现如果未调用完成处理程序,则会调用
widgetPerformUpdateWithCompletionHandler

将不再被调用,因此不会有任何更新。另外,请确保在请求调用返回后在所有分支中调用完成处理程序。

正如其他人所提到的,这是由于在调用了
WidgetPerformUpdate WithCompletionHandler
之后没有调用
completionHandler
造成的您需要确保无论发生什么情况,都调用了
completionHandler

我建议的处理方法是将completionHandler保存为实例变量,然后在ViewDidEnglish中使用failed调用它:

@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);
}

在异步调用返回并使用NCUpdateResultNewData或NCUpdateResultNewData再次调用之前,使用WidgetPerformUpdate WithCompletionHandler中的NCUpdateResultNewData调用completionHandler似乎是可行的。

另一个问题是,一旦
WidgetPerformUpdate WithCompletionHandler:
被停止调用,永远不会有其他完成处理程序可调用。我没有找到方法再次进行系统调用
widgetPerformUpdateWithCompletionHandler:
。因此,请确保您的小部件也将尝试通过
视图重新加载数据。视图将显示:
作为备用,否则一些用户可能会被未加载的小部件卡住。

是的,我发现了相同的情况。我尝试了一些方法,发现当网络请求需要一段时间(糟糕的网络条件)时,不会再次调用widgetPerformUpdateWithCompletionHandler。我认为完成处理程序不知何故变得无效。您的解决方案会起作用,但这不是预期的方式。我通过根本不使用widgetPerformUpdateWithCompletionHandler解决了这个问题。我希望这个问题在将来得到解决。因此,如果不使用widgetPerformUpdateWithCompletionHandler,您将在其他地方调用您的网络请求?是的,我将在ViewDidDisplay中调用网络请求。因此,小部件不会在后台刷新,但每次用户打开它时都会刷新。调用ViewDidDisplay上的更新不是更新小部件的正确方法(至少不是苹果建议的方法)。即使使用widgetPerformUpdateWithCompletionHandler,每次打开小部件时都会刷新它。我也遇到同样的问题。我正在用completionHandler制作
widgetPerformUpdateWithCompletionHandler
方法中的块副本:
self.completionHandler=\u completionHandler。然后在异步任务完成时调用它。但是在一段时间后(几个小时?),小部件
viewDidLoad
被调用,但是
widgetPerformUpdateWithCompletionHandler
不再被调用。因此,我的小部件显示为空,高度约为50px。块拷贝不安全吗?还是应该在
viewDidLoad
中启动异步任务?我尝试了这样做,因为这似乎是一个明智的解决方案,可以确保始终调用完成块。遗憾的是,使用这种方法并不能完全解决问题。希望我能在这里像在reddit上一样给gold。每次调用widgetPerformUpdateWithCompletionHandler时,您是否也需要将hasSignaled重置为NO?遗憾的是,这就是我最后要做的,令人遗憾的是,即使在iOS 9中,也无法正确使用widgetPerformUpdateWithCompletionHandler。谢谢你的建议,这是唯一能帮我解决这个问题的方法。你是如何做到这一点的?我认为,如果没有适当的完成处理程序,系统将永远不会知道小部件已恢复运行,因此将完全依赖viewwillbeen调用?您是否进行过任何同步,以确保在正常运行时不会重复更新两次?