Objective-C SSL-Synchrone Verbindung
Ich bin ein wenig neu in objective-C, sondern haben über ein problem, das ich nicht lösen kann, vor allem, weil ich nicht sicher bin, ob ich die Umsetzung der Lösung richtig.
Ich versuche, eine Verbindung mit einer Synchronen Verbindung zu einer https-site mit einem selbst signierten Zertifikat. Ich bin immer der
Error Domain=NSURLErrorDomain Code=-1202 "nicht Vertrauenswürdige server-Zertifikat"
Fehler, ich habe einige Lösungen gesehen, um auf diesem forum. Die Lösung, die ich fand, war, hinzufügen:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}
den NSURLDelegate, um alle Zertifikate akzeptieren. Wenn ich eine Verbindung zu der Website mit nur:
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://examplesite.com/"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
Funktioniert es einwandfrei und ich sehe die Herausforderung angenommen wird. Aber wenn ich versuche, die Verbindung mit der synchronen Verbindung ich bekomme immer noch den Fehler und ich sehe nicht die Herausforderung-Funktionen aufgerufen wird, wenn ich in der Protokollierung.
Wie bekomme ich die synchron-Verbindung zu verwenden, die Herausforderung von Methoden? Ist es etwas zu tun mit der delegate:self Teil der URLConnection? Ich habe auch die Protokollierung für das senden/empfangen von Daten innerhalb der NSURLDelegate, die aufgerufen wird, durch meine Verbindung Funktion, nicht aber durch den synchronen Funktion.
Was ich benutze für den synchronen Teil:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:@"https://examplesite.com/"]];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: [[NSString stringWithString:@"username=mike"] dataUsingEncoding: NSUTF8StringEncoding]];
dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"%@", error);
stringReply = [[NSString alloc] initWithData:dataReply encoding:NSUTF8StringEncoding];
NSLog(@"%@", stringReply);
[stringReply release];
NSLog(@"Done");
Wie ich bereits erwähnt habe bin ich ein wenig neu zu objective-C also Art 🙂
Vielen Dank für jede Hilfe.
Mike
InformationsquelleAutor Mike | 2010-04-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut den Apple-docs (URL-Loading-System Programming Guide), die synchron-NSURLRequest Methode wird nicht empfohlen, da "weil es hat starke Einschränkungen". Es scheint, dass der Mangel an der Fähigkeit zu kontrollieren, was Zertifikate sind akzeptabel, ist eine dieser Grenzen.
Und ja, du hast Recht, es ist die
delegate:self
auf dieNSURLConnection
- setup, das dazu führt, dass dein delegate-Methoden aufgerufen werden. Weil die einfach (oder simpel) synchronsendSynchronousRequest:
rufen Sie nicht bieten eine Methode zum festlegen einer Stellvertretung, die delegieren-Methoden nicht verwendet werden.das ist der Punkt: wenn Sie eine synchrone Anforderung, gibt es nicht eine Möglichkeit an ein delegate-Objekt. Eine asynchrone Anfrage sieht wie folgt aus:
[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]
und ein synchroner Aufruf ist wie[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]
. Beachten Sie, dass es keinedelegate:
parameter der-sendSynchronousRequest:returningResponse:error:
Methode. Bottom line:, wenn Sie die Anpassung einer NSURLDelegate geben kann, müssen Sie den asynchronen request.InformationsquelleAutor David Gelhar