iOS 9:在[_NSXPCDistantObject methodSignatureForSelector:]上崩溃

29

我遇到了一个奇怪的 bug:

致命异常:NSInvalidArgumentException *** -[_NSXPCDistantObject methodSignatureForSelector:]:连接到名为 com.apple.nsurlsessiond 的服务上未设置协议

这个问题似乎只在 iOS 9 上出现。根据堆栈跟踪,这个 bug 是由对 -[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 进行后台传输会话,但我无法复现这个问题,所以我不确定它是否与此有关。

有人遇到过这个问题吗?有什么方法可以解决它吗?


3
在iOS 9上,关于通知中心和NSInvalidArgumentException的崩溃报告很多。看起来当应用程序在后台运行时,操作系统在一些数据仍在处理时销毁了应用程序,导致崩溃发生。不确定是否与你面临的问题相同。 - Alex Machado
2个回答

11

看起来这是iOS上的一个bug,详情请参考https://forums.developer.apple.com/thread/45651#140745

据我所知,这个崩溃是由NSURLSession的后台会话支持引起的。它使用NSXPCConnection将工作传递给其守护进程(nsurlsessiond),NSXPCConnection不是iOS SDK的一部分,但在OS X上是公共API,因此您可以在那里阅读相关信息。NSXPCConnection具有中断连接的概念,也就是说,客户端和服务器之间的IPC连接已经中断但可以重新建立。像所有NSXPCConnection客户端一样,NSURLSession的后台会话支持必须按照惯例处理这些中断。 不幸的是,它在处理中断时存在一个bug。这个bug是一个竞态条件,表现为这个崩溃。我们希望在未来的操作系统版本中修复这个bug,但我无法分享任何具体的细节。


如果链接失效,您应该编辑您的答案并包含链接内容。目前来看,这只是一个仅有链接的回答。 - JAL

0

看起来之前订阅了 UIApplicationWillEnterForeground 通知的某个对象在未取消订阅的情况下被释放了,或者期望的接口不存在。

我建议检查一下你的应用程序是否有任何地方订阅了该通知,并确保它正确地取消订阅,并且所引用的方法已经实现。

如果出现 methodSignatureForSelector 的错误,则表示 NSNotificationCenter 想要使用该通知调用的方法未被实现。可能是缺少方法或拼写错误。


谢谢您的回答。问题是我没有使用UIApplicationWillEnterForeground,而是这似乎是苹果内部使用的一种方式,因为异常文本中提到了nsurlsessiond - bcattle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接