首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCDAsyncSocket背景VOIP

GCDAsyncSocket背景VOIP
EN

Stack Overflow用户
提问于 2012-01-05 19:56:17
回答 2查看 6.1K关注 0票数 3

我正在尝试使用(CocoaAsyncSocket)来实现(为VoIP使用配置套接字)。据我所知,我已经完成了步骤1,将VOIP添加到plist中的后台服务中,下面应该是步骤2(为VoIP使用配置应用程序的一个套接字)。

代码语言:javascript
复制
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)connectedPort
{
    [CCV setLocalMode:FALSE];

    [socket performBlock:^{
                 [socket enableBackgroundingOnSocket];
             }];

但剩下的步骤我想不出来。如果我做了

代码语言:javascript
复制
- (void)applicationDidEnterBackground:(UIApplication *)application
{
     expirationHandler = ^{

          [app endBackgroundTask:bgTask];
          bgTask = UIBackgroundTaskInvalid;


          bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];
     };

     bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];


     // Start the long-running task and return immediately.
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

          while (1) {
               sleep(1);               
               //NSLog(@"BGTime left: %f", [UIApplication sharedApplication].backgroundTimeRemaining);

               if ([rootViewController isIncomingCall] && showedCall != TRUE) {
                    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
                    if (localNotif) {
                         localNotif.alertBody = [NSString stringWithFormat:@"Incoming Call."];
                         localNotif.alertAction = NSLocalizedString(@"Accept Call", nil);
                         localNotif.soundName = @"alarmsound.caf";
                         //                         localNotif.applicationIconBadgeNumber = 1;
                         [application presentLocalNotificationNow:localNotif];
                         [localNotif release];
                    }
                    showedCall = TRUE;
               }
          }  
     });      

}

我的当事人会听10分钟然后停下来。我需要做两件事:监视特定的(来电)数据包,并每5秒发送一次“保持活动”。但我看不出这些东西是在哪里配置的。此外,上面对苹果链接的定义是:“为了防止失去连接,VoIP应用程序通常需要周期性地醒来,并与其服务器联系。为了方便这种行为,iOS允许您使用UIApplication__的setKeepAliveTimeout:handler:方法安装一个特殊的处理程序”,据我所知,这种超时应该只做保持活动,但这没有意义,因为最短的时间是600秒?就像我上面说的,我找不到我告诉它要寻找什么包,以及当它被发现时该做什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-06 21:04:52

因此,我相信我已经解决了这个问题,但需要进一步的测试,以百分之百肯定。目前,我使用此代码运行了一个测试,测试时间为21分钟,并正常工作。

步骤2:

代码语言:javascript
复制
 [socket performBlock:^{
                 [socket enableBackgroundingOnSocket];
             }];

步骤3:

代码语言:javascript
复制
- (void)applicationDidEnterBackground:(UIApplication *)application {

     inProgram = FALSE;
     showedCall = FALSE;

     BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ [self backgroundHandler]; }];
     if (backgroundAccepted)
     {
          NSLog(@"VOIP backgrounding accepted");
     }

}

这似乎使我的客户端保持运行,因此从这里开始,我添加了一个观察者来等待我的来电包,并在看到该数据包时启动一个通知。

代码语言:javascript
复制
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{  
     if ([keyPath isEqualToString:@"currentDigitalJoin"]) 
     {
          switch ([[cClient currentDigitalJoin]intValue]) 
          {  
               case 1000: 
               {   
                    if (showedCall != TRUE && inProgram != TRUE) {
                         NSLog(@"incoming audio call");
                         UILocalNotification *localNotif = [[UILocalNotification alloc] init];
                         if (localNotif) {
                              localNotif.alertBody = [NSString stringWithFormat:@"Incoming Call."];
                              localNotif.alertAction = NSLocalizedString(@"Accept Call", nil);
                              localNotif.soundName = @"alarmsound.caf";
                              [app presentLocalNotificationNow:localNotif];
                              [localNotif release];
                              showedCall = TRUE;
                         }
                    }
                    break;
               }
               case 602: 
               {   
                    if (showedCall != TRUE && inProgram != TRUE) {
                         NSLog(@"incoming audio call");
                         UILocalNotification *localNotif = [[UILocalNotification alloc] init];
                         if (localNotif) {
                              localNotif.alertBody = [NSString stringWithFormat:@"Incoming Call."];
                              localNotif.alertAction = NSLocalizedString(@"Accept Call", nil);
                              localNotif.soundName = @"alarmsound.caf";
                              [app presentLocalNotificationNow:localNotif];
                              [localNotif release];
                              showedCall = TRUE;
                         }
                    }
                    break;
               }
               case 513: 
               {   
                    showedCall = FALSE;
                    break;
               }
          }
     }else if([keyPath isEqualToString:@"currentDigitalJoin"])
     {
          switch ([[cClient currentDigitalJoin]intValue]) 
          { 
               case 602: 
               {   
                    showedCall = FALSE;
                    break;

               }               
          }
     }
}

注:所示的“步骤”指的是苹果文档中指明的步骤。

此外,不要忘记在plist文件中设置请求无线。

票数 2
EN

Stack Overflow用户

发布于 2012-02-09 08:40:43

我知道这是个老问题--但你应该打电话给我。

代码语言:javascript
复制
 BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ [self backgroundHandler]; }];
 if (backgroundAccepted)
 {
      NSLog(@"VOIP backgrounding accepted");
 }

在应用程序启动和使用它的所有时间-原因是,正如你会发现,是当应用程序是前瞻,但屏幕是锁定的,你没有收到didEnterBackground电话,你的应用程序会在屏幕锁定后10-15分钟进入睡眠,即使你是前瞻。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8748874

复制
相关文章

相似问题

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