【问题标题】:How do I tell if my iPhone app is running when a Push Notification is received?收到推送通知时如何判断我的 iPhone 应用程序是否正在运行?
【发布时间】:2011-01-01 04:13:27
【问题描述】:

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

【问题讨论】:

    标签: iphone iphone-sdk-3.0 push-notification


    【解决方案1】:

    这是处理应用的活动/非活动状态的更合适的方法。

    - (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:

    【讨论】:

      【解决方案2】:

      根据您所说的“已启动”,您正在寻找:

      • 上面 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”。

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

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        UIApplication 委托有方法

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

        你需要实现的。这会在应用程序运行时收到通知。

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

        启动您的应用
        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
        

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-29
              • 1970-01-01
              • 2014-11-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多