在触发处理程序之前,iOS VOIP套接字在后台不起作用

时间:2015-02-20 00:51:49

标签: ios sockets network-programming voip gcdwebserver

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

1 个答案:

答案 0 :(得分:0)

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

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