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

时间:2013-10-30 21:54:13

标签: ios apple-push-notifications

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

调试时,我在以下代码片段的第一行设置了一个断点:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
  NSDictionary *apnsPayload = [NSDictionary dictionaryWithDictionary:userInfo];

当应用收到推送通知时,它会到达断点并让我调试;在这一点上,我可以看到userInfo是非零并包含预期的字典。

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

2 个答案:

答案 0 :(得分:0)

我认为将NSDictionary转换为另一个带有[NSDictionary dictionaryWithDictionary:]的NSDictionary是不合理的...同时NSDictionary可以是非零但包含0个键条目(空字典)。

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

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

答案 1 :(得分:0)

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

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

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