2016-10-26 5 views
0

Я использую следующий код при попытке подключения GCDAsyncSocket, но я не знаю, как заставить его ожидать SSL. Сейчас мой код говорит, что он подключен, но отключается через несколько секунд. Сокет никогда не показывает мне соединение.Получить GCDAsyncSocket ожидать SSL в swift

func connect(){ 
     bsocket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main) 
     bsocket.delegate = self 
     do { 
      try bsocket.connect(toHost: self.socketHost(), onPort: 443) 
     } catch let e { 
      NSLog("Error connecting socket: \(e)") 
     } 
    } 

    func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) { 
     let response = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 
     print("Received Response: \(response)") 

     bsocket.readData(withTimeout: -1.0, tag: 0) 
    } 


    func disconnect(){ 
    } 



    func socket(_ socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16) 
    { 
     var settings = [AnyHashable: Any](minimumCapacity: 3) 
     settings[(kCFStreamSSLPeerName as String)] = self.socketHost() 
     // // Allow self-signed certificates 
     settings[(kCFStreamSSLPeerName as String)] = Int(true) 
     // // In fact, don't even validate the certificate chain 
     settings[(kCFStreamSSLValidatesCertificateChain as String)] = Int(false) 


     print("Connected to \(host) on port \(p).") 
     socket.readData(withTimeout: -1.0, tag: 0) 
     // sendRequest() 
    } 

    func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) { 
     NSLog("Socket Disconnected: \(err)") 
    } 


    func socket(_ sock:GCDAsyncSocket, didAcceptNewSocket newSocket:GCDAsyncSocket) 
    { 
     NSLog("New socket received: \(newSocket)") 
    } 
+1

После того, как вы подключитесь, вам нужно вызвать 'startTLS' в вашем сокете. – Paulw11

+0

Я пробовал это, и я получаю Error Domain = GCDAsyncSocketErrorDomain Code = 7 "Socket закрыт удаленным одноранговым узлом" – user1079052

ответ

0

Вы, кажется, установив значение ключа kCFStreamSSLPeerName дважды:

settings[(kCFStreamSSLPeerName as String)] = self.socketHost() 
// // Allow self-signed certificates 
settings[(kCFStreamSSLPeerName as String)] = Int(true) 

Кроме того, если вы заканчивали https://github.com/robbiehanson/CocoaAsyncSocket/blob/cae3732972501bbb39720be6213f30dc99d9f153/Source/GCD/GCDAsyncSocket.h вы увидите, что kCFStreamSSLValidatesCertificateChain теперь недоступный ключ и будет бросаться исключение.