Сокет iOS VOIP не работает в фоновом режиме, пока не запущен обработчик

Я использую GCDWebserver в своем приложении и настраиваю прослушивающий сокет GCDWebserver в качестве сокета VOIP. Все работает хорошо, пока мое приложение не перейдет в фоновый режим более чем на 3 минуты. Я вижу, что мой GCDWebserver запускается через 3 минуты, но мой сокет, похоже, закрывается, поскольку сокет прослушивания (сокет VOIP) не прослушивает входящие запросы. Однако, если я перехожу на передний план в любое время, он получает все клиентские запросы, отправленные ему в то время, когда он был в фоновом режиме. Я был бы очень признателен, если бы кто-нибудь мог сказать мне, что мне здесь не хватает, и почему мой сокет VOIP не получает запросы в фоновом режиме, когда он четко знает об этом (поскольку он обрабатывает все эти запросы, как только он выводится на передний план.)

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

Итак, вот сценарии: Сервер получает все запросы на переднем плане. Сервер не получает запросы в фоновом режиме, но обрабатывает все более ранние запросы (отправленные, когда они были в фоновом режиме), как только они поступают на передний план. Сервер получает все более ранние запросы (отправленные). когда он был в фоновом режиме), когда обработчик setKeepAlive срабатывает каждые 10 минут.

Следуя моему коду для настройки VOIP (фоновый режим уже установлен в Info.plist как VOIP)

- (void) createVoipOnSocket:(int) listenSocket {
       CFReadStreamRef readStream = NULL;
       CFWriteStreamRef writeStream = NULL;

       CFSocketRef sn = CFSocketCreateWithNative(NULL, listenSocket, kCFSocketReadCallBack | kCFSocketDataCallBack | kCFSocketConnectCallBack, NULL, NULL);
       CFSocketNativeHandle csock = *(CFSocketNativeHandle *)sn;
       CFStreamCreatePairWithSocket(kCFAllocatorDefault, csock, &readStream, &writeStream);

       self.inputStream = (__bridge_transfer NSInputStream *)readStream;
       self.outputStream = (__bridge_transfer NSOutputStream *)writeStream;

       [self.inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];

       [self.inputStream setDelegate:self];
       [self.outputStream setDelegate:self];

       [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
       [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

       [self.inputStream open];
       [self.outputStream open];
}

В моем AppDelegate я устанавливаю обработчик, когда приложение переходит в фоновый режим:

func applicationDidEnterBackground(application: UIApplication) {

    UIApplication.sharedApplication().setKeepAliveTimeout(600, handler: {

        STCNetworkManager.sharedInstance.sendToIPs(["10.0.1.8"], commandDictionary: ["name" : "chirp", "msg" : "Ping from sleeping device"], completionBlock: { (success, result) -> Void in
            if success {
                println("SUCCESS IN SENDING when asleep and result is : \(result)")
            } else {
                println("Could not send while sleeping")
            }
        })

    })        
 }

Есть ли способ настроить сокет VOIP для обработки запросов в фоновом режиме, как только клиент отправит его.


person Vik Singh    schedule 20.02.2015    source источник


Ответы (1)


Я не уверен, как можно создать свой собственный сокет VOIP, а затем как-то связать его с GCDWebServer, но если это работает, обязательно установите для параметра GCDWebServerOption_AutomaticallySuspendInBackground значение NO (по умолчанию iS YES). В противном случае GCDWebServer автоматически остановится и закроет свой прослушивающий сокет, когда приложение будет приостановлено в фоновом режиме.

См. https://github.com/swisspol/GCDWebServer#gcdwebserver--background-mode-for-ios-apps и https://github.com/swisspol/GCDWebServer/blob/master/GCDWebServer/Core/GCDWebServer.h#L181

person Pol    schedule 02.08.2015