Verhinderung URLSession Umleitung in Swift
Brauche ich, um zu Holen eine Umleitung der URL, aber verhindern, dass die Umleitung in Swift. Aus anderen Beiträgen und Apple docs verstehe ich, ich muss die Implementierung der delegate-Methode URLSession(session:, task:, willPerformHTTPRedirection response:, request:, completionHandler:)
und zurück nil
über die Fertigstellung der Schließung. Aber ich kann nicht finden Beispiele in swift noch herausfinden, den richtigen Weg, es zu tun. Im folgenden code wird mein Problem in Spielplatz: die Delegierten offenbar nicht ausgeführt.
import Foundation
import XCPlayground
XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)
class MySession: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate {
//trying to follow instructions at https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSessionTaskDelegate_protocol/index.html#//apple_ref/occ/intfm/NSURLSessionTaskDelegate/URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:
//to prevent redirection -- DOES NOT SEEM TO GET CALLED
func URLSession(session: NSURLSession, task: NSURLSessionTask, willPerformHTTPRedirection response: NSHTTPURLResponse, newRequest request: NSURLRequest, completionHandler: (NSURLRequest!) -> Void) {
println("in URLSession delegate") //NEVER PRINTS
completionHandler(nil) //NO EFFECT
}
//fetch data from URL with NSURLSession
class func getDataFromServerWithSuccess(myURL: String, success: (response: String!) -> Void) {
var session = NSURLSession.sharedSession()
let loadDataTask = session.dataTaskWithURL(NSURL(string: myURL)!) { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
//OMITTING ERROR CHECKING FOR BREVITY
success(response: NSString(data: data!, encoding: NSASCIIStringEncoding) as String)
}
loadDataTask.resume()
}
//extract data from redirect
class func getRedirectionInfo(url: String) {
getDataFromServerWithSuccess(url) {(data) -> Void in
if let html = data {
if html.rangeOfString("<html><head><title>Object moved</title>", options: .RegularExpressionSearch) != nil {
println("success: redirection was prevented") //SHOULD PRINT THIS
} else {
println("failure: redirection went through") //INSTEAD PRINTS THIS
}
}
}
}
}
MySession.getRedirectionInfo("http://bit.ly/filmenczer") // ex. redirecting link
Bitte sanft, ich bin ein Neuling. Danke im Voraus für jede Hilfe!
UPDATE: Mit vielen Dank an @nate ich habe es zu arbeiten. Die zentrale Erkenntnis ist, dass, um für den Delegaten aufgerufen werden, muss man übergeben Sie die delegate-Klasse der NSURLSession()
Initialisierer, anstatt NSURLSession.sharedSession()
. Vorbei nil
wie der delegate liefert die üblichen Verhalten (mit Umleitung). Hier ist die funktionierende version der code:
import Foundation
import XCPlayground
XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true)
class MySession: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate {
//to prevent redirection
func URLSession(session: NSURLSession, task: NSURLSessionTask, willPerformHTTPRedirection response: NSHTTPURLResponse, newRequest request: NSURLRequest, completionHandler: (NSURLRequest!) -> Void) {
completionHandler(nil)
}
//fetch data from URL with NSURLSession
class func getDataFromServerWithSuccess(myURL: String, noRedirect: Bool, success: (response: String!) -> Void) {
var myDelegate: MySession? = nil
if noRedirect {
myDelegate = MySession()
}
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: myDelegate, delegateQueue: nil)
let loadDataTask = session.dataTaskWithURL(NSURL(string: myURL)!) { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
//OMITTING ERROR CHECKING FOR BREVITY
success(response: NSString(data: data!, encoding: NSASCIIStringEncoding) as String)
}
loadDataTask.resume()
}
//extract data from redirect
class func getRedirectionInfo(url: String) {
getDataFromServerWithSuccess(url, noRedirect: true) {(data) -> Void in
if let html = data {
if html.rangeOfString("<html>\n<head><title>Bitly</title>", options: .RegularExpressionSearch) != nil {
println("success: redirection was prevented")
} else {
println("failure: redirection went through")
}
}
}
}
}
MySession.getRedirectionInfo("http://bit.ly/filmenczer")
- Ich denke, Sie sollten überprüfen Sie Ihre url, nicht als html.
if(url=="redirected url")
. - Danke @iphonic, aber ich brauche Zugriff auf den Text der Antwort hat der Umleitung (Location-header. In jedem Fall ist der Beispiel-code ist nur zur Veranschaulichung, um zu überprüfen, ob die Umleitung geschieht oder nicht.
- Ja, das können Sie tun die Art und Weise, die Sie tun, einfach überprüfen Sie die url, anstelle von html -, als url ist der richtige Umgang mit Umleitung als der Inhalt.
- Ich verstehe nicht, @iphonic, durch die Zeit, die ich bin überprüfung der Inhalte, die Umleitung hat bereits stattgefunden. Ich möchte verhindern Sie es, es nicht entdecken. vielen Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie zwei Dinge im Weg stehen mit Ihrer aktuellen Umsetzung.
Du nie die delegate-Eigenschaft auf die
NSURLSession
Instanz, die Sie verwenden, um eine Anfrage zu. Ohne die delegate-Eigenschaft festgelegt ist, werden die delegate-Methoden werden nicht immer genannt werden. AnstattNSURLSession.sharedSession()
, Blick auf dieNSURLSession(configuration:delegate:delegateQueue:)
Initialisierung. Der erste und der Letzte Parameter kannNSURLSessionConfiguration.defaultSessionConfiguration()
undnil
jeweils, siehe unten für mehr über die Stellvertretung.Müssen Sie umgestalten, etwas zu verwenden
MySession
als Stellvertretung, da bist du mit Klassen-Methoden, um eine Anfrage zu. Sie müssen eine Instanz zu verwenden, als die Sitzung zu delegieren.Nahm ich eine kurze und unvollständige route, um mit den Delegierten der Abholung auf die Umleitung mit dieser Alternative code—müssen Sie umgestalten, wie in #3, um sicherzustellen, können Sie immer noch Ihren Rückruf:
Hoffe, das hilft!
NSURLSession.sharedSession()
man muss die Delegierten der session-Initialisierung. Es stellt sich heraus, #2 ist nicht korrekt, aber es ist in Ordnung mit der Fertigstellung handler insession.dataTaskWithURL
und die delagate nicht ignoriert. Also die minimal-refactoring benötigt pro #3 ist die übergabe einer fahne zugetDataFromServerWithSuccess()
um anzuzeigen, ob die Umleitung muss vermieden werden. Um zu verhindern, dass die Umleitung, dann übergibt den Delegaten an die session-Initialisierung. Ansonsten passnil
als Delegierter.Geringfügige Anpassungen der vorgeschlagenen Lösungen vor. Dies funktioniert mit Swift 2 in XCode 7.
Fand ich auch die Lösung hilfreich, aber ich bin mit Swift 4.2 in meinem aktuellen Projekt.
So, hier ist eine angepasste, kürzere version der Lösung oben funktioniert auch mit Swift 4.2 und Xcode 10.