我有一个要求,我的应用程序连接到国家频道(美国)并开始从该频道播放记录。这基本上是一个由用户运营的频道,用户将他们的记录上传到频道并逐一播放。连接到频道的用户开始收听频道。
服务器向 iOS 应用程序发送需要通过套接字播放的记录的 URL,iOS 应用程序创建以一一AVQueuePlayer
播放 URL(使用)。AVPlayerItems
如果我在频道充满记录近 1 天左右时将应用程序保持在后台,该应用程序将继续运行并继续一一播放所有记录。我知道它AVQueuePlayer
会一直运行应用程序而不会杀死它,因为它会收到新的播放器项目来玩。
但是如果频道中没有记录,并且如果用户连接到频道,那么如果应用程序的空闲时间超过 10 分钟,则应用程序不会在后台播放记录。
我编写了带有后台任务标识符的代码,它使我的套接字连接保持打开状态,以便可以一直接收新的记录 URL。
我在我的设备中看到了一些崩溃报告,上面写着"AppName(my app) has active assertions beyond permitted time"
所以我能知道这里发生了什么问题。
我也在发布后台任务代码
- (void)keepBroadcastPersistentConnection {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if(self._bgTaskIdentifier)
self._bgTaskIdentifier = UIBackgroundTaskInvalid;
self._bgTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{
[[UIApplication sharedApplication] endBackgroundTask:self._bgTaskIdentifier];
self._bgTaskIdentifier = UIBackgroundTaskInvalid;
CGLog(@"========================================end bg task at time %@", [NSDate date]);
CGLog(@"Time taken by app to run in bg is %f seconds", [[NSDate date] timeIntervalSinceDate:self.date]);
}];
[[BroadcastSocketConnecter sharedSocketConnecter].socketIO sendHeartbeat]; // this keep the socket alive
self.date = [NSDate date];
CGLog(@"========================================begin bg task at time %@", self.date);
});
}
谢谢