为啥我的 iOS 应用程序在收到推送通知时会崩溃?

Posted

技术标签:

【中文标题】为啥我的 iOS 应用程序在收到推送通知时会崩溃?【英文标题】:Why does my iOS app crash when receiving a push notification?为什么我的 iOS 应用程序在收到推送通知时会崩溃? 【发布时间】:2013-10-30 21:54:13 【问题描述】:

我的 ios 应用在运行时收到推送通知消息时崩溃。我正在使用沙盒 APNS 环境,并使用 Amazon SNS 发送 APNS 消息。

调试的时候,我在下面代码sn -p的第一行设置了断点:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

  NSDictionary *apnsPayload = [NSDictionary dictionaryWithDictionary:userInfo];

当应用收到推送通知时,它会触发断点并让我进行调试;此时我可以看到 userInfo 不是 nil 并且包含预期的字典。

但是,当我单步执行代码时,应用程序崩溃并在下一行显示 EXC_BAD_ACCESS — 分配给 apnsPayload。似乎userInfo 可能会过早地被释放,但我不确定为什么,或者更重要的是如何改变它。

【问题讨论】:

你试过NSDictionary *apsInfo = [userInfo objectForKey: @"aps"];吗?这就是我从 userInfo 中提取 aps 字典的方式。 我有;请参阅我对以下答案的评论。 【参考方案1】:

我认为用 [NSDictionary dictionaryWithDictionary:] 将 NSDictionary 变成另一个 NSDictionary 是没有意义的……而且 NSDictionary 可以是非零但包含 0 个键条目(一个空字典)。

也许你想要: NSDictionary *apnsPayload = [userInfo objectForKey: @"alert"]; ?

见:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

【讨论】:

我正在这样做,结果相同;我发布的 sn-p 是徒劳的试图“更安全”。我在调试时观察到的userInfo 字典包含所有预期的数据。【参考方案2】:

好吧,我仍然不知道为什么会发生这种情况,但是当我首先NSLog() userInfo 参数时它会停止。添加以下行作为函数的第一行可以防止崩溃:

  NSLog(@"Received APNS with userInfo %@", userInfo);

然后我可以使用- [userInfo objectForKey:] 进行分配而不会导致崩溃。 (需要明确的是,在没有之前的 NSLog() 的情况下尝试相同的分配会导致 EXC_BAD_ACCESS 崩溃。)

【讨论】:

请通过编辑将问题附加到原始问题,而不是将其作为答案发布。 :) 什么问题?我说我找到了解决方案。 (诚​​然不是一个很好的解决方案,这就是为什么我还没有接受任何答案;但代码确实可以运行。) 对不起,我的误解了。

以上是关于为啥我的 iOS 应用程序在收到推送通知时会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

收到推送通知时 iOS 13 崩溃?

为啥我无法在 iOS 10 中处理收到的推送通知?

当我的应用程序进行电池优化时,为啥我无法收到推送通知?

为啥我的 iOS 应用程序在尝试 presentModalViewController 时会崩溃?

为啥我的 Flutter 应用在​​ iOS 上启动时会崩溃?

iPhone 应用程序在收到推送通知时崩溃