Я пытаюсь написать сокет для XMPP, после установления соединения сокет должен восстановить соединение с обновленными настройками TLS. Проблема заключается в том, что методы делегирования Stream.Event.openCompleted вызываются как для outputStream, так и для inputStream, но Stream.Event.hasSpaceAvailable не вызывается после CFStreamCreatePairWithSocket.
код:-
if tls{
var readStream :Unmanaged<CFReadStream>?
var writeStream:Unmanaged<CFWriteStream>?
reset()
print("establish tls ")
tlsEnabled = true
let socketData = CFWriteStreamCopyProperty(self.outputStream as CFWriteStream,
CFStreamPropertyKey.socketNativeHandle) as! CFData
let native = CFSocketNativeHandle(CFDataGetBytePtr(socketData).pointee)
inputStream.close()
outputStream.close()
inputStream.remove(from: RunLoop.current, forMode: .defaultRunLoopMode)
outputStream.remove(from: RunLoop.current, forMode: .defaultRunLoopMode)
inputStream = nil
outputStream = nil
CFStreamCreatePairWithSocket(kCFAllocatorDefault,
native,
&readStream,
&writeStream)
inStream = readStream!.takeRetainedValue()
outStream = writeStream!.takeRetainedValue()
inStream.delegate = self
outStream.delegate = self
inStream.setProperty(kCFBooleanTrue, forKey: kCFStreamPropertyShouldCloseNativeSocket as Stream.PropertyKey)
outStream.setProperty(kCFBooleanTrue, forKey: kCFStreamPropertyShouldCloseNativeSocket as Stream.PropertyKey)
inStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL as AnyObject,
forKey: Stream.PropertyKey.socketSecurityLevelKey)
outStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL as AnyObject,
forKey: Stream.PropertyKey.socketSecurityLevelKey)
let settings: [NSObject: NSObject] = [kCFStreamSSLValidatesCertificateChain: NSNumber(value: false),
kCFStreamSSLPeerName: kCFNull]
inStream.setProperty(settings,
forKey: kCFStreamPropertySSLSettings as Stream.PropertyKey)
outStream.setProperty(settings,
forKey: kCFStreamPropertySSLSettings as Stream.PropertyKey)
inStream.schedule(in: RunLoop.current, forMode:.defaultRunLoopMode)
outStream.schedule(in:RunLoop.current, forMode:.defaultRunLoopMode)
inStream.open()
outStream.open()
}