1

当后台任务即将到期时,iOS 应用程序可以安排本地通知吗?基本上,当应用程序使用 NSOperationQueue 进入后台时,我有一些服务器端正在进行下载。
我想要的是在后台任务即将完成时通过本地通知通知用户。以便用户可以将应用程序带到前台以继续继续服务器数据下载
下面是我正在使用的代码,但我没有看到任何本地通知

UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
           /*TO DO
            prompt the user if they want to continue syncing through push notifications. This will get the user to essentially wake the app so that sync can continue.
             */
            // create the notification and then set it's parameters
            UILocalNotification *beginNotification = [[[UILocalNotification alloc] init] autorelease];
            if (beginNotification) {
                beginNotification.fireDate = [NSDate date];
                beginNotification.timeZone = [NSTimeZone defaultTimeZone];
                beginNotification.repeatInterval = 0;
                beginNotification.alertBody = @"App is about to exit .Please bring app to background to continue dowloading";
                beginNotification.soundName = UILocalNotificationDefaultSoundName;
                // this will schedule the notification to fire at the fire date
                //[app scheduleLocalNotification:notification];
                // this will fire the notification right away, it will still also fire at the date we set
                [application scheduleLocalNotification:beginNotification];
            }

            [application endBackgroundTask:self->bgTask];
            self->bgTask = UIBackgroundTaskInvalid;
        });
    }];
4

2 回答 2

5

我相信你的代码的问题是dispatch_async调用。这是文档中的一些内容:

-beginBackgroundTaskWithExpirationHandler:
(...) 处理程序在主线程上同步调用,因此在通知应用程序时暂时阻止应用程序的挂起。

这意味着您的应用程序在此到期处理程序完成后立即暂停。您在主队列上提交异步块,因为这实际上是主队列(请参阅文档),它将稍后执行

解决方案不是调用dispatch_async,而是直接在这个处理程序中运行该代码。

我看到的另一个问题是,在过期处理程序中通知用户为时已晚,应该在过期之前完成(比如一分钟左右)。backgroundTimeRemaining您只需要在达到您的时间间隔后定期检查并显示此警报。

于 2012-10-17T12:38:26.173 回答
0

你的代码永远不会被执行,因为你安排你的代码在未来运行,然后你通过endBackgroundTask:. 此外,到期处理程序在主线程上调用,因此您可以简单地将代码放在那里并避免这种情况dispatch_asyncperformSelectorOnMainThread:foobar.

于 2012-07-10T12:56:07.827 回答