使用iOS Sender API Framework,当我的应用程序进入后台时,SDK会断开所有连接,并且在将应用程序放回前台之前我无法再启动任何媒体。我的应用程序播放音频,允许在后台运行和流式传输。是否可以选择告诉Googlecast框架保持套接字打开?
这里是登录背景:
信息:将辞职活动
信息:现在在后台
精细: - [GCKCastSocket断开]断开连接
精细: - [GCKCastSocket doTeardownWithError:] doTeardownWithError
FINE: - [GCKCastSocket doTeardownWithError:]通知委托,套接字已断开连接
精细: - [GCKHeartbeatChannel didDisconnect]已断开连接 - 必要时停止心跳计时器
精细: - [GCKCastSocket socketDidDisconnect:withError:] socketDidDisconnect:withError:"(null)"
然后当应用程序恢复时: 信息:进入前景
精细: - [GCKCastSocket doTeardownWithError:] doTeardownWithError
FINE: - [GCKCastSocket doTeardownWithError:]通知委托,套接字已断开连接
精细: - [GCKCastSocket connectToHost:port:withTimeout:]连接到" 192.168.1.4"在8009l港口......
信息:变得活跃了
精细: - [GCKCastSocket socket:didConnectToHost:port:] socketDidConnect:
精细: - [GCKCastSocket socketDidSecure:] socketDidSecure:
FINE: - [GCKCastSocket socket:didReadData:withTag:]前缀读取,预期消息长度= 1307
精细: - [GCKDeviceAuthChannel didReceiveBinaryMessage:]正版Google设备didDeviceAuthenticated = YES
精细: - [GCKDeviceManager deviceAuthChannelDidAuthenticate:]真实设备,连接接收器通道
FINE: - [GCKCastSocket socket:didReadData:withTag:]前缀读取,预期消息长度= 474
精细: - [GCKDeviceManager receiverControlChannel:didReceiveStatusForApplication:]要加入的应用程序(CC1AD845)
精细: - [GCKDeviceManager connectAndNotifyDidConnectToApplication:launchApplication:]连接到应用程序< 0x1467c8f0:GCKApplicationMetadata>默认媒体接收器(CC1AD845),传输ID web-11
FINE: - [GCKCastSocket socket:didReadData:withTag:]前缀读取,预期消息长度= 135
精细: - [GCKMediaControlChannel didReceiveTextMessage:]收到的消息:{" type":" MEDIA_STATUS"," status":[]," requestId& #34;:6}
答案 0 :(得分:2)
使用iOS Sender API 2.0版时,GCKCastSocket
在收到UIApplicationDidEnterBackgroundNotification
后关闭,而这不是可以配置的内容。
这意味着:
替代品(仅限自定义接收器):
有关详细信息,另请参阅this question或this one。
答案 1 :(得分:0)
这是我用于其他需求的解决方案,但我想它也可以在这里应用(尚未测试)
<强> 1。创建后台任务处理程序为dispatch_block_t,假设
dispatch_block_t myDummyBackgroundTaskBlock = {
[[UIApplication sharedApplication] endBackgroundTask:myDummyBackgroundTask];
myDummyBackgroundTask = UIBackgroundTaskInvalid;
myDummyBackgroundTask = [app beginBackgroundTaskWithExpirationHandler:myDummyBackgroundTask];
};
<强> 2。定义此背景和前台任务处理程序的某处
// foreground
-(void)handleTasksForApplicationInForeground {
if(myDummyBackgroundTask) { // reset that task
[[UIApplication sharedApplication] endBackgroundTask: myDummyBackgroundTask];
myDummyBackgroundTask = UIBackgroundTaskInvalid;
}
}
// background
-(void) handleTasksForApplicationInBackground {
UIDevice *device = [UIDevice currentDevice];
BOOL backgroundSupported = NO;
if ([device respondsToSelector:@selector(isMultitaskingSupported)])
backgroundSupported = device.multitaskingSupported;
if(backgroundSupported && backgroundEnabled) { // perform a background task
myDummyBackgroundTaskBlock = ^{
[[UIApplication sharedApplication] endBackgroundTask: myDummyBackgroundTaskBlock];
myDummyBackgroundTaskBlock = UIBackgroundTaskInvalid;
};
SEL sel = @selector(doDummyBackgroundTask);
[self doBackgroundTaskAsync:sel];
[self performSelector:@selector(doBackgroundTaskAsync:) withObject:nil afterDelay:500.0f]; /// LP: this is the funny part since iOS will kill the task after 500 sec.
}
}
3。现在让我们在应用程序中处理委托后台模式(在您可以使用app .plist中的不同选项激活后台模式之前定义):
-(void)applicationDidEnterBackground:(UIApplication *)application {
[self handleTasksForApplicationInBackground];
}
-(void)applicationWillEnterForeground:(UIApplication *)application {
[self handleTasksForApplicationInForeground];
}
4。让我们看一下后台异步任务选择器的作用
-(void) doBackgroundTaskAsync:(SEL)selector {
@try {
if( [[UIApplication sharedApplication] backgroundTimeRemaining] < 5 ) {
return;
}
if(!myDummyBackgroundTaskBlock) { // need to create again on-the-fly
myDummyBackgroundTaskBlock = ^{
[[UIApplication sharedApplication] endBackgroundTask:myDummyBackgroundTask];
myDummyBackgroundTask = UIBackgroundTaskInvalid;
};
}
myDummyBackgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:myDummyBackgroundTaskBlock];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
while ([[UIApplication sharedApplication] backgroundTimeRemaining] > 5.0) {
int delta = 5.0;
[self performSelector: selector ];
sleep(delta);
}
});
}
@catch (...) {
}
}