2012-02-07 133 views
2

我正在处理涉及推送通知的一个iPhone应用程序。正如我在许多文件和教程已经看到它提出了推送通知与注册在当应用程序未运行时获取推送通知iPhone

application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

类似如下:

- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert| UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound]; 

    ... 
} 

现在的问题是,如果应用程序没有运行(甚至在背景),当推送到达时,它不能处理推送消息,但是如果我再次使用来自通知区域的推送消息并再次将应用程序中餐,我可以收到我的消息。

我需要做些什么才能使我的应用程序即使在第一次午餐时也能获得推送消息?

+0

你怎么去推送到设备您注册之前,拿到了钥匙和它发送到你的服务器有关系吗? – mattjgalloway 2012-02-07 21:39:29

+0

如果应用程序在过去使用过,我的服务器将跟踪设备令牌,所以即使它当时没有损坏,我也可以发送一个推送。但现在问题出现在应用程序第一次启动时。它正在尝试注册以通知不处理通知。我怎么能解决这个问题? – shebelaw 2012-02-07 21:42:39

+0

挂在什么?我想你已经弄糊涂了。见@ warrenm的答案。 – mattjgalloway 2012-02-07 21:53:36

回答

6

您可能会混淆注册和接收通知的概念。在第一次调用registerForRemoteNotificationTypes:方法之前,应用程序无法接收推送通知,因为此方法首先提供用于发送推送通知的推送令牌。

因此,您必须在两种不同的情况下讨论接收通知:初次启动应用程序和执行程序期间。

为了处理第一种类型的通知,您必须检查发送到application:didFinishLaunchingWithOptions:options字典。以下代码显示了如何将启动时收到的通知路由到在应用程序已经运行时推送通知到达时调用的委托方法。

将此放在您的application:didFinishLaunchingWithOptions:覆盖:

NSDictionary *pushNotificationPayload = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 
if(pushNotificationPayload) { 
    [self application:application didReceiveRemoteNotification:pushNotificationPayload]; 
} 
+0

是的,这可能是正确的解决方案,我会测试它。谢谢Warrenm – shebelaw 2012-02-07 21:45:08

+0

是的,这是正确的解决方案,但是如果我想要alert('UIAlert'放置在'didReceiveRemoteNotification'方法内),用户将点击App图标而不是推送通知将会出现! – 2013-05-02 09:42:46

+0

您可能有更好的运气发布此作为一个新的问题,而不是作为对超过一年的答案的评论。 – warrenm 2013-05-03 03:24:27

相关问题