アプリで GCDWebserver を使用しており、GCDWebserver のリッスン ソケットを VOIP ソケットとして設定しています。アプリが 3 分以上バックグラウンドになるまで、すべてがうまく機能します。GCDWebserver が 3 分後に実行されていることがわかりますが、リスニング ソケット (VOIP ソケット) が着信要求をリッスンしないため、ソケットが閉じているように見えます。ただし、いつでもフォアグラウンドに移動すると、バックグラウンドにあったときに送信されたすべてのクライアント要求を受信します。ここで何が欠けているのか、なぜ私の VOIP ソケットがバックグラウンドでリクエストを受信しないのか (フォアグラウンドに持ち込まれるとすぐにすべてのリクエストを処理するため) を明確に知っているのに、誰かが教えてくれたら本当にありがたいです。)
もう 1 つの興味深い点は、バックグラウンドに移動するときに 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 ソケットを設定する方法はありますか?