Iphone iOS推送通知问题

Iphone iOS推送通知问题,iphone,ios,push-notification,apple-push-notifications,Iphone,Ios,Push Notification,Apple Push Notifications,我正在做一个项目,其中推送通知功能是关键功能之一。 当我在应用程序中时,它工作正常,我收到通知并处理该通知 但问题是当我在后台收到通知时,我会在我的应用程序图标上看到徽章 当我点击图标时,我的应用程序正在启动,但是没有调用didReceiveEmotentification方法,因此我无法处理该通知 另一个问题是,有时它会在设备通知列表中显示通知消息,有时则不会 当我通过点击通知列表项进入我的应用程序时,didReceiveEmotentification调用,我能够成功处理通知。 我在didf

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

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

另一个问题是,有时它会在设备通知列表中显示通知消息,有时则不会

当我通过点击通知列表项进入我的应用程序时,
didReceiveEmotentification
调用,我能够成功处理通知。 我在
didfishlaunchingwithoptions:(NSDictionary*)launchOptions方法中编写了以下代码

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

    notificationData=[[NSDictionary alloc]initWithDictionary:remoteNotif];
    [notif saveNotification:remoteNotif];
}
帮我解决这个问题。
提前感谢。

您在didfinishlaunch方法中正在做的事情也可以在DidReceiveMotonification中进行。 当您来自后台时,didfishlaunch将不会被调用

- (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
         }
}

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

   - (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);

        }

        }
    }
来自苹果的

处理本地和远程通知 让我们回顾一下系统交付本地服务时可能出现的场景 应用程序的通知或远程通知

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

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

    作为显示的通知的结果,用户点击操作 警报按钮或轻触(或单击)应用程序图标

    如果点击操作按钮(在运行iOS的设备上),系统 启动应用程序,应用程序调用其委托的
    应用程序:使用选项完成启动:
    方法(如果 实施);它传入通知有效负载(用于远程 通知)或本地通知对象(对于本地 通知)

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

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

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

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


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

    亲爱的,当您单击应用程序图标时,您无法处理远程通知。您的应用程序将调用已激活的方法,因此您可以做任何事情。谢谢您的回复,我同意当应用程序打开时,调用didBecomeActive方法来处理通知如何获取此NSDictionary*remoteNotif=[launchOptions objectForKey:UIApplicationLaunchActionsRemoteNotificationKey];词典