8

我有一个在后台播放音频的应用程序。我正在尝试beginBackgroundTaskWithExpirationHandler在当前曲目完成后跳到下一首曲目。

这是播放状态更改时调用的代码。即使同一方法中的其他代码在后台成功实现,它也不会记录“beginBG called”。

UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [self ffwButtonPressed:ffwButton];
    NSLog(@"beginBG called");
    [app endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

ffwButtonPressed调用几种不同的方法来改变轨道。当那完成...

UIApplication *app = [UIApplication sharedApplication];
    if (bgTask != UIBackgroundTaskInvalid) {
        [app endBackgroundTask:bgTask]; 
        bgTask = UIBackgroundTaskInvalid;
        NSLog(@"end bgTask");

编辑:声明

UIBackgroundTaskIdentifier bgTask;

编辑:在 ViewDidLoad

bgTask = 0;
4

7 回答 7

30

您实际上误解了该功能 -(UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler

称为“处理程序”的块参数是后台任务到期(10 分钟)时会发生的情况。

要让您的代码运行,您需要将您的代码从过期处理程序中取出:

UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    bgTask = UIBackgroundTaskInvalid;
};

[self ffwButtonPressed:ffwButton];
NSLog(@"beginBG called");
[app endBackgroundTask:bgTask];

这是文档的链接

于 2012-07-25T17:24:53.513 回答
2

我最终根本不需要beginBackgroundTaskWithExpirationHandler。这条线解决了我的问题...

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];  
于 2012-07-24T15:39:35.707 回答
0

beginBackgroundTaskWithExpirationHandler 处理程序仅在计时器用完时调用,该值相当大。上面 Tomsum 提到的实际任务不应该是块的一部分。还记得调用 endBackgroundTask: 最后 if backGroundTaskID != UIBackgroundTaskInvalid 并且唯一需要在块中完成的事情是设置回任务变量 = UIBackgroundTaskInvalid

于 2013-10-02T09:34:47.227 回答
0

您的应用是否有权作为音频应用在后台运行?(需要在您的 Info.plist 中放置正确的模式)

查看Apple 的文档

于 2013-08-27T17:35:31.457 回答
0

可以稍作修改,我们应该在过期处理程序中添加 endBackgroundTask:

IApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
};

[self ffwButtonPressed:ffwButton];
NSLog(@"beginBG called");
[app endBackgroundTask:bgTask];
于 2020-04-05T10:21:40.127 回答
0

斯威夫特版本:

    var backgroundTask: UIBackgroundTaskIdentifier? = 0
    backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "backgroundTask", expirationHandler: {() -> Void in
        backgroundTask = UIBackgroundTaskInvalid
    })

    // Perform actions in background
    YOUR_CODE_GOES_HERE (e.g. fetch requests, etc.)

    UIApplication.shared.endBackgroundTask(backgroundTask!)
于 2018-10-19T15:13:12.977 回答
-1

这是你所有的代码吗?也许bgTask变量没有初始化,你需要在分配之前声明bgTask。尝试这个 -

UIBackgroundTaskIdentifier bgTask = nil;
于 2012-07-23T17:58:35.027 回答