GSMが「スマフォンのアプリ開発ガイド」をリリース

GSMA が、スマートフォン向けアプリ開発ガイド「Smarter Apps for Smarter Phones」をリリースしました。

モバイル網対応アプリ開発の基礎を解説してます。

抽象的な概念もありますが、けっこう具体的な事も書いています。
たとえば、
  • 通信断時のリトライは、1分後、次5分後、三回目15分後に行うことを推奨する
  • Keep-aliveパケット送出間隔は10分以上を推奨する(Apple推奨は29分)
  • HTTP Request Hederには、Accept-Encoding: を含める
  • サーバーからのヘッダーにあるAccept-Range: をサポートし、
    再開時は、Range:を指定しリジュームする
  • Last-modified, If-Modified-Sinceをサポートする

どんなイメージかをつかむために、要約した内容を抜書きしてみます。

2.1 モバイルネットワークの要件と制約
  • 速度は、Wi-Fiより低速であるうえに、時間と場所によっても大きく変動する。
  • 料金は、ローミング先で非常に高額であったり、月間通信量に制限があったりする。使い放題とは限らない。
  • 電池は、通信によって急速に減る。カラー画面を表示させながら通信していると、数時間で電池が空になることもある。
  • 網接続は、信頼性と安定性に欠ける。圏外になることもあれば、パケットロス、遅延の増大、速度低下、瞬断などもおきる。
  • セキュリティは要注意。Wi-Fiホットスポットにつながっている可能性もあれば、なりすましAPにつながってしまっているケースもあり得る。コンテンツ送信にあたっては、認証や安全なプロトコルの使用、慎重なアプローチが必須。
2.2 スムースがユーザインタフェース

2.2.1非同期な処理
不安定なモバイル網で複数のデータをリクエストした場合、いくつかのリクエストにはレスポンスが無いかもしれない。
全部のデータを受信してから処理するのではなく、データを受信次第処理するほうがいい。
WEBページの表示を例にすれば、ページ内の画像イメージが揃うのを待たずに、受信できたイメージから表示する。
2.2.2 ノンブロッキングなユーザーインタフェース
通信は、バックグラウンドで実行したほうがいい。通信処理を始めたら、ユーザが処理をキャンセルしたり、他のアプリを使ったりできるようにして、端末の利用をブロックしないUIが望ましい
2.4 効率的なネットワーク利用
データ送受はまとめて実行しましょう。
送受した後、端末が省電力モードになるまで無駄に電池を使っています。
まとめて送受すれば、電力の無駄遣いを回避できます
3.2 接続が切れた場合への対処

  • オンラインか確認
通信が可能か確認する
オフラインならキャシュを使う
  • キャンセル処理
オンライン処理は、ユーザーによる進行状況の確認と、キャンセルを可能にする。
キャンセルされた処理に従属する副次的処理は、全て自動キャンセルされるようにする。
  • 中断時のリトライ
接続断時のリトライは、1分後、5分後、15分後に行うことを推奨する

  • ダウンロードのリジュームをサポートする
サーバーからのヘッダーにある
Accept-Range: bytes
を理解し、ダウンロード中断後は、
Range: byte=9500-
をリクエストヘッダーに含める

3.4 圧縮
HTTPリクエストの時は、ヘッダーにサポートするエンコーディングを記載しましょう
サーバーがサポートしていれば圧縮されます。

GET / HTTP/1.1
Accept-Encoding: gzip, deflate
Host: www.example.com
サンプルコードも掲載されています
対象にしているOSは、
iOS、Andoid、Windows Phone
です。
以下は、Andoridでキャッシュを使うためのサンプルです。

class ConditionalGetExample {
String entityTag = "";
String lastModified = "";
public void start() throws HttpException, IOException {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(("http://www.apache.org");
setHeaders(request);
HttpResponse response = client.executeMethod(method);
processResults(response);
}
private void setHeaders(HttpGet request) {
request.setHeader("If-None-Match", entityTag);
request.setRequestHeader("If-Modified-Since", lastModified
}
private void processResults(HttpResponse response) throws HttpException
if(response.getStatusLine().getStatusCode() ==
HttpStatus.SC_NOT_MODIFIED) {
Log.d("Http cache",
"Content not modified since last request");
return;
}
else {
entityTag = retrieveHeader(method, "ETag");
lastModified = retrieveHeader(method, "Last-Modified");
// process fresh content here!
}
}
private String retrieveHeader(HttpResponse response, String name)
throws HttpException {
Header[] headers = response.getHeaders(name);
String value = "";
if(header.length > 0) {
value = header[0].getName();
}
return value;
}
}

今後この開発ガイド「Smarter Apps for Smarter Phones」が改版とアップデートを繰り返され充実されていくことに期待したくなる内容でした。

最近のブログ記事

Bluetooth 5
Bluetooth 5 をBluet…
auから1980円プラン
h4{ font-size:120…
格安SIMシェア上位3社で45%
格安SIMのシェア調査結果を、ICT総研…
カスタム検索