获得PN但是应用程序:应用程序didReceiveRemoteNotification:选择应用程序图标时不会触发

时间:2012-05-17 00:51:48

标签: objective-c xcode apple-push-notifications

我看到了推送通知的特殊行为,并且想知道是否有人对我做错了什么或应该做什么有任何建议。

我的application:(UIApplication*)application didReceiveRemoteNotification:写如下:

- (void)application:(UIApplication*)application didReceiveRemoteNotification: (NSDictionary*)userInfo
{
NSLog(@"Received notification: %@", userInfo);
[self addMessageFromRemoteNotification:userInfo updateUI:YES];
} 

正如您所看到的,我并不担心应用程序的状态。我只想在收到PN时记录一条消息。

我的设置符合Apple的文档,我可以收到推送通知。

以下是PN进入时的预期行为:

  • 应用程序在后台,我点击通知:我可以在通知中心看到通知。点击通知,应用程序到达前台,我可以看到上面的方法被调用。
  • 应用已处于有效状态并且已经在前台:我可以看到调用上述方法。

现在,以下是我所看到的特殊行为:

  • PN进来。在通知中看到它,请参阅应用图标上的徽章。我点击了应用图标 - 而不是通知:在这个例子中,我发现上面的方法是不是。我原以为它会被称为......

之前有没有人见过这种行为?这应该发生什么?我在Apple文档中看不到有关此内容的任何内容......此外,还有解决方法吗?

3 个答案:

答案 0 :(得分:2)

如果该应用未在后台运行,但最初是通过推送通知启动的,并且您已实施 didFinishLaunchingWithOptions:,则需要在那里实施您的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
    if (launchOptions != nil) {
        NSDictionary* userInfo = [launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
        if (userInfo != nil) {
            NSDictionary* apsInfo = [userInfo objectForKey:@"aps"];
            NSString* custom = [userInfo objectForKey:@"yourCustomPushData"];
            // do something with it
        }
    }
    //...
}

答案 1 :(得分:2)

我有同样的行为。它让我疯狂,但我认为这就是iOS的工作方式。

以下摘自苹果文档。这是关于应用程序:当应用程序未运行时didFinishLaunchingWithOptions。当应用程序处于background / didReceiveRemoteNotification时,它看起来是一样的。

“如果点击操作按钮(在运行iOS的设备上),系统将启动应用程序并且应用程序调用其委托的应用程序:didFinishLaunchingWithOptions:方法(如果已实现);它传入通知有效负载(用于远程通知)或本地通知对象(用于本地通知)。

如果在运行iOS的设备上轻触应用程序图标,则应用程序会调用相同的方法,但不会提供有关通知的信息。 “ 从: http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html#//apple_ref/doc/uid/TP40008194-CH103-SW1

答案 2 :(得分:0)

Mrj's不适用于我的情况所以我尝试了以下选项

如果应用程序不在后台,您应该使用以下代码

   //-------------- check notification when app is come to foreground after apllication get terminated ----------------//

UILocalNotification *localNotif =

[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if (localNotif) {

    [self handleRemotNotification:[launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"]]; // private method


}