2010-01-04 19 views
16

Ứng dụng iPhone của tôi đã bị từ chối chỉ để sử dụng phương thức riêng (rất an toàn, có vẻ như) +setAllowsAnyHTTPSCertificate:forHost: cho NSURLRequest. Có một API không riêng tư để mô phỏng chức năng này không?Phương pháp thay thế cho riêng tư của NSURLRequest "setAllowsAnyHTTPSCertificate: forHost:"?

+2

Tại sao bạn muốn cho phép chứng chỉ HTTP không hợp lệ ở địa điểm đầu tiên? –

+0

Xin chào .. sự cố của bạn đã được giải quyết nhưng bạn đã loại trừ phương pháp trên trong mã nguồn của mình chưa? –

Trả lời

1

Một workaround thực sự ngu ngốc là làm cho phương pháp loại của riêng bạn:

@implementation NSURLRequest (IgnoreSSL) 

+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host 
{ 
    return YES; 
} 

@end 

này sẽ nhận được bằng séc API riêng của Apple, nhưng nó vẫn còn điều tương tự (sử dụng một tư nhân, không có giấy tờ API [1] đó là chịu trách nhiệm để phá vỡ bất cứ lúc nào). Trên thực tế, nó tồi tệ hơn vì nó cho phép tất cả mọi thứ, không chỉ là máy chủ đó.

[1]: API riêng tư nên được công khai nhưng API riêng tư vẫn là công khai.

+1

Từ những gì tôi biết về nó, điều này sẽ vẫn không vượt qua kiểm tra của Apple, vì chúng xuất hiện để sử dụng một phân tích khá đơn giản dựa hoàn toàn vào bộ chọn, không phải cách sử dụng của chúng. –

+0

@Mike: Bạn có chắc chắn không? Tôi không "sử dụng" bộ chọn ở tất cả, chỉ xác định lại nó. Đó là nội bộ của Apple gọi nó. Cấp, điều này là không an toàn, nhưng tôi không thấy làm thế nào nó sẽ không vượt qua kiểm tra của Apple. – Michael

+1

Cách này chắc chắn sẽ khiến ứng dụng của bạn bị từ chối. – Franklin

1

Hãy xem liên kết này: http://www.abstractec.co.uk/blog/iPhone.php?itemid=70

Có thể là một giải pháp tốt hơn cho bạn hơn là chỉ lừa séc API tư nhân.

+0

Có thể sử dụng NSURLConnection thay vì CFHTTPMessageRef không? Tôi muốn tải xuống không đồng bộ. – Michael

0

Không phải là giải pháp, nhưng là một đề xuất. Bạn đã từng nghĩ đến việc sử dụng ASIHttpRequest Framework cho điều này? Khuôn khổ này hoàn thành ở mọi khía cạnh. Kiểm tra tài liệu, có thể nó cũng có thể giúp bạn.

0

setAllowsAnyHTTPSCertificate dường như đến nay không được hỗ trợ trong OS X 10.6.6 hoàn toàn.

Tôi có nói 10.6.6 không? Có lẽ tôi nên nói "Snow Vista".

6

Thực ra, tôi đang thử nghiệm với 10.6.8 và mã này vẫn hoạt động - nó sử dụng API riêng nhưng kiểm tra bộ chọn tồn tại (myurl là NSURL tôi đang cố gắng tải vào WebView hoặc NSURLConnection) :

SEL selx = NSSelectorFromString(@"setAllowsAnyHTTPSCertificate:forHost:"); 
if ([NSURLRequest respondsToSelector: selx]) 
{ 
    IMP fp; 

    fp = [NSURLRequest methodForSelector:selx]; 

    (fp)([NSURLRequest class], selx, YES, [myurl host]); 
} 

Lưu ý rằng "@selector" không được sử dụng để hoàn toàn tất cả công việc sẽ được thực hiện tại thời gian chạy. Điều đó làm cho nó an toàn và ẩn với các kiểm tra của Apple, đặc biệt nếu bạn che khuất chuỗi.

+0

Làm việc điều trị! Cảm ơn – Chris

+1

Không phải là giải pháp được đề xuất: (1) bạn không cung cấp cho người dùng tùy chọn chấp nhận hay không. (2) Bạn đang viết trong một diễn đàn công cộng nếu Apple xảy ra khi họ có thể khôn ngoan với nó. (3) Xem câu trả lời của Yonel: http://stackoverflow.com/a/2145367/818352 – George

+0

Chỉ muốn nói rằng điều này làm việc cho tôi cho đến khi 5S và iPad Air xuất hiện - treo ở đây (trên diễn viên) trên một trong hai thiết bị. – Luke

Các vấn đề liên quan