当收到推送通知时,我该如何判断我的iPhone应用程序是否正在运行?

29

我正在向我的iPhone应用发送推送通知,我希望根据应用程序是否已启动来执行不同的指令。我对iPhone开发不熟悉,虽然我认为UIApplication或者我的项目的AppDelegate类可能有解决方案,但我没有找到一个好的答案。是否有一种简单的方法来检查这个问题?

5个回答

76

以下是更恰当的处理应用程序活动/非活动状态的方法。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {   
        // check for the app state
        UIApplicationState state = [application applicationState];

        if (state == UIApplicationStateActive) {
            //the app is in the foreground, so here you do your stuff since the OS does not do it for you
            //navigate the "aps" dictionary looking for "loc-args" and "loc-key", for example, or your personal payload)
        }

    application.applicationIconBadgeNumber = 0;
}

didReceiveRemoteNotification:会在应用程序运行时调用,但是当应用程序处于挂起状态时,iOS会负责显示应用程序的徽章等。如果应用程序在前台,则操作系统不会执行任何操作,只会调用您的didReceiveRemoteNotification:方法。


26

根据您对“启动”一词的理解,您要找的可能是:

  • 上面的Kevin的答案(区分是否已启动)
  • 或者这个(区分挂起或活动状态,但已经启动):

使用一个标记来表示应用程序何时处于活动状态(设置为 true),何时不处于活动状态(设置为 false)。

标记(在头文件 [.h] 中):

BOOL applicationIsActive;

代码(在实现文件 [.m] 中):

- (void)applicationDidBecomeActive:(UIApplication *)application {
    applicationIsActive = YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    applicationIsActive = NO;
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if (applicationIsActive) {
        // Handle notification in app active state here
    }
    else {
        // Handle notification in app suspended state here
    }

这能够运行是因为应用程序被挂起时,在“唤醒”过程中,操作系统在调用“applicationDidBecomeActive”之前会调用“applicationDidReceiveRemoteNotification”。

实际上,“完整”的答案是Kevin的回答再加上这个回答。

希望这可以帮到你。


18

UIApplication委托有一个方法

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

你需要实现的是接收通知的功能。当应用程序正在运行时,它将接收到该通知。

如果你的应用程序当前没有运行,并收到一条通知,则可以通过以下方式启动你的应用程序:

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

如果`launchOptions`字典中保存有通知的详细信息,则表明用户是通过通知打开应用;如果该字典为空,则表示用户像平常一样通过点击应用图标打开应用。


6

如果您要在iOS 4以下检查应用程序状态,您需要检查是否支持应用程序状态:

if ([application respondsToSelector:@selector(applicationState)] ){
  // Safe to check applicationState
  UIApplicationState state = [application applicationState];
}

2
苹果的推送通知文档解释如下:
然而,有两种情况下applicationDidFinishLaunching:不是一个合适的实现位置:
1.当通知到达时应用程序正在运行。
2.通知负载包含应用程序可以使用的自定义数据。
在第一种情况下,即iPhone OS接收到远程通知时应用程序正在运行,如果要立即下载数据,则应实现UIApplicationDelegate的application:didReceiveRemoteNotification:方法。下载后,请务必从应用图标中删除徽章。(如果您的应用程序经常检查其提供者是否有新数据,则可能不需要实现此方法。)
这意味着如果调用了您的application:didReceiveRemoteNotification:委托方法,则您的应用程序正在运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接