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];词典