Подтвердить что ты не робот

IOS 9: Crash on - [_ NSXPCDistantObject methodSignatureForSelector:]

Я получаю странную ошибку:

Фатальное исключение: исключение NSInvalidArgumentException *** - [_ NSXPCDistantObject methodSignatureForSelector:]: протокол подключения не установлен для обслуживания имени com.apple.nsurlsessiond "

Эта проблема возникает только в iOS 9. Согласно трассировке стека ошибка запускается вызовом -[UIApplication _sendWillEnterForegroundCallbacks].

Thread : Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 6485512008 __exceptionPreprocess
1  libobjc.A.dylib                6833323904 objc_exception_throw
2  CoreFoundation                 6485511824 -[NSException initWithCoder:]
3  Foundation                     6500536092 -[_NSXPCDistantObject methodSignatureForSelector:]
4  CoreFoundation                 6485526892 ___forwarding___
5  CoreFoundation                 6484495532 _CF_forwarding_prep_0
6  CoreFoundation                 6485141004 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__
7  CoreFoundation                 6485138988 _CFXRegistrationPost
8  CoreFoundation                 6485138348 ___CFXNotificationPost_block_invoke
9  CoreFoundation                 6485554212 -[_CFXNotificationRegistrar find:object:observer:enumerator:]
10 CoreFoundation                 6484354836 _CFXNotificationPost
11 Foundation                     6500543948 -[NSNotificationCenter postNotificationName:object:userInfo:]
12 UIKit                          6577878356 -[UIApplication _sendWillEnterForegroundCallbacks]
   continues ... 

Итак, похоже, что когда приложение войдет на передний план, какой-то зарегистрированный наблюдатель пытается повторно подключиться к nsurlsessiond через RPC и не удается? Я выполняю сеанс переноса фона, используя NSURLSession, но я не могу воспроизвести его, поэтому я не уверен, связано это или нет.

Кто-нибудь видел эту проблему раньше? Есть ли что-нибудь, что я могу сделать, чтобы решить эту проблему?

4b9b3361

Ответ 1

Похож на ошибку в iOS, описанную здесь: https://forums.developer.apple.com/thread/45651#140745

AFAICT этот сбой вызван поддержкой вспомогательной сессии NSURLSessions. Это передает работу своему демону (nsurlsessiond), используя NSXPCConnection (не часть SDK iOS, но открытый API для OS X, поэтому вы можете прочитать об этом там). NSXPCConnection имеет понятие прерывания соединений, то есть соединение IPC между клиентом и сервером разрывается, но может быть восстановлено. Поддержка вспомогательной сессии NSURLSessions, как и все клиенты NSXPCConnection, должна обрабатывать эти прерывания, как само собой разумеющееся. Увы, проблема в том, как это происходит. Эта ошибка - это состояние гонки, которое проявляется в этом крахе. Мы надеемся исправить это в будущей версии ОС, но я не могу поделиться конкретными деталями.

Ответ 2

Похоже, что то, что ранее подписалось на уведомления UIApplicationWillEnterForeground, было освобождено без отмены подписки или что ожидаемого интерфейса нет.

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

Не удалось methodSignatureForSelector указать, что метод, который NSNotificationCenter хочет вызвать с уведомлением, не реализован. Может быть недостающий метод или опечатка.