2013-09-08 34 views
6

Tôi hiện đang sử dụng mã sau để đặt thông tin xác thực mặc định cho UIWebView. Điều này hoạt động tốt trong iOS 6.1 trở về trước. Tuy nhiên, trong iOS 7 Beta 6 nó không hoạt động chút nào.setDefaultCredential không hoạt động cho UIWebView trong iOS 7 nhưng hoạt động tốt trong các phiên bản iOS trước đó

Các trang web mà tôi đang cố gắng tải sử dụng Xác thực Windows. Tôi có thể mở chúng trong Safari trong iOS 7. Tuy nhiên, khi tôi chạy đoạn code dưới đây và sau đó mở URL trong một UIWebView, tôi nhận được một hình chữ nhật màu trắng trống rỗng và không có gì bao giờ tải! Như tôi đã nói, tính năng này hoạt động hoàn hảo trong iOS 6.1 trở về trước.

Tôi cũng đã thử một phương pháp thứ hai liên quan đến việc sử dụng NSURLConnectionDelegate để tắt thông tin đăng nhập. Cách tiếp cận thứ hai này cũng hoạt động tốt trong iOS 6.1 trở về trước, nhưng bị hỏng trong iOS 7.

Có ai biết tại sao điều này xảy ra không? Kinh nghiệm tương tự? Suy nghĩ?

// Authenticate 
NSURLCredential *credential = [NSURLCredential credentialWithUser:@"myusername" 
                 password:@"mypassword" 
                 persistence:NSURLCredentialPersistenceForSession]; 

NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] 
             initWithHost:@"mysite.com" 
             port:80 
             protocol:@"http" 
             realm:nil 
             authenticationMethod:NSURLAuthenticationMethodDefault]; 

[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace]; 
+2

Bạn đã thử đặt câu hỏi trong diễn đàn nhà phát triển Apple về iOS7 chưa? –

+0

Có - cho đến nay không có câu trả lời – jbro91837

+0

Chúng tôi có một vấn đề tương tự với MPMoviePlayer –

Trả lời

4

Tôi có cùng một vấn đề chính xác - một NSURLConnection đến trang Sharepoint được định cấu hình cho Xác thực Windows hoạt động tốt trong iOS 6.1. Trong iOS 7 - bất kể tôi nhắm mục tiêu và xây dựng ứng dụng cho 6 hoặc 7 - tất cả các xác thực dường như thành công (nhận được cookie thích hợp) nhưng vẫn phản hồi với 401; tất cả các yêu cầu tiếp theo được gửi cùng với cookie cũng sẽ nhận được 401.

Tôi đã giải quyết vấn đề bằng cách bán giao thức ủy quyền didReceiveAuthenticationChallenge để ủng hộ willSendRequestForAuthenticationChallenge. Thực hiện giao thức đại biểu thứ 2 có nghĩa là giao thức đầu tiên không bao giờ được gọi.

Trong đại biểu của mình, thực hiện giao thức delegate này:

- (void)connection:(NSURLConnection *)sender willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if ([challenge previousFailureCount] > 0]) { 
     [[challenge sender] cancelAuthenticationChallenge:challenge]; 
    }else{ 
     NSURLCredential *credential = [NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLPersistenceForSession]; 
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; 
    } 
} 

Sau khi tôi thực hiện điều này trên một ý thích, iOS của tôi 7 vấn đề xác thực NTLM biến mất.

+0

Tôi có một cái gì đó tương tự nhưng phức tạp hơn vì có nhiều cách khác nhau mà tôi cần để xác thực. Xác thực đang hoạt động trong iOS 6 hoặc 7, tuy nhiên, khối đơn giản hơn này hữu ích khi ứng dụng đạt một số lượng nhất định của NSURLConnections. Trong trường hợp của tôi, tôi đang tiêu thụ rất nhiều dịch vụ web và một số dịch vụ đang hoạt động và một số không phải vì vậy tôi đã nhận được 401 trong didReceiveData. Lỗi lạ..có vẻ như khi bạn nhấn một số kết nối nhất định, phiên chỉ đóng và máy chủ mất thông tin đăng nhập. – whyoz

+0

điều này sẽ gây ra một số lượng lớn kết nối tổng hợp trên máy chủ của bạn nếu bạn phải đặt điều này trong một tấn willSendRequestForAuthenticationChallenge trong khi sử dụng NSURLPersistenceForSession và bạn có thể không thể đăng nhập hoặc nhận dữ liệu cho đến khi thoát ra khỏi hồ bơi..use NSURLPersistenceNone nếu bạn có để làm điều này nhiều hơn một lần – whyoz

4

Cập nhật: Vấn đề này xuất hiện được cố định trong iOS 7.0.3

Tôi trả lời này trong diễn đàn nhà phát triển của Apple, nhưng bây giờ mà iOS7 là ra bản beta, tôi sẽ repost đây. Hiện tại Windows Authentication đã bị hỏng trong iOS7. Tôi hy vọng sẽ có một sửa chữa ra ngay, nhưng cho đến khi đó bạn có thể làm việc xung quanh vấn đề bằng cách xử lý các thách thức xác thực trong UIViewController của bạn có chứa UIWebView của bạn.

Về cơ bản bạn

  1. Hãy một NSURLRequest và NSURLConnection mình
  2. Xử lý các kết nối: didReceiveAuthenticationChallenge:
  3. Trong kết nối: didReceivedResponse tay tải dữ liệu của bạn vào UIWebView

Dưới đây tôi đang tải một tệp PDF nhưng quy trình hoạt động giống với bất kỳ loại nội dung nào của bạn.

//Make sure you implement NSURLConnectionDelegate and NSURLConnectionDataDelegate in your header 

@interface MyViewController() 
@property (weak, nonatomic) IBOutlet UIWebView *webView; 
@property (strong, nonatomic) NSURLConnection *conn; 
@property (strong, nonatomic) NSMutableData *pdfData; 
@end 

@implementation MyViewController 


//... all of your init and other standard UIViewController methods here... 


//Method that loads UIWebview. You'll probably call this in viewDidLoad or somewhere similar... 
- (void) loadWebView { 

    //Make Request manually with an NSURLConnection... 
    NSString *url = //Get your url 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
    self.conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

} 

//#pragma mark - NSURLConnectionDelegate 

//Handle authentication challenge (NSURLConnectionDelegate) 
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
    if([challenge previousFailureCount] == 0) { 

     NSString *username = //Get username 
     NSString *password = //Get password 

     //Use credentials to authenticate 
     NSURLCredential *cred = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent]; 
     [[challenge sender] useCredential:cred forAuthenticationChallenge:challenge]; 

    } else { 

     //Cancel authentication & connection 
     [[challenge sender] cancelAuthenticationChallenge:challenge]; 
     [self.conn cancel]; 
     self.conn = nil; 
    } 
} 

//#pragma mark - NSURLConnectionDataDelegate 

//Received response (NSURLConnectionDataDelegate) 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 

    //Init data 
    self.pdfData = [NSMutableData data]; 
} 

//Collect data as it comes in (NSURLConnectionDataDelegate) 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [self.pdfData appendData:data]; 
} 

//Handle connection failure (NSURLConnectionDataDelegate) 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 

    //Clean up... 
    [self.conn cancel]; 
    self.conn = nil; 
    self.pdfData = nil; 

    //TODO: Notify user and offer next step... 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

    //Finally, load data into UIWebview here (I'm loading a PDF)... 
    [self.webView loadData:self.pdfData MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil]; 
} 


@end 
+1

Hoàn toàn không thể chấp nhận được rằng Apple cho phép các lỗi như vậy trượt qua kiểm tra (lần thứ 2 điều này đã xảy ra). Nó làm cho iPad không sử dụng được trong môi trường doanh nghiệp của Microsoft. – Karlth

+0

Cảm ơn bạn đã giải pháp này!Nhưng tôi đoán rằng nó sẽ không hoạt động với chuyển hướng? – NLemay

+1

@NLemay Chuyển hướng không phải là vấn đề. Bạn chỉ nên chuẩn bị để xử lý chúng nếu bạn mong đợi chúng. Xem phương thức 'connection: didReceiveResponse' và' connection: willSendRequest: redirectResponse' [ở đây] (https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLConnectionDataDelegate_protocol/Reference/Reference.html) – jpolete

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