【问题标题】:WebView can't handle response when using a custom NSURLProtocol使用自定义 NSURLProtocol 时 WebView 无法处理响应
【发布时间】:2016-04-18 06:54:34
【问题描述】:

我正在使用自定义NSURLProtocol,以便能够从加载到webView 的表单中保存用户名和密码并自动登录用户。 我的问题是我可以获取数据,但我无法完成登录用户的操作,因为网页使用一些 JS 来监听响应并完成表单操作。 有什么办法吗?

这是我目前的CustomURLProtocol 课程:

class CustomURLProtocol: NSURLProtocol {

    var connection: NSURLConnection!

    override class func canInitWithRequest(request: NSURLRequest) -> Bool {
        if NSURLProtocol.propertyForKey("customProtocolKey", inRequest: request) != nil {
            return false
        }
        return true
    }

    override class func canonicalRequestForRequest(request: NSURLRequest) -> NSURLRequest {
        return request
    }

    override func startLoading() {
        let newRequest = request.mutableCopy() as! NSMutableURLRequest
        NSURLProtocol.setProperty(true, forKey: "customProtocolKey", inRequest: newRequest)

        // Look for user credentials
        if request.URL?.description == "https://www.website.com/Account/Login" {
            if let data = request.HTTPBody {
                let dataString: String = NSString(data: data, encoding: NSASCIIStringEncoding) as! String
                // Code for reading user credentials goes here
            }
        }

        connection = NSURLConnection(request: newRequest, delegate: self)
    }

    override func stopLoading() {
        if connection != nil {
            connection.cancel()
        }
        connection = nil
    }

    func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
        client!.URLProtocol(self, didReceiveResponse: response, cacheStoragePolicy: .NotAllowed)
    }

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
        client!.URLProtocol(self, didLoadData: data)
    }

    func connectionDidFinishLoading(connection: NSURLConnection!) {
        client!.URLProtocolDidFinishLoading(self)
    }

    func connection(connection: NSURLConnection!, didFailWithError error: NSError!) {
        client!.URLProtocol(self, didFailWithError: error)
    }
}

我的逻辑有什么遗漏或错误吗?

提前致谢

【问题讨论】:

    标签: ios iphone swift uiwebview nsurlprotocol


    【解决方案1】:

    因此,如果我理解正确,您拦截呼叫只是为了保留凭据,以便以后可以自动登录用户?如果您只关心登录请求,您可以将 url 检查移至 canInitWithRequest,但这是一个附带问题。

    正确使用自定义 NSURLProtocol 不会影响响应,因此网页应该正常运行。我注意到您正在使用已弃用的 NSURLConnection,因此您可能想查看使用 NSURLSession,但这又是一个附带问题。

    您是否已逐步检查代码以查看其失败之处?您的连接委托方法是否被调用?是否在 Web 视图上调用了“webViewDidFinishLoad”?

    或者当您尝试使用存储的凭据登录用户时,您不是在谈论初始表单提交,而是在谈论后续表单提交?

    【讨论】:

    • 首先,我还必须支持 iOS 7,所以这就是我使用“弃用”方法的原因。其次,请求是通过 AJAX 发出的,因此,它不通过我的委托。这就是我尝试使用自定义NSURLProtocol 的原因。这有帮助吗?
    • NSURLSession 在 ios7 中发布。
    • 无论如何,它确实有点帮助,但我不清楚哪个部分失败了。你是说当你拦截请求时,没有返回响应?或者响应是无效的,所以网页没有反应?如果是前者,你能看到它击中了正确的 NSURLProtocol 方法吗?如果是后者,您能否验证响应是否正确?
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2014-10-02
    • 2023-03-12
    • 2016-05-02
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    相关资源
    最近更新 更多