在启动处理程序之前,iOS VOIP套接字不会在后台工作



我在应用程序中使用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

最新更新