29

我正在向我的 iPhone 应用程序发送推送通知,并且我希望根据应用程序是否已经启动来执行一组不同的指令。我是 iPhone 开发的新手,虽然我怀疑 UIApplication 或我项目的 AppDelegate 类有解决方案,但我还没有找到一个好的答案。有没有简单的方法来检查这个?

4

5 回答 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:.

于 2010-08-28T03:15:42.493 回答
26

根据“启动”的含义,您正在寻找:

  • 上面凯文的回答(区分启动或未启动)
  • 或者这个(区分暂停或活动,但已经启动):

使用一个标志,当应用程序变为活动时设置为 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”。

“完整”的答案实际上是凯文的答案加上这个答案。

希望这可以帮助。

于 2011-05-13T12:54:07.627 回答
18

UIApplication 委托有方法

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

您需要实施。这会在应用程序运行时收到通知。

如果您的应用程序当前未运行并且收到通知,则可以启动您的应用程序

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

使用 launchOptions 字典中保存的通知详细信息。如果字典为 nil,则用户正常点击应用程序图标。

于 2010-01-04T08:47:11.323 回答
6

如果您要在小于 4 的 iOS 上检查 applicationState,则需要检查 applicationState 是否受支持:

if ([application respondsToSelector:@selector(applicationState)] ){
  // Safe to check applicationState
  UIApplicationState state = [application applicationState];
}
于 2011-03-17T18:13:31.210 回答
2

推送通知的 Apple 文档解释了这一点:

但是,有两种情况 applicationDidFinishLaunching: 不是一个合适的实现站点:

  • 通知到达时应用程序正在运行。
  • 通知负载包含应用程序可以使用的自定义数据。

在第一种情况下,当 iPhone OS 接收到远程通知时应用程序正在运行,如果要立即下载数据,则应实现 UIApplicationDelegate 的 application:didReceiveRemoteNotification: 方法。下载后,请务必从应用程序图标中删除徽章。(如果您的应用程序经常向其提供者检查新数据,则可能不需要实施此方法。)

这意味着如果您的 application:didReceiveRemoteNotification: 委托方法被调用,您的应用程序正在运行。

于 2010-01-04T08:43:45.790 回答