【问题标题】:push notification handling推送通知处理
【发布时间】:2012-04-25 06:54:33
【问题描述】:

我正在阅读 Apple 的文档

Handling Local and Remote Notifications

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

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

后来,有一个 iOS Note 说:

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

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

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

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

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

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

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

【问题讨论】:

  • 我可以打勾吗?

标签: ios push-notification


【解决方案1】:

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

当应用程序确实没有加载到内存中时(例如,当您启动它时,会显示启动画面等),然后调用 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
    }
}

【讨论】:

  • 在您解释的第一种情况下是否调用了didReceiveRemoteNotification?在您编写的两种方法中实现我的代码就足够了吗?代码不会运行两次吗?谢谢。
  • 这不正确:例如,如果通知中心可见或控制中心可见,则该应用程序被视为不活动。您对如何确定“从后台变得活跃”有什么建议吗?
  • 还要注意同样的行为与 didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);
  • 这里的好答案似乎正在处理其他一些问题:stackoverflow.com/questions/5835806/… 基本上检查应用程序是否在后台处于非活动状态:if (state == UIApplicationStateBackground || state == UIApplicationStateInactive )。对此进行一些工作可能会满足所有不同的情况
  • 如果我点击主页按钮和发送通知会怎样。我看到了通知,但我选择点击应用程序图标,而不是通知。我的应用会不知道通知吗?
【解决方案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.

}

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

【讨论】:

  • 你是如何测试这个场景的,请解释一下?
  • Nico,我已经打印了Log in document directory文件来检查,在推送通知的kill模式下会调用哪一种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 2014-09-24
相关资源
最近更新 更多