【问题标题】:How to respond to push notification view if app is already running in the background如果应用程序已经在后台运行,如何响应推送通知视图
【发布时间】:2011-07-03 05:42:51
【问题描述】:

我想做一些相当简单的事情。我将一段自定义数据附加到我处理的一些推送通知中

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

我在寻找 UIApplicationLaunchOptionsRemoteNotificationKey,嘿,它就在那里。

只有在我的应用程序第一次启动时才会调用该方法。如果当通知进来并且用户按下通知上的“查看”按钮时我的应用程序已经在后台运行,我如何读取相同的键?我想将它们发送到一个特定的视图控制器并在其上打开该数据,就像我第一次从通知启动应用程序时所做的一样。

【问题讨论】:

    标签: ios multitasking apple-push-notifications


    【解决方案1】:

    在 iOS 7 及更高版本中查看application:didReceiveRemoteNotification:fetchCompletionHandler:


    如果您的应用在前台运行,则调用方法application:didReceiveRemoteNotification:。如果您的应用在后台运行并且用户参与您的推送通知(从而使您的应用处于活动状态),也会调用它。

    因此,真正的问题是如何确定应用程序是否在前台,或者它是否被与您的推送通知互动的用户激活。

    看起来this answer对问题didReceiveRemoteNotification when in background有关键:

    您可以使用以下代码在application:didReceiveRemoteNotification: 中判断您的应用是否刚刚被带到前台:

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    {
        if ( application.applicationState == UIApplicationStateActive )
            // app was already in the foreground
        else
            // app was just brought from background to foreground
        ...
    }
    

    【讨论】:

    • 如果应用程序在后台运行,则调用方法 `application:didReceiveRemoteNotification` 并不是很准确。更准确地说:如果应用程序是后台的,则只有在用户使用推送通知将其置于前台后才会调用该方法。如果用户取消/关闭推送通知,则不会调用委托方法。
    • 当设备收到通知(解锁)时会调用 didRecieveRemoteNotification,当用户单击通知视图时,很难(据我所知)确定用户是否实际单击了通知或该应用程序只是收到它。并且检查应用程序状态除了它的状态之外什么都不告诉你,如果用户点击了通知(根据我的经验)。
    • 在 iOS 7 中,使用 remote-notification 后台模式,我认为这种技术不再适用,因为应用程序可以在后台处理远程通知而不将其带到前台。那么如何判断它是否是从后台带到前台的呢?
    • 在 iOS 7 中,使用远程通知后台模式,如果我杀死我的应用程序并且它不再在后台并且推送通知来了,我可以看到横幅和徽章,但我没有得到回调 application:didReceiveRemoteNotification 或 application:didReceiveRemoteNotification:fetchCompletionHandler 方法。当我点击应用程序图标时,会调用 application:didFinishLaunchingWithOptions 回调,但我没有从 [notification userInfo] 获得播放负载。
    • 按照 Apple 的建议,尽可能在 iOS7 及更高版本上实现 application:didReceiveRemoteNotification:fetchCompletionHandler: 方法而不是这个方法。
    【解决方案2】:

    要检测应用是否被远程通知激活,试试这个:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (userInfo == NULL)
        {
            NSLog(@"didFinishLaunchingWithOptions user startup userinfo: %@", userInfo);
        }
        else
        {
            NSLog(@"didFinishLaunchingWithOptions notification startup userinfo: %@", userInfo);
        }
    }
    

    【讨论】:

    • 这不考虑应用程序启动的状态,而是在后台。问题实际上是在问什么。
    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多