開発者目線でAndroidとiPhoneを比較してみる
iPhone と Android 両方のアプリ開発を経験したので両者を比較してみます。
技術情報
開発言語/開発環境
iPhone
- Objective-C 2.0(ガベージコレクションは使えない)
- Xcode
- Interface Builder(画面デザイン用の開発環境)
- その他
- MonoTouchを使うとC♯で開発できる
Viewの実装方法
Controllerの実装方法
ラベルに文字列をセットする場合の比較
iPhone
@interface HogeViewController : UIViewController { UILabel *label; } @property (nonatomic, retain) IBOutlet UILabel *label; @end @implementation @synthesize label; - (void)viewDidLoad { [super viewDidLoad]; label.text = @"Hello world!"; } - (void)dealloc { // メモリ領域の開放 [label release]; [super dealloc]; } @end
Android
public class HogeActivity extends Activity { private TextView label; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); label = (TextView)findViewById(R.id.label); label.setText("Hello world!"); } }
イベントの実装方法
Controller クラスのライフサイクル
Android
- onCreate
- onStart
- onResume
- onPause
- onStop
- onDestroy
データ保存の仕組み(データの永続化)
Android の場合 Content Provider クラスを使用することで他のアプリとデータベースを共有することができます。iPhone は今のところデータベースがアプリごとに独立しているので他のアプリと共有することはできないようです。両者ともデータ保存に SQLite が使えます。
バックグラウンドプロセス
グラフィック
Android でグラフィック系のアプリをつくる時は、UI スレッドとは別のスレッドで動く SurfaceView を使うのが一般的です。
加速度計
iPhone
- UIAccelerometer(加速度計の管理)
- UIAccelerometerDelegate(加速度イベント)
Android
- 加速度計に限らずあらゆるセンサーを管理する SensorManager クラスがありそこで管理されている
- SensorManager(センサーの管理)
- SensorListener(センサーイベント)
詳しい比較はこちらを参照してください
リソース
iPhone
- Resourcesフォルダ以下に保存
- NSBundleクラスからmainBundleオブジェクトを取得する
// 画像のパスを取得する NSString *imagePath = [NSBundle mainBundle] pathForResource:@"Hoge" ofType:@"png"]; UIImage *image = [UIImage imageAtPath:imagePath];
Android
- Resourcesフォルダ以下に保存
- Rクラスの定義を使って取得する
// Activityクラスでの取得方法 Drawable drawableb = getResources().getDrawable(R.drawable.hoge)
国際化
iPhone
- 言語.lproj フォルダを作成しそこに Localizable.strings ファイルを格納する
- Localizable.stringsファイルにローカライズしたメッセージを格納する
Resouces |--English.lproj | `--Localizable.strings `--Japanese.lproj `--Localizable.strings
- /English.lproj/Localizable.strings
"Hoge"; "Fuga";
- /Japanese.lproj/Localizable.strings
"Hoge" = "ほげ"; "Fuga" = "ふが";
- ローカライズされた文字列はNSLocalizedString関数で取得する
// 英語環境だと"Hoge"日本語環境だと"ほげ"が取得できる(第2引数はコメント) NSString *str = NSLocalizedString(@"Hoge", @"");
- Localizable.strings以外にもプロパティリストや nib ファイル、SQLite データベース、画像などもローカライズできる
ロケーション
電子コンパス
iPhone
CLLocationManager で磁北も真北も取得できる。
Android
磁北を取得するのであれば SensorManager を使って取得できる。真北をとるには SensorManager に加え LocationManager と GeoMagneticFieldを使う必要がある。
詳しい比較はこちらを参照してください
アプリケーション間連携
iPhone はシングルタスクだからアプリ間連携ができないとかよく聞きますがiPhoneでもアプリ間連携ができます。ただ Android に比べると動きがぎこちない上に実装が複雑です。iOS 4.0 以上でだいぶ改善しています。
iPhone
- UIApplication クラスのインスタンスを sharedApplication メソッドを使って取得する
- UIApplication インスタンスの openURL メソッドを使って呼び出す。
NSURL *url = [URL URLWithString:@"http://www.google.com"]; [[UIApplication sharedApplication] openURL:url];
なおここで紹介した方法は連携というよりも他のアプリを単に呼び出すだけですが、連携ぽっく呼び出し元に戻す方法もあります。
Android
連携できるアプリについては以下を参照してください。通知機能
詳しい比較はこちらを参照してください
iPhone
- Local Notification
- Push Notification
About Local Notifications and Push Notifications
Android
- NotificationManager
NotificationManager | Android Developers - C2DM(正式公開はまだ2011年7月現在)
Android クラウド to デバイス メッセージング フレームワーク
Android は小さな PC、iPhone は iPhone
iPhone OS はタッチスクリーンで動くことを前提にタッチスクリーン用に開発されていますがAndroid OS は何が何でもタッチスクリーンというわけではなくどちらかというと PC 系の OS(WindowsやMac)に近い感じです。
両者の最大の違いはカーソルキーの存在です。iPhone 端末はタッチスクリーンに最適化するためカーソルキーがありません。強いて言うならユーザの目線がカーソルの役割を果たします。
逆に一般的な Android 端末にはキーボードのカーソルキーとマウスの特性が合体したポインティングデバイスが存在します。Android であれば割と簡単にカーソルキーととキーボードだけで動くアプリを開発することができます。
iPhone は純粋にタッチのみで動かすことを前提に設計されているのに対し、Android はタッチ+カーソルキーをつかう前提になっていることがこの違いを生み出したのだと考えています。
Android の方が従来の PC の特性を多く持っていることから「Android は小さな PC、iPhone は小さな PC とは違う別の新しいもの」という印象があります。
頑張れば iPhone でも Android でも同じようなアプリを開発できますが、お互い得意とするところが違うためそれぞれの特徴を生かしたアプリを開発をすることをおすすめします。
※上記例外としてソニエリの Xperia があります。Xperia を Android端末として考えると痛い目に合うような気がします。Xperia は別物だと考えています。