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
, но я не могу воспроизвести его, поэтому я не уверен, связано это или нет.
Кто-нибудь видел эту проблему раньше? Есть ли что-нибудь, что я могу сделать, чтобы решить эту проблему?
Ответы
Ответ 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
хочет вызвать с уведомлением, не реализован. Может быть недостающий метод или опечатка.