2

他のすべての通話に通常のインターネット接続を提供しながら、一部の通話にテスト データを提供するためにカスタムNSURLProtocolをに追加しようとしています。セッションはプロジェクトに含まれるライブラリに存在するため、セッション構成のにNSURLSessionを追加してこれを行う必要があります。NSURLProtocolprotocolClasses

trueなんらかの理由で、カスタム プロトコルが呼び出しを返すことによって要求を受け取ったとき、私のセットアップはテスト データを配信しますが、canInitWithRequest他のすべての要求 (それが返されたとき) では、まだカスタム プロトコルの背後にfalseあるデフォルト プロトコルが要求を取得し、呼び出しに戻るprotocolClassesことさえありますが、要求をインターネットに送信することはなく、代わりに 30 秒後に要求タイムアウトを配信します。からカスタム プロトコルを削除すると、すべて正常に動作します。もちろん、テスト データだけが提供されなくなります。truecanInitWithRequestprotocolClasses

これは、プロトコルのインストールに使用するコードです。

    NSURLSessionConfiguration* sessionConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    NSMutableArray* protocols = [NSMutableArray arrayWithArray:sessionConfiguration.protocolClasses];
    [protocols insertObject:[MyProtocol class] atIndex:0];
    sessionConfiguration.protocolClasses = protocols;
    mySession = [NSURLSession sessionWithConfiguration:sessionConfiguration];

カスタム プロトコルを に登録すると[NSURLProtocol registerClass:[MyProtocol class]]、フォールスルーは機能しますが、記載されているように、プロジェクトでこのアプローチを使用することはできません。

これが正しく機能しない理由について何か考えはありますか?

4

1 に答える 1

0

まず、コード スニペットにミスプリントがあります。変数ではprotocolsなく、ミスプリントである必要があります。array)))

カスタム プロトコルの場合は、プロトコル クライアントなどを参照するのが理にかなっていると思います ( propertyFoKey: inRequest:) メソッドstartLoading(またはstopLoading) が呼び出されているか。

ああ、私はあなたの質問を読み直しました。

の場合[NSURLProtocol registerClass]、カスタム クラスは、登録されている最新のものであれば、URL スキームを処理します。あなたの場合、リクエストを処理する別の(無効な)プロトコルがあるようです。

于 2015-06-04T10:35:56.453 に答える