首页
学习
活动
专区
圈层
工具
发布

在后台
EN

Stack Overflow用户
提问于 2014-03-20 17:50:33
回答 2查看 1.4K关注 0票数 0

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

EN

回答 2

Stack Overflow用户

发布于 2014-03-24 14:14:03

使用iOS发件人API的2.0版本,GCKCastSocket在接收到UIApplicationDidEnterBackgroundNotification时关闭,这不是可以配置的东西。

这意味着:

  • 当应用程序处于后台时,不能将新媒体从应用程序推送到chromecast
  • 不可能实现锁屏幕控件。

备选方案(仅限自定义接收方):

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

有关更多细节,请参见this questionthis one

票数 2
EN

Stack Overflow用户

发布于 2014-06-26 22:11:05

这是我用于其他需要的解决方案,但我想它也可以在这里应用(还没有测试)。

1.将后台任务处理程序创建为dispatch_block_t,例如

代码语言:javascript
复制
 dispatch_block_t myDummyBackgroundTaskBlock = {
    [[UIApplication sharedApplication] endBackgroundTask:myDummyBackgroundTask];
    myDummyBackgroundTask = UIBackgroundTaskInvalid;
    myDummyBackgroundTask = [app beginBackgroundTaskWithExpirationHandler:myDummyBackgroundTask];
};

2.在某个地方定义这个背景和前台任务处理程序

代码语言:javascript
复制
    // 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.
             }
           }
  1. 现在,让我们在应用程序委托中处理后台模式(正如在应用程序.plist中使用不同选项激活后台模式之前所定义的那样):

代码语言:javascript
复制
    -(void)applicationDidEnterBackground:(UIApplication *)application {
       [self handleTasksForApplicationInBackground];
     }

    -(void)applicationWillEnterForeground:(UIApplication *)application {
       [self handleTasksForApplicationInForeground];
     }
  1. 让我们看看后台异步任务选择器做什么

代码语言:javascript
复制
        -(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 (...) {
     }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22541221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档