【问题标题】:iOS 9: Crash on -[_NSXPCDistantObject methodSignatureForSelector:]iOS 9:在 -[_NSXPCDistantObject methodSignatureForSelector:] 上崩溃
【发布时间】:2016-02-15 16:29:43
【问题描述】:

我遇到了一个奇怪的错误:

致命异常: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 ... 

所以看起来当应用程序进入前台时,一些注册的观察者尝试通过 RPC 重新连接 nsurlsessiond 并失败?我使用NSURLSession 进行了后台传输会话,但我无法重现它,所以我不确定它是否相关。

以前有人见过这个问题吗?我能做些什么来解决它吗?

【问题讨论】:

  • iOS 9 上有很多关于通知中心和 NSInvalidArgumentException 的崩溃报告。看起来崩溃发生在应用程序处于后台并且操作系统在某些数据仍在处理时破坏应用程序时。不确定这是否与您面临的错误相同。

标签: ios ios9 nsurlsession


【解决方案1】:

看起来像这里描述的 iOS 中的一个错误:https://forums.developer.apple.com/thread/45651#140745

AFAICT 这个崩溃是由 NSURLSession 的后台会话支持引起的。这会使用 NSXPCConnection(不是 iOS SDK 的一部分,而是 OS X 上的公共 API,因此您可以在那里阅读)将工作传递给它的守护进程 (nsurlsessiond)。 NSXPCConnection 有中断连接的概念,即客户端和服务器之间的 IPC 连接断开但可以重新建立。 NSURLSession 的后台会话支持,就像所有 NSXPCConnection 客户端一样,必须理所当然地处理这些中断。 唉,这样做的方式有一个错误。此错误是一种竞争条件,表现为此崩溃。我们希望在未来的操作系统版本中解决此问题,但我无法分享任何具体细节。

【讨论】:

  • 你真的应该用链接的内容编辑你的答案,以防链接失效。就目前而言,这是一个仅限链接的答案
【解决方案2】:

之前订阅UIApplicationWillEnterForeground 通知的某些内容似乎在没有取消订阅的情况下被释放,或者预期的接口不存在。

我会检查您的应用已订阅该通知的任何地方,并确保它正确地取消订阅,并确保引用的方法得到实施。

methodSignatureForSelector 失败表示NSNotificationCenter 想要调用通知的方法未实现。可能是缺少方法或错字。

【讨论】:

  • 感谢您的回答。问题是我不使用UIApplicationWillEnterForeground,而是因为提到nsurlsessiond 的异常文本,它似乎是Apple 在内部使用的东西。
猜你喜欢
  • 1970-01-01
  • 2015-12-29
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多