对于iOS今日小部件,"来自pid 42的主机连接<NSXPCConnection:0x538ee0>连接无效"

ryn*_*019 12 widget objective-c ios

我正在开发一个iOS今天的小部件,而且功能非常强大.但是,在真正的 iOS设备上运行时,我偶尔会看到: host connection <NSXPCConnection: 0x538ee0> connection from pid 42 invalidated

这似乎不是一个主要的问题,除了在发生这种情况时窗口小部件似乎几乎重新加载,偶尔会将今日屏幕中的空格留空,直到iOS重绘它并重新加载所有内容.

有人遇到过这种情况么?我在我的应用程序中根本没有使用NSXPCConnection,所以我假设这是构建在框架中的东西,但我不确定

bll*_*akk 9

NSXPCConnection API用于在Xcode客户端和iPhone上的应用程序之间执行进程间连接.所以你不必担心这个.

链接: https ://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html

因此,可能有两个原因导致窗口小部件被终止.

  1. 你需要调用completionHandler(NCUpdateResultNoData); 即使尚未返回响应,也会在调用widgetPerformUpdateWithCompletionHandler之后立即调用.

  2. 您的应用因终止自动应用而终止.它终止了小部件/应用程序有两个原因:

一个.它终止未使用的应用程序并允许回收内存等资源.

湾 它终止了使用太多内存的小部件.


ben*_*lis 5

最后找出了我的小部件问题.事实证明这与NSXPCConnection无关,而是代表我对Widget生命周期的误解.

从文档中我认为今天的视图将保持我的窗口小部件状态的"快照",直到成功调用widgetPerformUpdateWithCompletionHandler方法完成处理程序.

似乎并非如此.从我所看到的情况来看,"今日视图"动画时(当用户拉下通知中心时)就会使用"快照".加载今天视图并静止后,您的小部件将从头开始加载(如果使用则从xib中膨胀)并调用viewDidLoad.此时,您应该使用缓存数据(而不是Web请求)填充窗口小部件.如果不这样,您将看到笔尖的临时数据.这是导致闪烁的原因.

当viewDidLoad完成时,将调用widgetPerformUpdateWithCompletionHandler,它允许您获取新数据.获取新数据时,您应该调用完成处理程序并缓存数据,以便稍后从头开始加载窗口小部件时可以使用它(在viewDidLoad中).

缓存数据的简单方法是用户默认值.

希望这可以帮助.