为啥我的 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 应用程序在尝试 presentModalViewController 时会崩溃?