4

我用推送通知实现了我的 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

}];
}
}

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

4

3 回答 3

9

进入设备的推送通知主要有四种状态。让我们一一考虑每种情况:-

CASE 1:当应用程序确实没有加载到内存中时(例如,当你启动它时,会出现启动画面等),然后调用 application:didFinishLaunchingWithOptions,你可以得到如下推送通知:

 NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

 if(remoteNotif)
 {
   //Handle remote notification
 }

案例 2:如果应用程序加载到内存中并且处于活动状态(例如,应用程序当前在设备上打开),则仅调用 application:(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:当应用程序在后台,然后点击 icon ,然后根据 Apple 的文档,您无法检索所有待处理的通知。

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

希望这对你有帮助!

于 2013-08-14T12:28:39.843 回答
4

当用户点击应用程序图标时,不会触发 didReceiveRemoteNotification 方法。您需要在 application: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

}
于 2013-08-14T12:14:37.583 回答
1

你不能。这是苹果文件所说的:

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

你可能想看看这个问题和答案

于 2013-08-14T12:15:18.107 回答