Objective c iOS 11与bundleProxy崩溃!=使用UNUserNotificationCenter时无错误

Objective c iOS 11与bundleProxy崩溃!=使用UNUserNotificationCenter时无错误,objective-c,crash,ios11,unusernotificationcenter,Objective C,Crash,Ios11,Unusernotificationcenter,以下代码行是我们的应用程序在iOS 11/11.0.1/11.0.2/11.1.1/11.2上突然开始崩溃的地方,对于某些用户来说: UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; 我们在didfishlaunchingwithoptions中得到了这个。事故报告说: Fatal Exception: NSInternalInconsistencyException

以下代码行是我们的应用程序在iOS 11/11.0.1/11.0.2/11.1.1/11.2上突然开始崩溃的地方,对于某些用户来说:

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
我们在
didfishlaunchingwithoptions
中得到了这个。事故报告说:

Fatal Exception: NSInternalInconsistencyException
Invalid parameter not satisfying: bundleProxy != nil

Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 0x1869b3d38 __exceptionPreprocess
1  libobjc.A.dylib                0x185ec8528 objc_exception_throw
2  CoreFoundation                 0x1869b3c0c +[NSException raise:format:]
3  Foundation                     0x187342c24 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
4  UserNotifications              0x18fcc973c -[UNUserNotificationCenter initWithBundleProxy:]
5  UserNotifications              0x18fcc950c __53+[UNUserNotificationCenter currentNotificationCenter]_block_invoke
6  libdispatch.dylib              0x186339048 _dispatch_client_callout
7  libdispatch.dylib              0x18633c710 dispatch_once_f$VARIANT$mp
8  UserNotifications              0x18fcc94ac +[UNUserNotificationCenter currentNotificationCenter]

它显然是从iOS传来的。还有其他人遇到同样的错误吗?知道发生了什么吗?

我不确定这是否适用于所有人,但我已经为我的用例找到了答案。我已经创建了一个iOS应用程序使用的框架。此框架正在使用
UNUserNotificationCenter
设置警报。似乎出于某种原因,当从框架内部使用此代码时,“bundle”没有正确初始化。有时有效,有时无效。听起来,bundleProxy是通知框架所依赖的某种代理。因为代码是从框架内部执行的,所以可能在运行时找不到这个包,系统返回nil。在尝试从捆绑包位置不正确的框架加载资源时,我通常会遇到这个问题

无论如何,我的解决方案是在应用程序启动时将对
[UNUserNotificationCenter currentNotificationCenter]
的引用存储在应用程序的委托中,然后将其传递给想要使用它的任何方法。当应用程序完成启动时,如果调用的代码是应用程序本身的二进制代码,那么这个
代理似乎可以正确加载。这似乎为我解决了问题

为什么
[UNUserNotificationCenter currentNotificationCenter]
有时会崩溃吗

根据崩溃堆栈跟踪,UNUserNotificationCenter的私有init方法中的bundleIdentifier为nil,并引发异常。我不知道为什么

不幸的是,该方法是在
dispatch\u once
上下文中调用的,因此我们无法轻松重现此崩溃。首先,我尝试使用NSBundle的方法:
NSBundle.mainBundle.bundleIdentifier
,但失败了。我猜系统没有使用此方法获取bundleIdentifier,因此我尝试使用UNUserNotificationCenter的私有init方法
initWithBundleIdentifier:(String)
,它工作并试图将nil传递给此方法,这导致了100%的时间崩溃!!!!因此,我们可以在加载文件时使用此方法,如果
bundleIdentifier==nil
,则返回nil,希望这对您有所帮助

----------------代码-----------------

/*UNUserNotificationCenter+Hack*/
@实施联合国信息中心(Hack)
+(空)荷载{
静态调度一次;
发送一次^{
[自保钩];
});
}
+(无效)保险钩{
/*使用BundleIdentifier钩住UNUserNotificationCenter的systemMethod初始化:*/

/*private method mix,hope no runtime checkOneSignal也遇到过这种情况。他们的修复方法是检查当前进程名称,并检查其中是否包含
IBDesignable
,以便尽早返回。这对我也很有效


对于那些在这里使用PacketTunnelProvider NetworkExtension的人,如果你从带有原因的停止隧道调用它,可能会发生这种情况。取而代之的是在之前获取
currentNotificationCenter
并保存它。

你找到它了吗?没有,仍然看到它crashes@SamJarman我想我也遇到了同样的问题bundleProxy!=nil断言失败。导致它的调用是UNUserNotificationCenter.current()在AppDelegate.didFinishLaunching中,这似乎是你的建议。你能发布你的代码吗?不,但正如所解释的,确保你的代码没有在框架内运行。如果是,你需要从你的应用程序的委托传递一个引用。它在一个框架内,而在应用程序的委托中,我正试图获得不正确的通知ionCenter.current(),但这是调用失败的原因。此解决方案很好,但不能完全解决问题。使用此方法后,我的一些用户仍会偶尔遇到崩溃。崩溃问题是
无效参数不满足:bundleProxy!=nil