GCDAsyncSocket background VOIP

前端 未结 2 575
一向
一向 2021-02-04 21:59

I\'m trying to implement this(Configuring Sockets for VoIP Usage) using this(CocoaAsyncSocket). To the best of my knowledge step 1 I have done, adding VOIP to background servic

相关标签:
2条回答
  • 2021-02-04 22:35

    I realise this is an old question now - but you should call

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

    On app startup and use it all the time - the reason is, as you'll discover, is when the app is foregrounded, but the screen is LOCKED you don't receive the didEnterBackground call, and your app will be put to sleep 10-15 mins after the screen has locked, even though you are foregrounded

    0 讨论(0)
  • 2021-02-04 22:43

    so i believe i have resolved the issue but need further testing to be 100% sure. Currently i ran a test with this code for the length of 21mins of suspended time and it worked

    step 2:

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

    step 3:

    - (void)applicationDidEnterBackground:(UIApplication *)application {
    
         inProgram = FALSE;
         showedCall = FALSE;
    
         BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ [self backgroundHandler]; }];
         if (backgroundAccepted)
         {
              NSLog(@"VOIP backgrounding accepted");
         }
    
    }
    

    this seems to keep my client running so from here i add an observer to wait for my incoming call packet and launch a notification when that packet is seen

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

    NOTE: the "step"s indicated are in reference to the steps indicated on the apple documentation

    also dont forget to set the require wireless in the plist file

    0 讨论(0)
提交回复
热议问题