2013-09-08 3 views
6

В настоящее время я использую следующий код для установки учетных данных по умолчанию для UIWebView. Это отлично работает в iOS 6.1 и более ранних версиях. Однако в iOS 7 Beta 6 он вообще не работает.setDefaultCredential не работает для UIWebView в iOS 7, но отлично работает в более ранних версиях iOS

Веб-страницы, которые я пытаюсь загрузить, используют проверку подлинности Windows. Я могу открыть их в Safari в iOS 7. Однако, когда я запускаю приведенный ниже код, а затем открываю URL-адрес в UIWebView, я получаю пустой белый прямоугольник и ничего не загружает! Как я уже сказал, это отлично работает в iOS 6.1 и более ранних версиях.

Я также попробовал второй подход, который предполагает использование NSURLConnectionDelegate для передачи учетных данных. Этот второй подход также отлично работает в iOS 6.1 и ранее, но нарушен в iOS 7.

Кто-нибудь знает, почему это происходит? Подобный опыт? Мысли?

// 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

Вы пробовали задать вопрос на форумах разработчиков Apple о iOS7? –

+0

Да - до сих пор нет ответов – jbro91837

+0

У нас есть аналогичная проблема с MPMoviePlayer –

ответ

4

У меня был точно такой же вопрос - в NSURLConnection к Sharepoint сайта, настроенного для проверки подлинности Windows работает нормально, в прошивкой 6.1. В iOS 7 - независимо от того, настроен ли я и построил приложение на 6 или 7 - все аутентификации, похоже, будут успешными (получение надлежащего файла cookie), но все равно ответят 401; все последующие запросы, отправленные с файлом cookie, получат также 401.

Я решил проблему, сбросив протокол делегирования didReceiveAuthenticationChallenge в пользу willSendRequestForAuthenticationChallenge. Реализация второго протокола делегата означает, что первый вызов не вызван.

В делегата, реализовать этот делегат протокол:

- (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]; 
    } 
} 

После я реализовал это на прихоти, мой IOS 7 вопросов аутентификации NTLM исчезли.

+0

У меня есть нечто похожее, но более сложное, потому что существует несколько разных способов аутентификации. Аутентификация работала в iOS 6 или 7, однако этот более простой блок был полезен, когда приложение попало в определенное количество NSURLConnections. В моем случае я потребляю тонну веб-сервисов, а некоторые работают, а некоторые не так, я получаю 401 в didReceiveData. Странная ошибка ... похоже, как только вы нажмете определенное количество подключений, сеанс просто закрывается, и сервер теряет учетные данные. – whyoz

+0

это приведет к огромному объему пулов соединений на вашем сервере, если вы должны положить это в тонну willSendRequestForAuthenticationChallenge при использовании NSURLPersistenceForSession, и вы не сможете войти в систему или получить данные до тех пор, пока пул не истощится. Используйте NSURLPersistenceNone, если у вас есть делать это не один раз – whyoz

4

Update: Этот вопрос появляется быть зафиксирован в прошивкой 7.0.3

Я ответил на этот вопрос в форуме разработчиков компании Apple, но теперь, когда iOS7 выходит бета, я перепечатывать Вот. В настоящее время проверка подлинности Windows нарушена в iOS7. Я ожидаю, что вскоре будет исправлено, но до этого вы можете обойти эту проблему, обратившись к задачам проверки подлинности в своем UIViewController, который содержит ваш UIWebView.

По сути вы

  1. Сделать NSURLRequest и NSURLConnection себя
  2. Handle соединение: didReceiveAuthenticationChallenge:
  3. В связи: didReceivedResponse вручную загрузить данные в UIWebView

Ниже I Загружаем PDF, но этот процесс работает так же, как и ваш тип контента.

//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

Совершенно неприемлемо, что Apple допускает ошибки, подобные этим проскальзыванию через тестирование (второй раз это произошло). Это делает iPad непригодным для использования в корпоративных средах Microsoft. – Karlth

+0

Благодарим вас за это решение!Но я думаю, что это не будет работать с перенаправлением? – NLemay

+1

@NLemay Redirects не должно быть проблемой. Вы должны быть готовы к их обработке, если вы ожидаете их. См. Методы 'connection: didReceiveResponse' и' connection: willSendRequest: redirectResponse' [здесь] (https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLConnectionDataDelegate_protocol/Reference/Reference.html) – jpolete

Смежные вопросы