Я работаю над приложением, в котором есть простой UIWebView, в котором отображается сайт Sharepoint. Первоначально я думал, что проверка подлинности NTLM будет проблемой, но, как оказалось, это действительно прямолинейно. Тем не менее, с тех пор, как iOS8 у меня было спам, "Stream отправляет событие перед открытием" снова и снова в моем журнале до такой степени, что страница действительно никогда не может загружаться.
Я изначально думал, что это то, что я делаю, поэтому я создал небольшое приложение (ниже), чтобы удалить любую странность, которую может иметь мое другое приложение, но, к сожалению, у меня такая же проблема. Я думаю, моя главная проблема: я не знаю, где даже начать искать, чтобы найти ответ на этот. В Интернете упоминается об этом, но нет четкого разрешения, например [webView dontDoThat].: D
Я играю с добавлением соединения к циклу запуска вручную, вы увидите это в коде. Я пробовал каждый путь, я знаю, как создать соединение, но это самая последняя попытка.
Я начинаю передавать вызов SSL, потому что мой сертификат недействителен для домена, затем я получаю вызов NTLM и отправляю жестко закодированное имя пользователя и передаю его в качестве теста. Он частично загружает сайт, но в итоге отказывается от загрузки всех ресурсов в том, что я предполагаю, это ошибка. Теории приветствуются.
//
// ViewController.m
//
// Created by Greg Frame on 10/2/14.
//
#import "ViewController.h"
#define APPURL @"https://mysharepoint.com"
#define USERNAME @"usernamehere"
#define PASSWORD @"passwordhere"
@interface ViewController ()
@end
@implementation ViewController
BOOL _Authenticated = NO;
BOOL _SSLAuthenticated = NO;
NSURLConnection *_Connection;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.webView.delegate = self;
NSURLRequest *requestURL = [NSURLRequest requestWithURL:[NSURL URLWithString:APPURL]];
[self.webView loadRequest:requestURL];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark UIWebViewDelegate
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if(webView.loading){ //if url requests come through while its loading, its probably embedded content
return YES;
}
BOOL result = YES;
if (!_Authenticated || !_SSLAuthenticated) {
//I have tried a ton of different ways to create the NSURLConnection this is the latest
_Connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[_Connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[_Connection start];
result = NO;
}
return result;
}
#pragma mark NSURLConnection Delegate
-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge {
if( [challenge previousFailureCount] == 0 ) {
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
NSLog(@"SSL Challenge");
NSURL* baseURL = [NSURL URLWithString:APPURL];
if ([challenge.protectionSpace.host isEqualToString:baseURL.host]) {
NSLog(@"trusting connection to host %@", challenge.protectionSpace.host);
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
} else
NSLog(@"Not trusting connection to host %@", challenge.protectionSpace.host);
} else if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodNTLM]) {
NSLog(@"NTLM Challenge");
_SSLAuthenticated = YES; //cant get here otherwise
//persistence:NSURLCredentialPersistenceForSession
NSURLCredential *cred = [NSURLCredential credentialWithUser:USERNAME password:PASSWORD persistence:NSURLCredentialPersistencePermanent];
[[challenge sender] useCredential:cred forAuthenticationChallenge:challenge];
} else {
NSLog(@"Unsupported Challenge");
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
} else {
NSLog(@"Failed authentication");
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)pResponse {
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)pResponse;
NSLog(@"Received response %ld", (long)[httpResponse statusCode]);
if( !_SSLAuthenticated && [httpResponse statusCode] == 200) {
NSLog(@"SSL GOOD");
_SSLAuthenticated = YES;
[_Connection cancel];
_Connection = nil;
NSURLRequest *requestURL = [NSURLRequest requestWithURL:[NSURL URLWithString:APPURL]];
[self.webView loadRequest:requestURL];
return;
}
if( !_Authenticated && [httpResponse statusCode] == 200) {
NSLog(@"NTLM GOOD");
_Authenticated = YES;
[_Connection cancel];
[_Connection unscheduleFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
NSURLRequest *requestURL = [NSURLRequest requestWithURL:[NSURL URLWithString:APPURL]];
[self.webView loadRequest:requestURL];
return;
}
NSLog(@"Connection Cancelled");
[_Connection cancel];
}
@end
Отказ от ответственности: части и части были скопированы от других, поэтому я не утверждаю, что вручную набирал каждую строку. Спасибо всем, у кого был код, который я привел в этом примере.
Любая помощь ценится! - Greg Frame
Некоторые записи журнала:
2014-10-06 15:12:31.110 sptest2[21405:2051411] SSL Challenge
2014-10-06 15:12:31.110 sptest2[21405:2051411] trusting connection to host xxxxx.xxxxx.com
2014-10-06 15:12:31.426 sptest2[21405:2051411] NTLM Challenge
2014-10-06 15:12:31.899 sptest2[21405:2051690] Stream 0x7c8d9070 is sending an event before being opened
2014-10-06 15:12:32.429 sptest2[21405:2051411] Received response 200
2014-10-06 15:12:32.429 sptest2[21405:2051411] NTLM GOOD
2014-10-06 15:12:33.184 sptest2[21405:2051723] Stream 0x7ca95210 is sending an event before being opened
2014-10-06 15:12:34.293 sptest2[21405:2051723] Stream 0x7bed9740 is sending an event before being opened
2014-10-06 15:12:34.465 sptest2[21405:2051723] Stream 0x7bee1120 is sending an event before being opened
2014-10-06 15:12:34.523 sptest2[21405:2051723] Stream 0x7caba9a0 is sending an event before being opened
2014-10-06 15:12:34.532 sptest2[21405:2051723] Stream 0x7f87e040 is sending an event before being opened
...