6

NSURLProtocol のサブクラスを使用して、すべての HTTP 呼び出しをインターセプトし、ユーザー エージェントを変更し、サーバーに必要な他の http ヘッダーを追加しています。

-(id)initWithRequest:(NSURLRequest *)request
      cachedResponse:(NSCachedURLResponse *)cachedResponse
              client:(id <NSURLProtocolClient>)client
{
    NSMutableURLRequest* lInnerRequest;
    //************************************************

    lInnerRequest = [request mutableCopy];
    [lInnerRequest setValue:@"MyUserAgent" forHTTPHeaderField:@"User-Agent"];

    //************************************************
    self = [super initWithRequest:lInnerRequest
                   cachedResponse:cachedResponse
                           client:client];
    //************************************************
    if (self) 
    {
        self.innerRequest = lInnerRequest;  
    }
    //***********************************00*************
    [lInnerRequest release];
    //************************************************
    return self;
}

次に、私のプロトコルは NSURLConnection を使用します

- (void)startLoading
{
self.URLConnection = [NSURLConnection connectionWithRequest:self.innerRequest delegate:self];
}

次に、呼び出しを同等の NSURLProtocolClient メソッドに転送することで、NSURLConnection にすべてのデリゲート メソッドを実装します。これは一般的にはうまくいきますが、サーバーにデータをアップロードしているときに、NSURLConnection を使用しているコードが呼び出されません:

接続:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:

アップロードの進行状況を報告するために使用できる同等の NSURLProtocolClient メソッドがないため、NSURLProtocol にそのメソッドを実装しなかったため、これがなぜなのかを理解しています。

誰かがこれに対する回避策を見つけましたか?

4

2 に答える 2

0

次の行をコードに追加して、HTTP POST リクエストにします。

[lInnerRequest setHTTPMethod:@"POST"];
于 2012-02-07T16:22:26.133 に答える
-1

setProperty:forKey:inRequest:オブジェクトを保存してデリゲートするために使用しNSURLConnection、次にオブジェクトpropertyForKey:inRequest:をロードNSURLConnectionしてカスタムNSURLProtocolクラスにオブジェクトをデリゲートするために使用します。データが送信されたら、NSURLConnectionオブジェクトとデリゲートを使用してデリゲート メソッドを呼び出します。

于 2016-04-05T11:28:14.957 に答える