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

Wil*_*o X 22 widget ios8 ios-app-extension

我为德国冰球联盟DEL做了一个今天的小部件.

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

到目前为止,一切都很好!

工作小部件的屏幕截图.

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

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

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

Siy*_*eng 19

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

  • 同样的问题对我来说.我在`widgetPerformUpdateWithCompletionHandler`方法中复制了块:`self .completionHandler = _CompletionHandler;`.然后我在异步任务完成时调用它.但是经过一段时间(几个小时?)后,调用了widget`viewDidLoad`,但不再调用`widgetPerformUpdateWithCompletionHandler`.所以我的小部件显示为空,高度约为50px.块复制不安全吗?或者我应该在`viewDidLoad`中启动我的异步任务? (3认同)

Big*_*esy 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经这样做了,但一段时间后小部件也停止工作了.. (2认同)