【问题标题】:beginBackgroundTaskWithExpirationHandler never gets calledbeginBackgroundTaskWithExpirationHandler 永远不会被调用
【发布时间】:2012-07-23 17:52:24
【问题描述】:

我有一个在后台播放音频的应用。当当前曲目完成时,我正在尝试使用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;

【问题讨论】:

    标签: iphone objective-c ios background-process uiapplication


    【解决方案1】:

    你实际上误解了函数 -(UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler

    名为“handler”的block参数是后台任务到期(10分钟)时会发生什么。

    要让您的代码运行,您需要将您的代码置于过期处理程序之外:

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

    这是documentation的链接

    【讨论】:

      【解决方案2】:

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

      [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];  
      

      【讨论】:

      • 我知道这是一篇旧帖子,但您能否确认您的回答允许您自动跳到下一首曲目?如果文件需要下载到bg中怎么办?我目前被卡住了。谢谢!
      【解决方案3】:

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

      Apple's docs

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          Swift 版本:

              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!)
          

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

              这就是你的全部代码吗?也许bgTask变量没有初始化,你需要在赋值之前声明bgTask。试试这个 -

              UIBackgroundTaskIdentifier bgTask = nil;
              

              【讨论】:

              • 我在尝试初始化时收到此错误...Incompatible pointer to integer conversion initializing 'UIBackgroundTaskIdentifier' (aka 'unsigned int') with an expression of type 'void *';
              • 顺便说一句,我在声明中进行了编辑,但没有将其设置为 nil。
              • UIBackgroundTaskIdentifierNSUInteger,而不是对象。将其设置为整数值,而不是 nil
              • @mnort9 是的,乔希是正确的。将UIBackgroundTaskIdentifier 初始化为整数,然后看看你得到了什么。
              • 我在 ViewDidLoad 中设置了 bgTask = 0beginBackgroundTaskWithExpirationHandler 仍然没有被调用。
              猜你喜欢
              • 2012-10-27
              • 2013-10-12
              • 2012-03-27
              • 2013-08-29
              • 2013-11-03
              • 1970-01-01
              • 1970-01-01
              • 2015-05-06
              • 2015-10-15
              相关资源
              最近更新 更多