1

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

4

1 回答 1

0

我不确定如何创建自己的 VOIP 套接字,然后以某种方式将其与 GCDWebServer 接口,但假设可行,请确保将GCDWebServerOption_AutomaticallySuspendInBackground选项设置为NO(默认 iS YES)。否则,当应用程序在后台挂起时,GCDWebServer 将自动停止并关闭其侦听套接字。

请参阅https://github.com/swisspol/GCDWebServer#gcdwebserver--background-mode-for-ios-appshttps://github.com/swisspol/GCDWebServer/blob/master/GCDWebServer/Core/GCDWebServer.h# L181

于 2015-08-02T19:45:08.247 回答