单击应用程序时加载推送通知数据

时间:2013-08-14 11:56:38

标签: iphone ios ipad

我通过推送通知实现了我的iPhone应用程序。我基本上成功实现了推送通知。当我点击推送通知消息时,该消息将显示在ViewController上的消息标签上。但是,当我打开图标(应用程序)时,它没有返回任何通知。我需要显示推送通知,不仅要点击推送通知,而且如果iOS用户也只是打开应用程序,它应该有效。

这是我的代码。

AppDelegate.m

 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary  
 *)launchOptions
  {

      [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
       (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

  }



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

     NSString *messageAlert = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];
     NSLog(@"Received Push Message: %@", messageAlert );

     [[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification"   object:messageAlert];

在我的ViewController.m

- (void)viewDidLoad
{

    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserverForName:@"MyNotification" object:nil queue:nil usingBlock:^(NSNotification *note) {
    NSString *_string = note.object;

    messages.text = _string; //message

}];
}
}

当我点击通知时,它会显示通知。但是当我打开应用程序时,通知也必须显示该消息。怎么做?请帮帮我。

3 个答案:

答案 0 :(得分:9)

推送通知主要有四种状态进入设备。让我们逐一考虑每个案例: -

CASE 1:当应用程序真正没有加载到内存中时(例如,当你启动它时,启动画面显示等),然后应用程序:didFinishLaunchingWithOptions被调用,你可以得到推送通知如下:

 NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

 if(remoteNotif)
 {
   //Handle remote notification
 }

案例2:如果应用程序已加载到内存中且处于ACTIVE状态(例如,应用程序当前在设备上打开)则只有应用程序:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo叫做。正常的,正如你在这种情况下说的那样成功。

案例3:如果应用程序已加载到内存但不是ACTIVE并且没有后台(例如,您启动了应用程序,然后按下主页按钮,等待10秒钟),然后您单击推送通知上的操作按钮,仅调用didReceiveRemoteNotification。遵循以下方法。

-(void)application:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if([app applicationState] == UIApplicationStateInactive)
    {
         //If the application state was inactive, this means the user pressed an action   button
         // from a notification. 

         //Handle notification
    }
}

案例4:当应用程序处于后台时,然后点击图标,然后根据Apple的文档,您无法检索所有待处理的通知。

注意:为了解决这个问题,Apple在iOS 7中引入了应用程序后台启动的概念。但到目前为止,你不能这样做,直到iOS 6开发你必须坚持下去。

希望这有助于你!

答案 1 :(得分:4)

当用户点按应用图标时,方法didReceiveRemoteNotification不会触发。您需要在应用程序中捕获通知:didfinishLauncingWithOptions。有点像这样:

NSDictionary *localNotif =
[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
NSLog(@"launchOptions: %@", launchOptions);
NSLog(@"localNotif: %@", localNotif);

if (localNotif) {
    NSDictionary *itemName = [localNotif objectForKey:@"aps"];
    NSLog(@"dict: %@, aps: %@", localNotif, itemName);

    //your methods to process notification

}

答案 2 :(得分:1)

你做不到。这就是apple document所说的:

  

如果在运行iOS的设备上轻触应用程序图标,则应用程序会调用相同的方法,但不会提供有关通知的信息。如果在运行OS X的计算机上单击应用程序图标,则应用程序将调用委托的applicationDidFinishLaunching:方法,其中委托可以获取远程通知负载。

您可能希望查看this question & answer