2013-11-25 36 views
1

我设置与beginBackgroundTaskWithExpirationHandler后台任务:^ {}甚至使用结束UIApplicationState活跃在背景上的iOS 7

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。这是一个错误?我如何确定应用程序确实在后台?

回答

0

你可以尝试用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 
} 
+0

不,它不起作用,我已经有了。问题在于applicationWillResignActive:在后台任务退出之前未被调用。 –

+0

为了更好地说明问题,我需要检查应用程序是否真的处于UIApplicationStateActive状态并执行一些OpenGLES渲染。问题是,即使在使用beginBackgroundTaskWithApplicationHandler:^ {}的应用程序在后台执行时,应用程序状态仍为UIApplicationStateActive,即使在执行endBackgroundTask之后。你可以在消息的代码片段中看到。 –

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。