UIWebView + Sharepoint + NTLM Auth – Me sale Stream está enviando un evento antes de abrirlo

He estado trabajando en una aplicación que tiene un UIWebView simple que muestra un sitio de Sharepoint. Originalmente pensé que la authentication NTLM sería un problema, pero resulta que es muy sencillo. Sin embargo, desde iOS8 mi aplicación ha estado enviando spam "Stream está enviando un evento antes de abrirse" una y otra vez en mi logging hasta el punto en que la página realmente nunca puede cargarse.

Originalmente pensé que era algo que estaba haciendo, así que creé una pequeña aplicación (a continuación) para eliminar cualquier extraña que pueda haber tenido mi otra aplicación, pero desafortunadamente tengo el mismo problema. Creo que mi problema principal es que no sé dónde empezar a search una respuesta para este. Internet tiene alguna mención de esto, pero no hay una resolución clara como [webView dontDoThat]. :RE

Estoy jugando con agregar la connection al ciclo de ejecución manualmente, verá esto en el código. He intentado de todas las maneras que sé cómo crear la connection, pero este es el bash más reciente.

Empiezo a entregar el desafío de SSL porque mi certificate no es válido para el dominio, luego recibo el desafío de NTLM y envío el nombre de usuario codificado duro y lo paso como testing. Carga parcialmente el sitio pero finalmente deja de cargar todos los resources en lo que supongo que es este error. Las teorías son bienvenidas.

// // 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 useCnetworkingential:[NSURLCnetworkingential cnetworkingentialForTrust: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:NSURLCnetworkingentialPersistenceForSession NSURLCnetworkingential *cnetworking = [NSURLCnetworkingential cnetworkingentialWithUser:USERNAME password:PASSWORD persistence:NSURLCnetworkingentialPersistencePermanent]; [[challenge sender] useCnetworkingential:cnetworking forAuthenticationChallenge:challenge]; } else { NSLog(@"Unsupported Challenge"); [challenge.sender continueWithoutCnetworkingentialForAuthenticationChallenge: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 

Descargo de responsabilidad: partes y piezas se copyron de otros, por lo que no afirmo haber escrito manualmente cada línea. Gracias a todos ustedes que tenían el código que puse en este ejemplo.

Cualquier ayuda apreciada! – Greg Frame

Algunas inputs de logging:

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