如何知道当前设备是否可以具有后台模式

时间:2011-05-03 12:29:43

标签: iphone ios background uiapplication uidevice

我在进入后台模式后正在完成一些任务。我只想在背景模式下做这些任务,所以我做了:

if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground)

但是applicationState仅适用于iOS 4.0及更高版本......

我想知道这段代码如何在iOS 3上运行。

  • 我怎么知道设备是否有iOS 4?
  • 如何避免iOS的崩溃和异常< 4?

Thansk的帮助

Kheraud

2 个答案:

答案 0 :(得分:9)

您可以使用-respondsToSelector:

检查当前iOS是否支持返回当前的应用程序状态
if ([[UIApplication sharedApplication] respondsToSelector:@selector(applicationState)] ){
  UIApplicationState state = [[UIApplication sharedApplication] applicationState];
}

您可以通过专门检查后台支持来确定是否可以使用多任务支持(即使运行iOS 4或更高版本的设备可能没有支持多任务处理的硬件):

UIDevice* device = [UIDevice currentDevice];
BOOL backgroundSupported = NO;
if ([device respondsToSelector:@selector(isMultitaskingSupported)])
   backgroundSupported = device.multitaskingSupported;

您可以使用以下代码检索iOS版本(尽管您不应该依赖以下代码来推断后台支持):

float osVersion=[[[UIDevice currentDevice] systemVersion] floatValue];

最后,如果您想在进入后台模式后执行某些任务,您将需要利用以下事件:

- (void)applicationDidEnterBackground:(UIApplication *)application

..但请注意,您的时间将非常有限。你将有大约五秒的时间做任何你想做的事情。如果您需要更多,可以尝试向iOS寻求更多时间:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIApplication*    app = [UIApplication sharedApplication];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Do the work associated with the task.

        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

请注意,在这种情况下,您可能会被iOS授予更多时间,但它仍然是一个有限长度的时间。

Apple的Executing Code in the Background值得一读。

答案 1 :(得分:0)

我发现此链接对于理解如何处理3.1和> 4.0 OS版本非常有用:

Developing iPhone Apps with iOS4 SDK, Deploying to 3.x Devices : Base SDK and iPhone OS Deployment Target