谷歌Chromecast SDK TearDown在后台

时间:2014-03-20 17:50:33

标签: ios chromecast

使用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}

2 个答案:

答案 0 :(得分:2)

使用iOS Sender API 2.0版时,GCKCastSocket在收到UIApplicationDidEnterBackgroundNotification后关闭,而这不是可以配置的内容。

这意味着:

  • 当应用在后台时,没有新媒体可以从应用推送到chromecast
  • 无法实施锁定屏幕控制

替代品(仅限自定义接收器):

  • 将要播放的媒体列表发送给接收方
  • 直接从接收器从云端获取新媒体

有关详细信息,另请参阅this questionthis one

答案 1 :(得分:0)

这是我用于其他需求的解决方案,但我想它也可以在这里应用(尚未测试)

<强> 1。创建后台任务处理程序为d​​ispatch_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 (...) {
     }
    }