我正在开展一个项目,其中推送通知功能是关键功能之一 当我在应用程序中时,它正常工作,我收到通知并处理该通知。
但问题是,当我在后台并收到通知后,我会在应用图标上看到徽章
当我点击我的应用程序正在启动的图标但未调用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];
}
帮我解决这个问题。 提前谢谢。
答案 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
处理本地和远程通知
让我们回顾一下系统交付本地的可能情况 通知或应用程序的远程通知。
当应用程序未在前台运行时,会发送通知。
在这种情况下,系统会显示通知,显示一个 警告,标记图标,也许播放声音。
作为呈现通知的结果,用户点击该动作 警报按钮或点击(或点击)应用程序图标。
如果点击操作按钮(在运行iOS的设备上),则系统 启动应用程序,应用程序调用其代理人
application:didFinishLaunchingWithOptions:
方法(如果 实现);它传递通知有效负载(用于远程 通知)或本地通知对象(对于本地通知) 通知)。如果在运行iOS的设备上点击应用程序图标,则应用程序调用相同的方法,但不提供任何信息 关于通知。如果单击应用程序图标 运行OS X的计算机,应用程序调用委托 委托可以的
applicationDidFinishLaunching:
方法 获取远程通知有效载荷。- 醇>
当应用程序在前台运行时会传递通知。
应用程序调用其委托
application:didReceiveRemoteNotification:
方法(用于远程 通知)或application:didReceiveLocalNotification:
方法 (用于本地通知)并传递通知有效负载或 本地通知对象。
因此,在您的情况下,当应用程序在后台运行时,当您单击通知/警报时,操作系统会将您的应用程序置于前台。所以它属于第二点。
如果点击操作按钮,您可以实施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);
}
}
}