使用iOS发件人API框架,当我的应用程序在后台运行时,SDK会撕毁所有的连接,在应用程序被放回前台之前,我不能再启动任何媒体。我的应用程序播放音频,允许在后台运行和流。有没有办法告诉Googlecast的框架让套接字保持打开?
下面是背靠背的日志:
信息:将辞职活跃
信息:现在是背景
精细:-GCKCastSocket断开连接
罚款:-GCKCastSocket doTeardownWithError: doTeardownWithError
罚款:-GCKCastSocket doTeardownWithError:通知委托套接字已断开
好的:-GCKHeartbeatChannel didDisconnect断开-如果需要的话停止心跳定时器
罚款:-GCKCastSocket套接字socketDidDisconnect:withError: socketDidDisconnect:withError:"(null)“
然后,当应用程序恢复: INFO:进入前台时
罚款:-GCKCastSocket doTeardownWithError: doTeardownWithError
罚款:-GCKCastSocket doTeardownWithError:通知委托套接字已断开
-GCKCastSocket connectToHost:端口:withTimeout:连接到端口8009l上的"192.168.1.4“
信息:变得活跃了
罚款:-GCKCastSocket套接字:didConnectToHost:端口: socketDidConnect:
罚款:-GCKCastSocket socketDidSecure: socketDidSecure:
罚款:-GCKCastSocket套接字:didReadData:withTag:前缀读取,预期消息length=1307
罚款:-GCKDeviceAuthChannel didReceiveBinaryMessage:正版Google设备didDeviceAuthenticated=YES
精细:-GCKDeviceManager deviceAuthChannelDidAuthenticate:正宗设备,连接接收通道
罚款:-GCKCastSocket套接字:didReadData:withTag:前缀读取,预期消息length=474
精细:可用receiverControlChannel:didReceiveStatusForApplication:应用程序连接(CC1AD845)
connectAndNotifyDidConnectToApplication:launchedApplication:连接到应用程序<0x1467c8f0:GCKApplicationMetadata>默认媒体接收器(CC1AD845),传输ID web-11
罚款:-GCKCastSocket套接字:didReadData:withTag:前缀读取,预期消息length=135
罚款:-GCKMediaControlChannel didReceiveTextMessage:消息接收:{“类型”:“MEDIA_STATUS”,“状态”:[],"requestId":6}
发布于 2014-03-24 14:14:03
使用iOS发件人API的2.0版本,GCKCastSocket在接收到UIApplicationDidEnterBackgroundNotification时关闭,这不是可以配置的东西。
这意味着:
备选方案(仅限自定义接收方):
有关更多细节,请参见this question或this one。
发布于 2014-06-26 22:11:05
这是我用于其他需要的解决方案,但我想它也可以在这里应用(还没有测试)。
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.
}
} -(void)applicationDidEnterBackground:(UIApplication *)application {
[self handleTasksForApplicationInBackground];
}
-(void)applicationWillEnterForeground:(UIApplication *)application {
[self handleTasksForApplicationInForeground];
} -(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 (...) {
}
}https://stackoverflow.com/questions/22541221
复制相似问题