1

我知道我在拉稻草,但希望得到答案。

我有一个应用程序需要在后台与服务器通信,无需用户干预。当推送通知到达时或至少定期(每 5 分钟左右)。

我可能会附加位置更新并将其发送到服务器。我什至可以证明使用粗略的位置是合理的,因此 Apple 会批准它。在最坏的情况下,我将支付 299 美元购买企业开发者许可证并使用本地发行版(我唯一关心的发行版)。

我最后的希望是使用 NSTimer 定期调度后台任务。 使用此方法的应用程序是否仍受 Apple 对允许的后台任务类型的限制?(媒体/位置/网络电话/报亭/外部设备)这似乎是如此歧视......

PS。该应用程序现在在 ipod touch 上以开发模式运行,包括与服务器的定期通信。就后台模式而言,我没有在 plist 中声明任何内容。这是否意味着我没事?

4

1 回答 1

1

我已经实施了以下内容,并于昨天获得了苹果的批准。我的应用程序不执行(媒体/位置/voip/报亭/外部设备)

通过在 applicationDidEnterBackground 中使用以下代码,您可以获得 600 秒(10 分钟)的最大时间:

if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4
if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking
UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance
__block UIBackgroundTaskIdentifier background_task; //Create a task object
background_task = [application beginBackgroundTaskWithExpirationHandler: ^ {
    [application endBackgroundTask: background_task]; //Tell the system that we are done with the tasks
    background_task = UIBackgroundTaskInvalid; //Set the task to be invalid
    //System will be shutting down the app at any point in time now
}];
//Background tasks require you to use asyncrous tasks
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //Perform your tasks that your application requires
    NSLog(@"\n\nRunning in the background!\n\n");
    [application endBackgroundTask: background_task]; //End the task so the system knows that you are done with what you need to perform
    background_task = UIBackgroundTaskInvalid; //Invalidate the background_task
});
}

}

文档可以在这里找到http://disanji.net/iOS_Doc/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

我刚刚实现了 backgroundTaskIdentifier 对象并使 background_task 无效以检查时间,应用程序处于活动状态并且正在运行 600 秒。你甚至可以使用这个来获得剩余时间

NSLog(@"Time remaining: %f", application.backgroundTimeRemaining);
于 2013-03-09T06:08:47.080 回答