NSStream在iPhone上不能正常工作

func connect(host: String, port: Int) { self.host = host self.port = port NSStream.getStreamsToHostWithName(host, port: port, inputStream: &inputStream, outputStream: &outputStream) if inputStream != nil && outputStream != nil { // Set delegate inputStream!.delegate = self outputStream!.delegate = self // Schedule inputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode) outputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode) // Open! inputStream!.open() outputStream!.open() } } 

当我在XCode Simulator中的代码开始的时候,它可以工作,但是当我在iPhone上启动它时,它给了我下面的错误:

终止应用程序由于未捕获的exception“NSInvalidArgumentException”,原因:“+ [NSStream getStreamsToHostWithName:端口:inputStream:outputStream:]:无法识别的select器发送到类0x3b81786c'

getStreamsToHostWithName(_:port:inputStream:outputStream:)在iOS 7中不可用。它在iOS 8中引入。

 extension NSStream { @availability(iOS, introduced=8.0) class func getStreamsToHostWithName(hostname: String, port: Int, inputStream: AutoreleasingUnsafeMutablePointer<NSInputStream?>, outputStream: AutoreleasingUnsafeMutablePointer<NSOutputStream?>) } 

你必须使用CFStreamCreatePairWithSocketToHost来代替:

 class Connection: NSObject, NSStreamDelegate { var inputStream:NSInputStream? var outputStream:NSOutputStream? func connect(host: String, port: Int) { var inStreamUnmanaged:Unmanaged<CFReadStream>? var outStreamUnmanaged:Unmanaged<CFWriteStream>? CFStreamCreatePairWithSocketToHost(nil, host, UInt32(port), &inStreamUnmanaged, &outStreamUnmanaged) inputStream = inStreamUnmanaged?.takeRetainedValue() outputStream = outStreamUnmanaged?.takeRetainedValue() if inputStream != nil && outputStream != nil { // Set delegate inputStream!.delegate = self outputStream!.delegate = self // Schedule inputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode) outputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode) // Open! inputStream!.open() outputStream!.open() } }