"подключение хоста <NSXPCConnection: 0x538ee0> соединение из pid 42 недействительно" для виджета iOS Today

Я работаю над виджетами iOS сегодня, и все довольно функционально. Однако при работе на iOS-устройстве реального я иногда вижу: host connection <NSXPCConnection: 0x538ee0> connection from pid 42 invalidated

Это не кажется серьезной проблемой, за исключением того, что виджет, похоже, почти перезагружается, когда это происходит, иногда оставляя пробел на экране "Сегодня" до тех пор, пока iOS не перерисовит его, и все будет перезагружено.

Кто-нибудь еще столкнулся с этим? Я не использую NSXPCConnection вообще в своем приложении, поэтому я предполагаю, что это что-то встроенное в фреймворк, но я не уверен

Ответ 1

API NSXPCConnection используется для выполнения межпроцессного соединения между клиентом Xcode и вашим приложением на iPhone. Поэтому вам не нужно беспокоиться об этом.

Ссылка https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html

Таким образом, может быть две причины, по которым ваш виджет завершен.

  • Вам нужно вызвать completeHandler (NCUpdateResultNoData); сразу после того, как ваш widgetPerformUpdateWithCompletionHandler был вызван даже тогда, когда ответ не был возвращен.

  • Ваше приложение прекращается из-за автоматического закрытия приложения. Он завершает работу с виджетами/приложениями по двум причинам:

а. Он закрывает приложения, которые не используются, и рекультивация ресурсов, таких как память.

б. Он закрывает виджеты, которые используют слишком много памяти.

Ответ 2

Наконец-то выяснилось, что я имел с моим виджетами. Оказывается, это не связано с NSXPCConnection, а скорее с неправильным пониманием жизненного цикла Widget от моего имени.

Из документации я подумал, что представление сегодняшнего дня будет содержать "моментальный снимок" моего состояния виджетов до тех пор, пока обработчик завершения метода widgetPerformUpdateWithCompletionHandler не будет вызван с успехом.

Это, похоже, не так. Из того, что я вижу, "моментальный снимок" используется только тогда, когда анимация Today View анимируется (когда пользователь отключает центр уведомлений). Как только сегодняшнее представление загружается и фиксируется, ваш виджет загружается с нуля (раздувается от xib при использовании) и вызывается viewDidLoad. На данный момент вы должны заполнить свой виджет кэшированными данными (не из веб-запроса). Если вы этого не сделаете, вы увидите временные данные из вашего наконечника. Это и вызывает мигание.

Когда viewDidLoad завершен widgetPerformUpdateWithCompletionHandler, который позволяет вам получать свежие данные. При получении новых данных вы должны вызывать обработчик завершения и кэшировать данные, которые он может использовать, когда виджет загружается позже с нуля (в viewDidLoad).

Простой способ кэширования данных - по умолчанию пользователя.

Надеюсь, что это поможет.