调用此方法时的app状态是什么?

时间:2015-02-04 20:32:09

标签: ios objective-c xcode

我正在iOS应用中实现推送通知。

我应该显示一些自定义的View Controller,以防用户通过推送通知打开(假设应用已在后台运行)应用程序。

我正在实施此方法:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    UIApplicationState state = [[UIApplication sharedApplication] applicationState];

    if (state == UIApplicationStateActive)
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"PushNotificationReceived" object:self userInfo:userInfo];
    }
}

我检查了文档,它说这个方法会被调用,无论app是在后台还是前台。当应用程序即将进入前台时,系统可能会第二次调用它,所以我想知道,if(state == UIApplicationStateActive){}内部的代码是否会执行。

此外,已经有一些处理应用程序内部的推送通知:didFinishLaunchingWithOptions:,只在app启动时调用。我想我应该从那里删除它,它可能会显示View Controller两次。

如果您对此问题有经验,请告诉我您的意见。

2 个答案:

答案 0 :(得分:1)

实际上我没有明白你的观点。

如果应用处于有效状态,则

didReceiveRemoteNotification称为背景。那么为什么需要检查state

然后,如果应用程序位于后台,设备会收到推送通知,而不是用户点击该按钮,打开应用程序并调用该方法

否则,如果您打开应用而不点按通知,则该方法未被调用

答案 1 :(得分:1)

从Apple文档中获取相关方法:

//This method will be invoked even if the application was launched or resumed because of the remote notification. 
//The respective delegate methods will be invoked first.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);

因此,如果您实现上述委托方法,则应该 NOT 处理application:didFinishLaunchingWithOptions:中的推送通知,因为即使应用程序因为推送通知而刚刚启动,也会调用上述方法

只有当您的应用程序在收到推送通知时处于前台时,

[[UIApplication sharedApplication] applicationState]才会有值UIApplicationStateActive

对于在收到推送通知时您的应用程序处于后台或未运行的情况,有两种情况:

    在UIBackgroundModes中启用了
  1. remote-notification。在这种情况下,上述方法可以称为两次次。当刚刚向设备接收推送通知时,将使用具有值UIApplicationStateBackground的applicationState调用上述方法。如果用户点击显示的推送通知,则会再次调用该方法,这次具有applicationState值UIApplicationStateInactive
  2. 在UIBackgroundModes中未启用
  3. remote-notification。在这种情况下,当用户点击以显示推送通知时,该方法将被称为