我在应用程序中使用GCDWebserver,并将GCDWebserver的侦听套接字设置为VOIP套接字。一切都很好,直到我的应用程序在后台运行超过3分钟。我可以看到我的GCDWeb服务器在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套接字,以便在客户端发送请求后立即在后台处理请求。
我不知道如何创建自己的VOIP套接字,然后以某种方式将其与GCDWebServer接口,但如果可以,请确保将GCDWebServerOption_AutomaticallySuspendInBackground
选项设置为NO
(默认的iS YES
)。否则,当应用程序在后台挂起时,GCDWebServer将自动停止自身并关闭其侦听套接字。
请参阅https://github.com/swisspol/GCDWebServer#gcdwebserver--ios应用程序和的后台模式https://github.com/swisspol/GCDWebServer/blob/master/GCDWebServer/Core/GCDWebServer.h#L181