1

ここに私がいるところがありNSURLSessionUploadTaskます:

  • iOS アプリケーションがNSURLSessionUploadTaskPOST を使用して開始する
  • サーバーが HTTP POST リクエストを受け取る
  • サーバーはリクエストのコンテンツを読み取り、データがアップロードされます
  • サーバーは、以下で構成される HTTP 応答を iOS に送信します。
HTTP/1.1 200 OK
サーバー: BaseHTTP/0.3 Python/2.7.10
日付: 2015 年 10 月 30 日 (金) 16:15:21 GMT
コンテンツタイプ: text/html
コンテンツの長さ: 96

<html><head><title>POST RESPONSE</title></head><body><p>ファイルがアップロードされました.</p></body></html>
  • iOS アプリケーションが応答を受信しNSLogsNSURLSessionTaskDelegate -> URLSession:task:didCompleteWithError:
<NSHTTPURLResponse: 0x15d95110> { URL: http://10.157.239.129:42000/} { ステータス コード: 200、ヘッダー {
    「内容の長さ」= 96;
    "Content-Type" = "text/html";
    Date = "2015 年 10 月 30 日金曜日 16:15:21 GMT";
    サーバー = "BaseHTTP/0.3 Python/2.7.10";
} }
  • ただし、NSLogメソッドの場合の応答コンテンツにしようとするとNSURLSessionTaskDelegate: -> URLSession:dataTask:didReceiveData:
- (void)URLSession:(NSURLSession *)セッション
          dataTask:(NSURLSessionDataTask *)dataTask
    didReceiveData:(NSData *)データ
{
    // データ タスクがデータを受信したときに呼び出されます (直接のアップロードには適用されませんか?)
    if (データ != NULL)
    {
        NSLog(@"%s: %@", __PRETTY_FUNCTION__,[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }
    そうしないと
    {
        NSLog(@"%s: しかし、実際のデータは受信されませんでした。", __PRETTY_FUNCTION__);
    }

    // 「アクティブ」またはフォアグラウンドでない場合は、背景情報をコンソールに記録します
    if (UIApplication.sharedApplication.applicationState != UIApplicationStateActive)
    {
        [BackgroundTimeRemainingUtility NSLog];
    }
}
  • が呼び出され、出力用にこれを取得します:
2015-10-30 12:15:22.648 NSURLSessionUploadTaskExample[215:7286] -[ViewController URLSession:dataTask:didReceiveData:]: (null)
  • これについて奇妙なのは、データが null の場合、応答が if ステートメント ブロックをトリガーするべきではないということです!
  • また、応答データが Wireshark 経由で iOS アプリケーションに送信されたという証拠もあります。サーバーからの HTTP 応答のパケット キャプチャを次に示します。 ワイヤーシャーク

iOS が HTTP 応答でコンテンツを失っているように見える理由を誰か教えてもらえますか?

4

1 に答える 1

0

サーバーから iOS アプリケーションへの HTTP 200 応答を追跡できたので、iOS アプリケーションに問題があるのではないかと疑いました。次の行にブレークポイントを設定します。

NSLog(@"%s: %@", __PRETTY_FUNCTION__,[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

dataデバッガーでオブジェクトを調べました。

ここに画像の説明を入力

応答コンテンツの 96 バイトのそれぞれが取得されて いたためNSURLSessionTaskDelegate: -> URLSession:dataTask:didReceiveData:、の NSStringデコードに問題NSLogがありました。今、物事は理にかなっています。96 バイトの UTF8 応答ではなく、96 バイトの ASCII 応答を送信していました。

NSStringデコーダーを次のものに置き換えました。

NSLog(@"%s: %@", __PRETTY_FUNCTION__,[[NSString alloc] initWithBytes:[データバイト] length:[データ長] encoding: NSASCIIStringEncoding]);

次の出力で問題が解決しました。

2015-11-02 10:04:47.086 NSURLSessionUploadTaskExample[561:363449] -[ViewController URLSession:dataTask:didReceiveData:]:<html><head><title>POST RESPONSE</title></head><body>< p>ファイルがアップロードされました。</p></body></html>

また、非常に基本的な NSURLSessionUploadTask サンプル アプリケーションと Web サーバーを github hereに配置しました。

于 2015-11-02T15:05:47.943 に答える