1

私のアプリケーションでは、HTTP ポスト メソッドを使用して写真をアップロードし、サーバーから応答を取得して、ステータスをユーザーに表示しました。私のコードは ios5 では正常に動作しますが、ios6 で実行するとデリゲート メソッド " - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data" が起動されません。アプリケーションで頻繁に発生します。アプリケーションを実行すると、最初にアップロード ボタンを起動すると正しく動作し、アップロード ボタンを起動するとデリゲート メソッドが呼び出されません。最後に、コンソール ログを貼り付けました。参照用にコードをここに貼り付けました。これについて私を助けてください。前もって感謝します...

ここで" didReceiveData"デリゲート メソッドが必要な理由は、アップロードしたファイルに基づいてサーバーの応答を解析する必要があるためです。サーバーの応答は、" didReceiveData"メソッドの権利でのみ検索されます。

-(IBAction)upload:(id)sender
{
UIImage *test = [UIImage imageNamed:@"bottle.jpg"];
NSData *dataObj  = UIImageJPEGRepresentation(test, 1.0);

NSString *postLength = [NSString stringWithFormat:@"%d", [dataObj length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];

NSString *requestUrl =[API_URL stringByAppendingString:@"/abcDemo_uploadPhoto"];
[request setURL:[NSURL URLWithString:requestUrl]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"image/jpg" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"123" forHTTPHeaderField:@"UserId"];
[request setHTTPBody:dataObj];

NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:request delegate:self];
if (conn)
{
    receiveData = [[NSMutableData data] retain];
}

}

- (void)connection:(NSURLConnection *)connection   didSendBodyData:(NSInteger)bytesWritten
 totalBytesWritten:(NSInteger)totalBytesWritten
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite{

float progress = [[NSNumber numberWithInteger:totalBytesWritten] floatValue];
float total = [[NSNumber numberWithInteger: totalBytesExpectedToWrite] floatValue];

NSLog(@"progress/total %f",progress/total);

}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"didReceiveResponse");
    [receiveData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"didReceiveData");
    [receiveData appendData:data];
}

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection{
     NSLog(@"connectionDidFinishLoading");
 }

 - (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
 {
     NSLog(@"didFailWithError");    
 }

私のコンソールログ:

1回目:

2013-01-10 06:24:41.446 SampleProject[1004:11c03] progress/total 1.000000
2013-01-10 06:24:41.893 SampleProject[1004:11c03] didReceiveResponse
2013-01-10 06:24:41.894 SampleProject[1004:11c03] didReceiveData
2013-01-10 06:24:41.894 SampleProject[1004:11c03] connectionDidFinishLoading

2回目:

2013-01-10 06:24:49.535 SampleProject[1004:11c03] progress/total 1.000000
2013-01-10 06:24:49.605 SampleProject[1004:11c03] didReceiveResponse
2013-01-10 06:24:49.606 SampleProject[1004:11c03] connectionDidFinishLoading

3回目:

2013-01-10 06:24:41.446 SampleProject[1004:11c03] progress/total 1.000000
2013-01-10 06:24:41.893 SampleProject[1004:11c03] didReceiveResponse
2013-01-10 06:24:41.894 SampleProject[1004:11c03] didReceiveData
2013-01-10 06:24:41.894 SampleProject[1004:11c03] connectionDidFinishLoading

4 回目:

2013-01-10 06:24:49.535 SampleProject[1004:11c03] progress/total 1.000000
2013-01-10 06:24:49.605 SampleProject[1004:11c03] didReceiveResponse
2013-01-10 06:24:49.606 SampleProject[1004:11c03] connectionDidFinishLoading
4

1 に答える 1

0

戻って HTTP 応答の検査を開始する必要があると思います。サーバーから返されたステータス コードとヘッダーを確認します。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"didReceiveResponse");
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSHTTPURLResponse *HTTPResponse;
        NSLog(@"HTTP/1.X %d\n%@", [HTTPResponse statusCode],
            [[HTTPResponse allHeaderFields] componentsJoinedByString:@"\n"]);
    }
    [receiveData setLength:0];
}

302 または 400 または 500 レベルのエラーのようなものが表示される場合があります。

于 2013-01-10T12:52:19.927 に答える