38

我正在阅读 Apple 的文档

处理本地和远程通知

在我看来,有相互矛盾的陈述。有人可以清除这些混淆点吗?现在让我们严格地谈谈远程通知(相对于本地)。

文档说,如果按下通知上的操作按钮,它会调用 application:didFinishLaunchingWithOptions 并传入通知有效负载。后来它说如果应用程序在前台运行,它会通过 application:didReceiveRemoteNotification: 传递通知。这对我来说意味着当应用程序在后台运行或未运行时,会调用 application:didFinishLaunchingWithOptions。否则,调用 application:didReceiveRemoteNotification:。

后来,有一个 iOS Note 说如下:

"iOS 注意:在 iOS 中,您可以通过检查应用程序的状态来确定应用程序是否由于用户点击操作按钮而启动,或者通知是否已传递到已运行的应用程序。在委托的应用程序实现中:didReceiveRemoteNotification: 或 application:didReceiveLocalNotification: 方法,获取 applicationState 属性的值并评估它,如果值为 UIApplicationStateInactive,则用户点击了操作按钮;如果值为 UIApplicationStateActive,则应用程序在收到通知时位于最前面。 "

这对我来说意味着 application:didReceiveRemoteNotification: 在应用程序已经处于前台时以及如果用户按下操作按钮(或在 iOS 5 中滑动操作滑块)以前台/启动应用程序时调用。

我的困惑的根源可能在于文档暗示通知有效负载与 application:didFinishLaunchingWithOptions: 方法一起发送的第一部分,或者对“正在运行”的应用程序的误解(后台应用程序是否被视为“正在运行”?) . application:didReceiveRemoteNotification: 的文档声明它被称为“运行”应用程序。

所以,总而言之,我能否澄清一下:

1) application:didReceiveRemoteNotification: 是否总是在应用程序处于前台或用户选择对通知“采取行动”时调用?如果不是,我们如何理解 iOS Note 关于确定应用程序状态是活动还是非活动的意义?

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

3) 为了完成,后台应用程序 UIApplicationStateInactive 还是 Active?

4

2 回答 2

92

这里的措辞令人困惑,尤其是围绕背景这个词。

当应用程序确实没有加载到内存中时(例如,当您启动它时会显示启动画面等),然后调用 application:didFinishLaunchingWithOptions,您可以获得推送通知,如下所示:

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if(remoteNotif)
{
    //Handle remote notification
}

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

如果应用程序已加载到内存中但不是 ACTIVE 且不是背景(例如,您启动了应用程序,然后按下主页按钮,并等待 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
    }
}
于 2012-04-24T21:28:24.607 回答
2

根据 iOS 9.1 场景,我已经在 Kill 模式下测试了推送通知,如果我点击推送通知,我的应用程序当时没有以任何模式运行,而不是系统首先调用,

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

//your code execution will here.

}

第二个方法调用将是,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//Your initial code execution.

}

我在我的应用程序中测试过这个场景。

于 2015-12-17T05:23:50.817 回答