سؤال

أنا أكتب تطبيقا يستخدم وظائف SSL ل NSStream على iPhone. أعلم أن SSL يعمل لأنني أستطيع ربط الخوادم مباشرة باستخدام SSL.
لقد واجهت مشكلة حيث تتطلب البروتوكولات التي تستخدم starttls مني التواصل مع المقبس مع غير مضمونة، وإرسال أمر startttls ثم إعادة استخدام نفس المقبس ل SSL. بقدر ما أعرف لا يمكن إعادة استخدام اتصالات NSStream ولا يمكنني بدء تشغيل SSL عليها بعد فتح الاتصال.

فكرت في إنشاء مقبلي الخاص، والتواصل عليها يدويا ثم إعداد NSStream باستخدام المقبس الموجود وبدء تشغيل SSL بهذه الطريقة. ومع ذلك، يبدو أن التواصل على المقبس يضعه في حالة لا أستطيع بدء تشغيل SSL عليه. أي محاولة لاستخدام المقبس ل nsstream النتائج في خطأ.

أي أفكار؟

هل كانت مفيدة؟

المحلول

هذه هي الطريقة الصحيحة للقيام بذلك. أثناء القيام بذلك (إعداد الخاصية بعد اتصال مأخذ التوصيل) غير موثق، هذا رمز مباشرة من عميل Monal XMPP و Apple لم يعطيني أي مشاكل في متجر التطبيقات.

 NSInputStream *iStream;
NSOutputStream *oStream;


CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)server, port, &iStream, &oStream);


[iStream open];
    [oStream open];

بمجرد فتح الاتصال وتحصل على NsStreameventopencpleted وتم إرسال أمر 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top