我在我的应用程序中使用 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 套接字,以便在客户端发送请求后立即在后台处理请求。