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.
InformationsquelleAutor Fil | 2015-03-16
Schreibe einen Kommentar