Subscribe:
    Subscribe Twitter Facebook

    2010/08/12

    ソフトウェアプラットフォームとハードウェアの依存性

    Appleのやり方を見ているとそのプラットフォーム戦略は本当によく出来ていると思う。それはiOS 4とApp Storeを中心としたアプリケーションプラットフォームの側面と,その上で展開されるアプリケーションがコンテンツとなって流通するコンテンツプラットフォームの側面だ。
    ただこの辺りのことはよく話されているしAndroidと比較されながら語られることが多い。そしてiTunesをクラウド化することでAppleとしてのコンテンツプラットフォームが完成するといったソフトウェアとしての視点である。

    今回注目したいのはAppleが送り出しているハードウェアである。
    今でも新しいApple TVの噂が流れているのだが,iPad/iPhone 4で採用されているA4チップがそのまま乗ろうとしているらしい。これは何を意味しているのか。
    通常ハードウェアを変える場合,特にメインチップを変える場合には検証も含めて非常に大きな開発になる。それはAndroidでも結局はLinuxであり液晶の違いで画面サイズが変わる,メインチップが変わりドライバーを適用させる必要がある,といった状況だ。これにより開発工数が逼迫し仕様Dropが起きたりUIが大きく変更になったりといったことになる。特にUIやその商品の世界観を変えるような状況になった場合には仮に商品を出せたとしても製品としての魅力を失うことになりうる。

    AppleはiPhoneを初めて発表したときから「ソフトウェアとハードウェアの連携」を強調してきた。ハードウェアの変更があった場合に商品開発への影響度を最小限にできるようなアーキテクチャにするのがそのプラットフォームでのソフトウェアの一つの役割になる。ただこれは先にも話した通り開発としての限界がある。高性能で低消費電力なチップがあるなら採用したいだろうし,高精細なディスプレイデバイスがあるならそれを全面に持って行きたいだろう。そうすると開発し直しが発生する。これをAppleは革新的なUIによって乗り越えているように見える。マルチタッチは強力なアプリケーションフレームワークから成り立っている。このフレームワークを確実に整備することでユーザがどのような操作を行うのかを自分たちの手の中に収めることができる。これによりハードウェアをどのように進化させるべきかといったロードマップを確実にひくことができる。おそらくiPhoneを発表した時点でA4の構想はあったはずでそれをApple TVに展開したりもしくは別のCE機器に展開するといったことを思い描いていたはずだ。

    ソフトウェアを突き詰めていくとハードウェアを突き詰める必要が出てくる。これがいい商品を作る条件だと思う。AndroidがiPhoneを駆逐していくというのは台数ベースではそうだろうが,一つ一つの商品としての良し悪しはどうだろうか。Androidを使って商品を作るときにもそこに連携させるハードウェアのロードマップをきっちり描けないと一度注目されて終わってしまう。そして値崩れしてAndroidを採用した意味がない。

    だらだらと書いてしまったが,ソフトウェアプラットフォームを開発設計していくにはハードウェアとの依存性を常に考えていかないといけない。ハードウェアの進化を予測できないばかりに汎用的なソフトウェアを無理矢理作り込もうとしてデスマーチになったり,逆に2-3年に一度は工数をかけてプラットフォームをリフレッシュしてみたり。自分への戒めとしてもきちんと考えていこう。

    2010/07/18

    iPhoneアプリを一気に更新

    ちょっと土日に時間があったので稚拙の3つのiPhoneアプリを一気に更新してみた。
    ものスゴイ対応は特にないのだけど,iOS 4というのが一番大きい。

    それと無料の翻訳アプリだった Translator Lite - in your hands には今後のことも考えてiAdに対応してみた。まだ北米でしか広告が表示されないという話もあるようだがこの手のユーティリティアプリの場合,毎日起動してもらえる可能性もあるので実に結果が楽しみ。

     iOS 4マルチタスキング対応
     iOS 4マルチタスキング対応
     iOS 4マルチタスキング対応
     iAd サポート

    2010/07/11

    iOS 4に対応してみる - Retinaディスプレイアイコン編

    正確にいうとiOS 4対応というよりもiPhone 4対応というのが正しい。
    iPhone 4ではiPhone 3GSの縦横それぞれ2倍の解像度となる960×640ピクセル 解像度326ppiというスペックになっている。

    アプリケーションとしてこれに対応させるには非常に簡単だ。
    HomeScreenでのアプリケーションアイコンは,まずは今までの57x57のアイコンに加えてその倍である114x114のアイコンを用意する。もともとのファイル名がIcon.pngだったのに対してIcon@2x.pngという名前を付ける。
    あとはInfo.plistで"Icon File"に加えて,"Icon Files"を追加してこの2つのファイル名を格納することで完了。

    Appleにバイナリを送るときはよく出来ていて,仮に57x57なアイコンを含めないとバイナリのアップロード時に怒られることになる。だからiPhone 4向けのみということはできなくて必ずiPhone 3G/3GSやiPod touchのこともケアする必要がある。

    ちなみにiPad用であれば上記の解像度が72x72になって,ファイル名もIcon-72.pngにすれば問題なし。

    2010/07/10

    iOS 4に対応してみる - マルチタスク編

    当初は完全にiOS 4のマルチタスク化を諦めていたのだが,使い込んでいくうちに対応している場合とそうでない場合とで結構な体感スピードの差があることに気づいた。
    ということで,ある程度真剣に対応してみた。
    ※ここではiOS 4以上のみではなく3.X台もきちんとサポートする前提。

    まずはアプリケーションのライフサイクルに対応する。
    ライフサイクルはアプリの大元締めであるUIApplicationDelegateと各UIViewControllerで呼び出される各メソッドで対応する。
    UIApplicationDelegateの場合には,以下のような感じだ。

    ・application::didFinishLaunchingWithOptions
     以前よりお馴染み。アプリケーションがまさに起動した時に呼ばれる。
    ・applicationDidEnterBackground:
     iOS 4から導入された。バックグランドになると呼び出される。
    ・applicationWillEnterForeground:
     これもiOS 4から。フォアグラウンドつまりバックグランドから復帰する前に呼ばれる。
    ・applicationWillTerminate
     今までも使えてたメソッド。アプリケーションが終了しようとする時に呼ばれる。

    あとはアプリケーションのアクティブになるならないでapplicationWillResignActiveやapplicationDidBecomeActiveも使うことはできる。
    UIApplicationDelegateでの処理なので個人的には大きな処理を入れていない。これらのメソッドを実装しても単純に呼び出されないだけなので,Ver.3.2以前でも問題なく動作する。

    さて各UIViewControllerでの対応だが今まではloadView/viewDidLoad/viewWillAppear/viewDidAppear/viewWillDisappear/viewDidDisappearなどViewとしてのライフサイクルで対応していたのがほとんどだが,ちゃんとアプリケーションのライフサイクルに対応する必要がある。
    そんな時はNSNotificationを使えばよい。以下のようなコードをviewDidLoadにでも書いてselectorなメソッドを実装すれば上記のUIApplicationDelegateで発生していた各イベントをView側でも受け取ることができるようになる。

    if (&UIApplicationDidEnterBackgroundNotification) {
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(appDidEnterBackground:)
    name:UIApplicationDidEnterBackgroundNotification
    object:[UIApplication sharedApplication]];
    }

    ここで3.Xも同時に対応する場合にはif文が重要。特にBackground/ForegroundはiOS 4以降のみ対応しているので,ビルド時には問題ないけども動かすとたぶんクラッシュするはず。

    基本的にはこれでライフサイクル対応はできたので,アプリケーションの各Viewの状態からBackgroundに遷移させてどうなるかその後にForegroundにして問題ないかをチェックしていけば問題ない。個人的にはまったのはAlertView表示中にBackgroundになった場合だったりしたので,細かい部分も忘れずに。

    2010/07/06

    iPhone Multitasking Fast App Switchingを無効化する

    つまりiOS 4で採用されたマルチタスク機能を特定のアプリで無効化するというネタ。

    この無効化設定は非常に簡単で,アプリの"Info.plist"において
    "Application does not run in background(UIApplicationExitsOnSuspend)" = YES(True)
    に設定するだけ。

    ちなみに僕が作っているSpeedMemoも起動時のView表示に特徴を持たせたり,終了時にデータを自動保存するといったことをしているため,バックグラウンドでそのまま状態保持されると困るというわけ。
    最初は applicationWillEnterForeground と applicationDidEnterBackground を駆使してなんとかしようと思ったものの直ぐに上記に気付いて特別なことをしないで済んだ。

    ちなみにアプリの生存期間と各メソッドについては以下のサイトが非常にわかりやすい。
    Powered by Blogger.