【问题标题】:UIApplicationState active in background on iOS 7UIApplicationState 在 iOS 7 上的后台活动
【发布时间】:2013-11-25 19:14:32
【问题描述】:

我使用 beginBackgroundTaskWithExpirationHandler:^{ } 设置了一个后台任务,甚至在使用结束任务之后

    if ([[UIDevice currentDevice] isMultitaskingSupported]) {
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
    backgroundTaskID = UIBackgroundTaskInvalid;
    }

    NSLog(@"App State -- %d", [[UIApplication sharedApplication] applicationState]);


    if([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive)
    {
       //OpenGL operations
    }

我得到的是 UIApplicationStateActive。这是一个错误吗?我如何才能确定该应用确实在后台?

【问题讨论】:

    标签: ios ios7 multitasking uiapplication backgrounding


    【解决方案1】:

    与其依赖 applicationState 值,不如在后台任务结束时发布自定义通知?

    设置为您的自定义通知的观察者:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backgroundTaskDidFinish:) name:@"BackgroundTaskDidFinish" object:<either nil or the object that will post the notification>];
    }
    

    在后台任务完成时发布您的自定义通知

    if ([[UIDevice currentDevice] isMultitaskingSupported]) {
        [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
        backgroundTaskID = UIBackgroundTaskInvalid;
        [[NSNotificationCenter defaultCenter] postNotificationName:@"BackgroundTaskDidFinish" object:self]
    }
    

    响应通知,当您的应用真正恢复到活动状态时应该收到通知

    - (void)backgroundTaskDidFinish:(NSNotification *)notification
    {
       //OpenGL operations
    }
    

    或者,您可以查找表明您的应用真正处于活动状态的其他通知消息之一。

    例如,将您的对象添加为 UIApplicationWillEnterForeground 的观察者。当您收到该通知时设置一个 BOOL 值。然后,查找该 BOOL 值以及 UIApplicationState 值。

    当然,在某些时候,您必须清除 BOOL - 例如,当您开始该后台任务时 - 所以除非应用确实激活,否则它将为 NO。

    【讨论】:

      【解决方案2】:

      你可以尝试用 NSNotification 来判断:

      - (void)viewDidLoad {
      [super viewDidLoad];
      UIApplication *app = [UIApplication sharedApplication];
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
      }
      - (void)applicationWillResignActive:(NSNotification *)notification {
      //do what you want when your app is in background
      }
      

      【讨论】:

      • 不,它不起作用,我已经有了。问题是 applicationWillResignActive: 在后台任务退出之前没有被调用。
      • 为了更好地说明问题,我需要检查应用程序是否真的处于 UIApplicationStateActive 状态并进行一些 OpenGLES 渲染。问题是,如果我使用 beginBackgroundTaskWithApplicationHandler:^{},即使应用程序在后台执行,应用程序状态仍保持 UIApplicationStateActive,即使在执行 endBackgroundTask 之后也是如此。可以在消息中的代码sn-p中看到。
      猜你喜欢
      • 2014-10-08
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      相关资源
      最近更新 更多