- (BOOL)setupSocketStreams { // Make sure streams were created correctly if ( readStream == nil || writeStream == nil ) { [self close]; return NO; } // Create buffers incomingDataBuffer = [[NSMutableData alloc] init]; outgoingDataBuffer = [[NSMutableData alloc] init]; // Indicate that we want socket to be closed whenever streams are closed CFReadStreamSetProperty( readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue ); CFWriteStreamSetProperty( writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue ); const void* values[] = { CFSTR("kCFStreamSocketSecurityLevelTLSv1_0SSLv3") }; const void* keys[] = { kCFStreamSSLLevel }; CFDictionaryRef sslSettingsDict = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFReadStreamSetProperty( readStream, kCFStreamPropertySSLSettings, sslSettingsDict ); CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, sslSettingsDict ); CFRelease(sslSettingsDict); // We will be handling the following stream events CFOptionFlags registeredEvents = kCFStreamEventOpenCompleted | kCFStreamEventHasBytesAvailable | kCFStreamEventCanAcceptBytes | kCFStreamEventEndEncountered | kCFStreamEventErrorOccurred ; // Setup stream context - reference to 'self' will be passed to stream event handling callbacks CFStreamClientContext ctx = { 0, // version self, // info NULL, // retain callback NULL, // release callback NULL // copyDescription callback }; // Specify callbacks that will be handling stream events CFReadStreamSetClient( readStream, registeredEvents, readStreamEventHandler, &ctx ); CFWriteStreamSetClient( writeStream, registeredEvents, writeStreamEventHandler, &ctx ); // Schedule streams with current run loop CFReadStreamScheduleWithRunLoop( readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes ); CFWriteStreamScheduleWithRunLoop( writeStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes ); // Open both streams if ( ! CFReadStreamOpen(readStream) || ! CFWriteStreamOpen(writeStream)) { [self close]; return NO; } if ([self.delegate respondsToSelector:@selector(establishedConnection:)]) { [self.delegate establishedConnection:self]; } return YES; }