2

iOS 用のブラウザを作成しています。NSURLProtocol独自のキャッシング スキームを実装し、ユーザー エージェント スプーフィングを実行するために、カスタム サブクラスを使用して実験することにしました。それは両方とも非常にうまく機能します...問題は、特定のサイト (msn.com が最悪) に移動すると、アプリ全体のUI が最大 15 秒間フリーズすることです。明らかに何かがメイン スレッドをブロックしていますが、それは私たちのコードにはありません。

UIWebViewこの問題は、 とカスタム プロトコルの組み合わせでのみ発生します。WKWebView(さまざまな理由で使用できない)を交換すると、問題はなくなります。同様に、プロトコルが使用されないように登録しなければ、問題は解決します。

また、プロトコルがをするかはあまり重要ではないようです。応答を転送するだけの最低限のダミー プロトコルを作成しました (投稿の下部)。そのプロトコルを、他のコードを一切持たない必要最小限のテスト ブラウザに落とし込みましたが、結果は同じでした。また、他の誰かの ( RNCachingURLProtocol) を使用してみましたが、同じ結果が観察されました。これら 2 つのコンポーネントを特定のページと単純に組み合わせると、フリーズが発生するようです。私はこれを解決しようとする(または調査する)ことに途方に暮れており、ガイダンスやヒントをいただければ幸いです。ありがとう!

import UIKit

private let KEY_REQUEST_HANDLED = "REQUEST_HANDLED"

final class CustomURLProtocol: NSURLProtocol {
    var connection: NSURLConnection!

    override class func canInitWithRequest(request: NSURLRequest) -> Bool {
        return NSURLProtocol.propertyForKey(KEY_REQUEST_HANDLED, inRequest: request) == nil
    }

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

    override class func requestIsCacheEquivalent(aRequest: NSURLRequest, toRequest bRequest: NSURLRequest) -> Bool {
        return super.requestIsCacheEquivalent(aRequest, toRequest:bRequest)
    }

    override func startLoading() {
        var newRequest = self.request.mutableCopy() as! NSMutableURLRequest
        NSURLProtocol.setProperty(true, forKey: KEY_REQUEST_HANDLED, inRequest: newRequest)
        self.connection = NSURLConnection(request: newRequest, delegate: self)
    }

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

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

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

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

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

1 に答える 1