如何在Swift中捕获重定向URL(在OAuth2的auth步骤之后)

时间:2015-02-10 21:56:21

标签: macos cocoa swift oauth oauth-2.0

我是Swift的新手。在用户授权我的应用程序使用其帐户后,我需要帮助捕获重定向URL。重定向URL包含我将为令牌交换的auth_code。

我在圈子里试图使用NSURLSessionDataDelegate:

class MySessionDelegate: NSObject, NSURLSessionDataDelegate {
    func URLSession(_: NSURLSession, task: NSURLSessionTask, willPerformHTTPRedirection: NSHTTPURLResponse, newRequest: NSURLRequest, completionHandler: (NSURLRequest!) -> Void) {
        println(newRequest)
        println("hello")
    }
}

但它没有被调用:

var authUrl = NSURL(string: "https://www.linkedin.com/uas/oauth2/authorization?response_type=\(responseType)" +
            "&client_id=\(apiKey)" +
            "&state=\(randomState)" +
            "&redirect_uri=\(redirectUrl)")

var session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: MySessionDelegate(), delegateQueue: nil)
var request = NSMutableURLRequest(URL: authUrl!)

myWebView.loadRequest(request)

然后我添加了NSURLProtocol来打印请求(我可以在控制台中看到重定向URL),但这适用于会话中非最佳的所有请求:

var requestCount = 0

class urlProtocol: NSURLProtocol {
override class func canInitWithRequest(request: NSURLRequest) -> Bool {
    println("Request #\(requestCount++): URL = \(request.URL.absoluteString)")
    return false
    }
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您实际在URLSession上运行任务,那么您的方法将在UIWebView之外工作。使用UIWebView,您不会(至少直接)使用URLSession API。就像你用NSURLProtocol所说的那样,你将捕获每条线路上的请求。

UIWebView有一个您可以使用的委托。您必须确保viewController是UIWebView的委托,然后从UIWebViewDelegate协议实现此方法。

optional func webView(webView: UIWebView,
                      shouldStartLoadWithRequest request: NSURLRequest,
                      navigationType: UIWebViewNavigationType) -> Bool

{
    return true
}

请求中包含url,但导航类型为UIWebViewNavigation.Other。您可以决定返回true或false,具体取决于您是否希望webView实际加载请求。在典型的重定向方案中,您会看到使用myWebView.loadRequest(request)创建的第一个请求。如果用户点击链接或与网页互动,您可能会看到其他请求,但其导航类型不是UIWebViewNavigationType.Other,而是.LinkClicked.FormSubmitted