2

进入后台模式后,我正在执行一些任务。我只想在后台模式下执行这些任务,所以我这样做了:

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

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

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

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

谢谢你的帮助

赫罗德

4

2 回答 2

9

您可以通过使用检查当前iOS是否支持返回当前应用程序状态-respondsToSelector:

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 可能会(或不)授予您更多时间,但这仍然是有限长度的时间。

苹果的后台执行代码值得一读。

于 2011-05-03T12:31:05.583 回答
0

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

使用 iOS4 SDK 开发 iPhone 应用程序,部署到 3.x 设备:基础 SDK 和 iPhone OS 部署目标

于 2011-05-13T12:42:41.233 回答