Я использую 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 для обработки запросов в фоновом режиме, как только клиент отправит его.