6

我正在做一个项目,其中推送通知功能是关键功能之一。
当我在应用程序中时它工作正常,我收到通知并处理该通知。

但问题是当我在后台并收到通知时,我在我的应用程序图标上看到了徽章,当我点击我的应用程序正在启动的图标时,但didReceiveRemoteNotification没有调用该方法,因此我无法处理该通知。

另一个问题是有时它会显示通知消息,device notification list有时却没有。

当我通过单击通知列表项进入我的应用程序时didReceiveRemoteNotification,我可以成功处理通知。我写下面的代码didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method

NSDictionary* remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (remoteNotif != nil)
{
    NSLog(@"didFinishLaunchingWithOptions\nNotification recieved:\n%@",remoteNotif);

    notificationData=[[NSDictionary alloc]initWithDictionary:remoteNotif];
    [notif saveNotification:remoteNotif];
}

帮我解决这个问题。提前致谢。

4

3 回答 3

2

您在didfinishlaunch方法中所做的事情也在didReceiveRemoteNotification中进行。当您来自后台时,不会调用didfinishlaunch 。

- (void)application:(UIApplication*)application didReceiveRemoteNotification: 
(NSDictionary*)userInfo
{
         UIApplicationState state = [application applicationState];
         if (state == UIApplicationStateActive)
         { 
              //What you want to do when your app was active and it got push notification
         }
         else if (state == UIApplicationStateInactive) 
         {
              //What you want to do when your app was in background and it got push notification
         }
}
于 2013-08-06T10:14:28.850 回答
2

来自 Apple 的本地和推送通知编程指南

处理本地和远程通知

让我们回顾一下系统为应用程序传递本地通知或远程通知时的可能场景。

  1. 当应用程序未在前台运行时会发送通知。

    在这种情况下,系统会显示通知、显示警报、标记图标,可能还会播放声音。

    作为呈现通知的结果,用户点击警报的操作按钮或点击(或点击)应用程序图标。

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

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

  2. 当应用程序在前台运行时发送通知。

    应用程序调用其委托的 application:didReceiveRemoteNotification:方法(用于远程通知)或application:didReceiveLocalNotification:方法(用于本地通知)并传入通知负载或本地通知对象。

因此,在您的情况下,当应用程序在后台运行时,当您单击通知/警报时,操作系统会将您的应用程序置于前台。所以它属于第二点。

如果点击操作按钮,您可以实现application:didReceiveRemoteNotification:获取通知负载的方法。但是,当按下应用程序图标而不是操作消息时,通知有效负载不会使用该方法转发。您唯一的选择是联系您的服务器并同步数据。毕竟按照 Apple 的政策,推送通知只告诉服务器上有数据,无论哪种方式,您都需要连接到服务器并获取数据。

于 2013-08-06T10:28:13.943 回答
0

我在我的一个应用程序中做了同样的事情。单击应用程序图标时无法处理通知。因此,您可以做的是调用服务器以获取 latestPushNotificationIdSync。您必须将数据存储在服务器上的某个位置,因此,您需要在服务器上检查最新的 latestPushNotificationId 是什么。

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
     notificationContentDict = launchOptions;
      if([[launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"]count]>0){
            application.applicationIconBadgeNumber = 0;
            NSString *key = [[launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"] valueForKey:@"id"];

            contentId = key;

////// you can use this content id ///// write your code here as per the requirement ..////

    //// display your content on UI /// either get from server or local ...///
        [self displayContent:[launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"] application:application];

        }
       else
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
        return YES;
    }


    - (void)applicationDidBecomeActive:(UIApplication *)application
    {

        NSLog(@"badge count ..%d",  application.applicationIconBadgeNumber);

        if( application.applicationIconBadgeNumber >0){
            if(!notificationContentDict){

    make a server call to get "latestPushNotificationIdSync"


            application.applicationIconBadgeNumber = 0;
          NSLog(@"badge count applicationDidBecomeActive.%d",  application.applicationIconBadgeNumber);

        }

        }
    }
于 2013-08-06T10:22:01.997 回答