我在我的应用程序中使用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中,当app进入后台时设置处理程序:
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套接字,以便在客户端发送请求后立即处理请求。
答案 0 :(得分:0)
我不确定如何创建自己的VOIP套接字,然后以某种方式将其与GCDWebServer连接,但假设有效,请确保将GCDWebServerOption_AutomaticallySuspendInBackground
选项设置为NO
(默认为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