Rodhos Soft

備忘録を兼ねた技術的なメモです。Rofhos SoftではiOSアプリ開発を中心としてAndroid, Webサービス等の開発を承っております。まずはご相談下さい。

ネットワーク

iOSDevネットワーキングオーバービュー
developer.apple.com


詳細はリンク先をみるとして冒頭の要点をまとめてみる。

ネットワークは信頼性が低いから以下に注意。

  1. 必要なデータのみ通信
  2. タイムアウトじゃなくて取り消し手段を入れる
  3. というか遅い通信では取り消しできるようなUIにせよ
  4. DLは再開できるようにしてね
  5. 通信が切れてもオフライン状態でとにかく機能し続けるようにしてね
  6. モーダルでネットワークが切れたとか出さないでね。復旧したら自動的に再試行するように。
  7. 低レベルのAPIじゃなくて高レベルのAPIを使うように。
  8. セキュリティに気をつける(SSL, TLS活用)。 安全性はアプリ側責任 等

現実

  1. 負荷が高いとパケット紛失が起こるよ。通信はガタ落ちだよ。
  2. ネットワークリンクが飽和すると遅延が生じるよ。(ルータがトラフィックをバッファに保存しようとする)
  3. 公衆無線LANはHTTP要求に対しログインページを出そうとするよ。
  4. ファイアウォールが特定ポート以外への切断を遮断するよ。
  5. NAT(ネットワーク・アドレス変換)によってサーバからユーザへ向かう接続ができないことがあるよ。等

対策

  1. まずデータのアップロード・ダウンロードはユーザに時間と費用を課していることに気づけ。これを最小限にせよ。

なるべくまとめる。

  1. どんなときも一括ダウンロード。都度ダウンロードすると遅延にも脆弱になるし、操作性も悪くなる。
  2. ダウンロードの量を最小にしてローカルにキャッシュしてね。前回から更新があるかを問い合わせてダウンロードしてね。
  3. 大きな画像を小さく表示するならはじめから小さな画像を用意してね。
  4. キャッシュ容量は各自工夫して下さい。
  5. トレードオフがいつもあるよ。例えば商品画像が並ぶとき、この画像をどこまで一括ダウンロードすべきか。。

ネットワークの状況変化への備え

  1. いつでも圏外、機内モードWifiを切る等の自体に対処してね。
  2. ユーザが意図的に接続しようとしているかが重要だよ。そういうときはいつでも接続しようとするべきだよ。すぐに接続できないときはユーザがキャンセルしない限り再接続を試みようとして下さいね。SCNetworkReachabilityをうまくつかってね。接続状態はモダールでない手段で表示してね。
  3. バックグラウンドで接続しようとした場合もモーダルでダイアログとか表示しないでね。再試行するにしても時間を開けていくようにしてね。
  4. SCNetworkReachabilityは状態が変換したときに通知が飛ぶよ。でもこのAPIは接続を事前に判断するものではなくて、接続に失敗してその原因を調べる時に使ってね。

通信速度の判断

少量のデータをダウンロードしてそれに費やした時間から評価してね。この評価値は都度図り直して精度を高めてみてね。
動画配信とかで速度が再生に追いついていないときは低帯域幅用の処理に一時的に切り替えるとか。

遅延

  1. 遠隔ホストへの要求で、応答を待ってからやっているとどんどん遅れていくよ。同時に送ったほうが良い。
  2. NSURLConnectionのパイプライン処理 NSMutableURLRequest.setHTTPShouldUsePipeliningを使うと複数のHTTP要求を同時に出せるよ。

テスト

  1. XCodeのNetwork Link Conditionerツールを使って色々な状況で試験できるよ。
    1. 帯域幅を抑える。
    2. 応答時間を伸ばす。
    3. DNS応答に遅延を加える。
    4. パケット紛失

分単位の処理がでないように、でたらキャンセルできるように。