iOS推送通知问题

时间:2013-08-06 09:27:02

标签: iphone ios push-notification apple-push-notifications

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

但问题是,当我在后台并收到通知后,我会在应用图标上看到徽章 当我点击我的应用程序正在启动的图标但未调用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];
}

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

3 个答案:

答案 0 :(得分: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
         }
}

答案 1 :(得分:2)

来自Apple的Local And Push Notification programming guide

  

处理本地和远程通知

     

让我们回顾一下系统交付本地的可能情况   通知或应用程序的远程通知。

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

         

    在这种情况下,系统会显示通知,显示一个   警告,标记图标,也许播放声音。

         

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

         

    如果点击操作按钮(在运行iOS的设备上),则系统   启动应用程序,应用程序调用其代理人   application:didFinishLaunchingWithOptions:方法(如果   实现);它传递通知有效负载(用于远程   通知)或本地通知对象(对于本地通知)   通知)。

         

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

  2.   
  3. 当应用程序在前台运行时会传递通知。

         

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

  4.   

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

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

答案 2 :(得分: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);

        }

        }
    }