5

私のアプリはセルラー ネットワーク上でひどく動作しているようです。UI には画像の代わりにスピナーが表示されることがよくありますが、常にではありません。同時 NSOperations によって駆動される NSURLConnections を使用します。WIFIで問題なく動作します-まったく問題ありません。

多くの NSURLConnection タイムアウトが発生していることがわかりましたが、その理由がわかりません。この問題を追跡するにはどうすればよいですか?

4

1 に答える 1

7

問題を追跡するために、最初に同時接続の最大数を測定し、これが一貫して約 55 であることを発見しました。

  • 最大値を 10 に減らしました (オペレーション キューの最大値を設定することにより、タイムアウトを減らしましたが、まだ完全ではありません)

  • 最大値を 4 に減らしました - タイムアウトはさらに少なくなりましたが、それでもいくつかの値が得られました

  • 最大値を 1 に設定してください。これで問題ありません。いいえ!

同時実行性がまったくなくても (最大 == 1)、アプリが適切に動作する場合もありますが、それでも約半分の時間で失敗しました。

そこで、私は Apple とのサポート インシデントを燃やし、そこで最も経験豊富なエンジニアの 1 人にアドバイスをもらいました。彼からの提案に基づいて、私は次のことを試しました。

  • 別のキャリアのセルラー ネットワーク (Verizon) でアプリを実行したところ、完全に機能しました。したがって、問題はセルラー自体 (または iOS) ではなく、AT&T のセルラー ネットワーク (NY と NJ の両方が失敗する) にありました。

  • http から https に切り替えられ、AT&T で完全な同時実行性で問題なく動作するようになりました

  • Web エンドポイントを調査してその機能を判断しましたが、かなり貧弱であることが判明しました (後で詳しく説明します)。より多くの機能を備えた別の Web エンドポイントを試したところ、元の問題は http を使用して解消されました。

このことから学んだことは次のとおりです。

  • iOS5.1でもiOS6でも差はありませんでした

  • AT&T 3G でこの問題が発生し、http を使用している場合は、https に切り替えてみてください。

  • エンドポイントが HTTP1.0 を使用していて、'Connection: keep-alive' をサポートしていない場合、すべての http 要求が TCP 接続をセットアップして切断します。AT&T が私のセッションの一部を切断していたのは、セルラー ネットワークのこの「スラッシング」が原因だと思いますが、もちろん、これを確実に知る方法はありません。

  • 永続的な接続をサポートする HTTP1.1 サービスを使用すると、問題はなくなりました。この場合、TCP 接続のスラッシングはありません。

  • 一部の HTTP1.1 サービスは、iOS と同様に「パイプライン化」をサポートしています (NSURLRequest 設定、HTTPSshouldUsePipelining を使用)。これに切り替えることができれば、パフォーマンスが大幅に向上するはずです。

  • ネットワーク パフォーマンスを改善する方法について説明している WWDC 2012 ビデオがあります: セッション 706 "Networking Best Practices"

編集

だから、タマネギの皮をむくと、これはもっと奇妙になります!さらなる議論の後、何人かの Web 担当者が CloudFront でテストを行い、「接続: キープアライブ」を受け入れました。私は昨日それを機能させるために何度も試みましたが、できませんでした。

ウェブの専門家は、https と low を使用して試してみることを提案しました。何らかの理由で、AT&T 3G で「http」を使用すると、そのヘッダー タグが削除されるか無視されます。アプリも Wifi でテストしました。AT&T/3G を除くすべてのケースで、応答で「接続」が返されました。

于 2012-10-04T11:55:49.893 に答える