這是正確的方法。雖然這樣做(在套接字連接之後設置屬性)沒有記錄,但這是直接來自我的Monal xmpp客戶端的代碼,並且蘋果從未在應用商店給我任何問題。
NSInputStream *iStream;
NSOutputStream *oStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)server, port, &iStream, &oStream);
[iStream open];
[oStream open];
一旦連接已經打開,你會得到NSStreamEventOpenCompleted和STARTTLS命令已經發送到來自客戶端的主機:
NSDictionary *settings = [ [NSDictionary alloc ]
initWithObjectsAndKeys:
[NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsExpiredCertificates",
[NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsExpiredRoots",
[NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsAnyRoot",
[NSNumber numberWithBool:NO], @"kCFStreamSSLValidatesCertificateChain",
[NSNull null],@"kCFStreamSSLPeerName",
@"kCFStreamSocketSecurityLevelNegotiatedSSL",
@"kCFStreamSSLLevel",
nil ];
CFReadStreamSetProperty((CFReadStreamRef)iStream,
@"kCFStreamPropertySSLSettings", (CFTypeRef)settings);
CFWriteStreamSetProperty((CFWriteStreamRef)oStream,
@"kCFStreamPropertySSLSettings", (CFTypeRef)settings);
你有沒有打過電話的setProperty:forKey:使用適當的安全常量在一個已經打開的NSSocket上?我相信底層的SecureTransport代碼支持從未加密的初始連接切換到TLS/SSL。 – 2011-01-24 01:16:39
所以我想通了。您應該使用CFsockets而不是NSsockets,然後在連接後應用SSL,即使文檔說您不能這樣做,它也會正確協商安全連接。 – anurodhp 2011-03-01 19:00:49
沒有「NSsockets」這樣的東西 – user102008 2011-04-29 22:10:16