GCDAsyncSocket фон VOIP - PullRequest
       1

GCDAsyncSocket фон VOIP

3 голосов
/ 05 января 2012

Я пытаюсь реализовать this (Настройка сокетов для использования VoIP), используя this (CocoaAsyncSocket). Насколько я знаю, шаг 1, который я сделал, добавил VOIP к фоновым службам в plist, и ниже должен быть шаг 2 (настройка одного из сокетов приложения для использования VoIP)

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)connectedPort
{
    [CCV setLocalMode:FALSE];

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

Но остальные шаги я не могу понять. Если я сделаю

- (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 минут, затем остановится. Мне нужно сделать 2 вещи: наблюдать за конкретным пакетом данных (входящий вызов) и отправлять подтверждение активности каждые 5 секунд. Но я не вижу, где эти вещи должны быть настроены. Кроме того, в приведенном выше определении ссылки на яблоко указано "Чтобы предотвратить потерю соединения, приложению VoIP обычно необходимо периодически просыпаться и регистрироваться на своем сервере. Чтобы упростить это поведение, iOS позволяет установить специальный обработчик, используя setKeepAliveTimeout:handler: метод UIApplication " Насколько я понимаю, этот тайм-аут должен выполнять только keepalive, однако это не имеет смысла, поскольку минимальное время составляет 600 секунд? И, как я сказал выше, я не могу найти, где я говорю, какой пакет искать, а также что делать, когда он найден.

Ответы [ 2 ]

2 голосов
/ 07 января 2012

, поэтому я считаю, что я решил проблему, но мне нужно дополнительное тестирование, чтобы быть уверенным на 100%.В настоящее время я выполнил тест с этим кодом на протяжении 21 минуты приостановленного времени, и он работал

шаг 2:

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

шаг 3:

- (void)applicationDidEnterBackground:(UIApplication *)application {

     inProgram = FALSE;
     showedCall = FALSE;

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

}

этопохоже, что мой клиент работает, поэтому отсюда я добавляю наблюдателя для ожидания пакета входящего вызова и запускаю уведомление, когда этот пакет замечен

- (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;

               }               
          }
     }
}

ПРИМЕЧАНИЕ: указанные "шаги" относятся кШаги, указанные в документации Apple

, также не забудьте установить требуемый уровень беспроводной связи в файле plist

1 голос
/ 09 февраля 2012

Я понимаю, что это старый вопрос сейчас, но вы должны позвонить

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

При запуске приложения и его постоянном использовании - причина, как вы обнаружите, заключается в том, что приложение предопределено, но экран заблокирован, вы не получаете вызов didEnterBackground, и ваше приложение будет помещено спать 10-15 минут после блокировки экрана, даже если у вас есть предыстория

...