我读苹果的文档上
处理本地和远程通知
而在我看来有矛盾说法。 有人可以清理这些混乱点? 我们讲的严格远程通知(相对于本地)现在。
该文件说,如果按通知上的操作按钮,它调用应用中:didFinishLaunchingWithOptions并将通知有效载荷。 后来人们说,如果应用程序是在前台运行,它提供了通过应用程序的通知:didReceiveRemoteNotification :. 这意味着对我说,当应用程序被后台或没有运行,那么应用中:didFinishLaunchingWithOptions被调用。 否则,应用程序:didReceiveRemoteNotification:被调用。
后来,有一个iOS的纸条,上面写着以下内容:
“iOS版注:在iOS中,您可以决定一个应用程序被启动,是用户轻敲动作按钮或结果的通知是否通过检查应用程序的状态传递到已经运行的应用程序在代理的执行的应用程序。 :didReceiveRemoteNotification:或应用:didReceiveLocalNotification:方法,得到applicationState属性的值,并评估它如果该值是UIApplicationStateInactive,用户轻敲动作按钮;如果该值是UIApplicationStateActive,应用程序是最前面的,当它接收到该通知。 “
这意味着,我认为应用程序:didReceiveRemoteNotification:被称为既当应用程序已经前景化,如果用户按下操作按钮(或滑动滑块行动iOS 5中)到前台/启动应用程序。
我的问题的根源可能出在该文档暗示的通知有效载荷与应用程序发送的第一部分:didFinishLaunchingWithOptions:方法中或与“跑”的应用是什么误会(被认为是转到后台应用程序“跑”?) 。 didReceiveRemoteNotification:为应用程序的文档指出它被称为为“正在运行”的应用程序。
因此,要总结,我能得到澄清:
1)是应用:didReceiveRemoteNotification:当应用程序被前景化总是叫或当用户选择的通知“行为”? 如果没有,我们怎么做的iOS注意的意义上确定应用程序的状态是活性或非活性?
2)为背景执行的应用程序“运行”,至少在文档声称申请的意义:didReceiveRemoteNotification被调用正在运行的应用?
3)完成,是一个背景执行的应用程序UIApplicationStateInactive或Active?
这里的措辞是混乱的,特别是在字backgrounding。
如果是真正的没有加载到内存中的应用程序(E,G,当你启动它的启动画面显示出来等),然后应用中:didFinishLaunchingWithOptions被调用时,你可以得到推送通知如下:
NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(remoteNotif)
{
//Handle remote notification
}
如果应用程序被加载到内存中并且是活动的(例如该应用是目前设备上打开),那么仅application:didReceiveRemoteNotification:
被调用。
如果应用程序被加载到内存中,但不活动状态,未BACKGROUNDING(例如,你启动应用程序,然后按下home键,等待10秒),然后你点击一个推送通知的动作按钮,只有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
}
}
按照iOS的9.1情景我已经杀模式下测试推送通知在我的应用程序是不以任何方式在那个时候运行,如果我在推送通知自来水比系统会先打电话,
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
//your code execution will here.
}
而第二个方法调用会,
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//Your initial code execution.
}
这种情况下我在我的应用程序已经测试。