推送通知处理

我正在阅读苹果的文档

处理本地和远程通知

看来我有相互矛盾的言论。 有人能澄清这些混乱点吗? 现在让我们严格地讲远程通知(与本地)。

该文档说,如果通知上的操作button被按下,它会调用application:didFinishLaunchingWithOptions并传入通知有效内容。 后来它说如果应用程序在前台运行,它通过application:didReceiveRemoteNotification:来传递通知。 这意味着,当应用程序背景或不运行,然后应用程序:didFinishLaunchingWithOptions被调用。 否则,应用程序:didReceiveRemoteNotification:被调用。

后来有一个iOS Note说:

“iOS注意:在iOS中,您可以通过检查应用程序状态来确定应用程序是由于用户点击操作button而启动的,还是通过检查应用程序状态来传递给已经运行的应用程序的,在代理实现应用程序:didReceiveRemoteNotification:或者application:didReceiveLocalNotification:方法,获取applicationState属性的值并进行评估,如果值为UIApplicationStateInactive,则点击actionbutton;如果值为UIApplicationStateActive,则应用程序在收到通知时处于最前面。 “

这意味着应用程序:didReceiveRemoteNotification:在应用程序已经被预先着手并且如果用户按下动作button(或者在iOS 5中滑动动作滑块)到前景/启动应用程序时被调用。

我的困惑的来源可能是第一部分文档意味着通知有效载荷与应用程序一起发送:didFinishLaunchingWithOptions:方法或误解“正在运行”的应用程序是什么(被认为是“正在运行”的后台应用程序?) 。 应用程序的文档:didReceiveRemoteNotification:声明它被称为“正在运行”的应用程序。

所以,总结一下,我可以澄清一下:

1)应用程序:didReceiveRemoteNotification:当应用程序被预先登陆或用户select对通知“执行”时总是调用? 如果不是的话,我们如何理解iOS的注意事项,以确定应用程序状态是处于活动状态还是非活动状态?

2)是一个后台应用程序“运行”,至less在文档声称应用程序的意义上:didReceiveRemoteNotification被称为运行的应用程序?

3)为了完成,是一个后台应用UIApplicationStateInactive或Active?

这里的措辞令人困惑,特别是在背景词语的背后。

当应用程序确实没有加载到内存中的时候(例如,当你启动它的时候会出现启animation面等),那么应用程序:didFinishLaunchingWithOptions被调用,你可以得到推送通知,如下所示:

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if(remoteNotif) { //Handle remote notification } 

如果应用程序在内存中加载并且处于活动状态(例如应用程序当前在设备上打开),则仅调用application:didReceiveRemoteNotification:

如果应用程序在内存中加载,但不是ACTIVE和NOT BACKGROUNDING(例如,您启动了应用程序,然后按住home键,等待10秒钟),然后单击推送通知上的操作button,只调用didReceiveRemoteNotification 。

你可以捕获这个案例如下:

 -(void)application:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo { if([app applicationState] == UIApplicationStateInactive) { //If the application state was inactive, this means the user pressed an action button // from a notification. //Handle notification } } 

根据iOS9.1的情况,我已经在杀死模式下testing了推送通知,在那里我的应用程序没有以任何模式运行,如果我点击推送通知,系统将首先调用,

 - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ //your code execution will here. } 

而第二个方法调用将是,

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Your initial code execution. } 

我已经在我的应用程序中testing了这个场景