AndroidとiPhoneに おける開発比較 2014/01
0-1. 初めに 現在、スマートフォンアプリの開発と言えば、 Android or iPhoneがシェアの大半を独占 実際の開発に当たり、どのような違いがある かは気になるところ 今回は開発するに当たっての違いから、簡単 なアプリ作成までを検証 ゴールとして動作するアプリを見せます
0-2. 目次 以下の手順で比較していきます 1. 概要 2. 各種構文 3. 実際のアプリ作成
1-1. 概要(シェア) 世界と日本ではなぜか大きく異なる(2013年 までの数値で検証) 世界と日本ではなぜか大きく異なる(2013年 までの数値で検証) 世界で見るとスマートフォン保持者の8割が Android、1割がiPhone しかし、日本国内では約半分をiPhoneが占め る結果となっている 上記から現在開発シェアが高そうなのは iPhone開発となるが、世界の流れを受けて日 本のiPhoneシェアが縮小する可能性もあり
1-2. 概要(ビジネス) 仕事をする上において、採算が取れないと作 成する意味が薄れてきます 仕事をする上において、採算が取れないと作 成する意味が薄れてきます 利益を出すためには有料アプリ or アプリ内 科金が主な収入源です 現状ではどちらもiPhoneのほうが高いです なぜなら、iPhoneは無料アプリをダウンロード する際もクレジットカード登録が義務となって おり、その魔力で押してしまうのでしょう・・・
1-3. 概要(作りやすさ) 皆さん、どちらが作りやすいと思いますか?
1-3. 概要(作りやすさ) そうです。もちろん、iPhoneです。 何故なら、Androidは各メーカーが独自カスタ マイズをしているせいで、メーカーにより挙動 が違うというデメリットが発生しています
1-4. 概要(開発手法) 【言語】 AndroidはJavaで開発するのに対し、iPhoneは Objective-Cで開発 【開発端末】 AndroidはWindows、MACで開発できるが iPhoneはMACのみ 次はコーディングの違いに検証
2-1-1. 構文(変数定義) まずは変数定義について 【Android】 String message = “文字列”; 【iPhone】 NSString* message = @”test”; 基本的には「型 変数名 = 値」と構文は一緒 「@」は?と気になった人は技術者です!
2-1-2.構文(@) Objective-CはC言語を拡張した言語です →これを「コンパイラディレクティブ」と呼ぶ また、「NSString*」の「*」についてはC言語と 同様にポインタを表しています
2-2-1.構文(関数) 次に関数定義の違いを見ましょう 【Android】 public void func(String param1, int param2) { 【iPhone】 - (void) func : (NSString*) param: (NSInteger) param2 { パラメータ記述が大きく異なり、Objective-Cで は(型) 変数名:・・・のように「:」で区切る また、「-」を先頭に付けるは決まりです
2-2-2.構文(関数) ここで何か疑問感じませんか?
2-2-2.構文(関数) そうです。publicがないけどどういう意味と感 じないとやばいです。 →何も感じない人はソースコピー常習犯の可能 性が高い!! Objective-Cにおいて、基本的にはすべての関 数がpublicとなっています
2-3-1.構文(クラス定義) 続いてはクラス定義 【Android】 public class Animal {// Animalというクラス } 【iPhone】 @implementaion Animal : NSObject @end うおー、違いすぎて訳が分からない・・・、とい うことで詳細を見ていきましょう!
2-3-2.構文(Objective-Cクラス定義) 【ヘッダファイル】(拡張子を「.h」で作成) @interface Animal:NSObject { //赤部分は親クラ スを指定 // ここにクラスフィールドを定義 } // ここに関数を定義 @end 上記のように@interface~@endまでに記述 不思議に感じるかもしれないがクラス定義時 に「@interface」を使用する
2-3-3.構文(Objective-Cクラス定義) ??疑問に感じましたか。ですよね・・。
2-3-4.構文(Objective-Cクラス定義) じゃあ、interfaceはどうするのって感じますよ ね?? まったく同一機能ではないがObjective-Cにお いても、「protocol」を使用すれば、Java同様の インターフェースは実現できません。 説明が長くなるのでこの辺で・・・、興味があ れば調べてみてください。
2-3-2.構文(Objective-Cクラス定義) 話が少しそれましたが次に実装ファイル 【実装ファイル】拡張子を「.m」で作成 #import “xxx.h” // ヘッダファイル読込 @implementaion Animal : NSObject // ここに処理 @end 「@implementaion」の後にクラス名で定義 最後に「@end」は必須です
2-4.構文(最後に) あまり、説明できていませんが詳細に説明す ると2時間以上かかるので・・・ この辺で今回は構文説明を終了します あまり、説明できていませんが詳細に説明す ると2時間以上かかるので・・・ この辺で今回は構文説明を終了します 次は簡単なアプリの説明に入ります。
3-1.アプリ説明 気分に合わせてランダムで曲を再生する、 簡単なアプリケーションを作成します。
3-2.作成するファイル ・画面遷移は無いので1ファイルで全て記述 ・以下の処理を実装する - 初期処理で使用する音楽ファイルを用意 - カテゴリ選択 - 音楽再生 - 音楽停止 1/13/14
iphone (初期処理) 使用するマップを初期化 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [self setComboBox]; [self setSadList]; [self setHappyList]; [self setExciteList]; [self setMapList]; } 1/13/14
Android (初期処理) 使用するマップを初期化し、ハンドラも定義しておく super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); InitializeList(); Button start = (Button)findViewById(R.id.button1); start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ~ } }); 1/13/14
iPhone (初期処理詳細) 各マップ毎で使用するアイテムを追加している -(void)setComboBox { [choiceMood insertItemWithObjectValue:@"Sad" atIndex:[choiceMood numberOfItems]]; [choiceMood insertItemWithObjectValue:@"Happy" [choiceMood insertItemWithObjectValue:@"Excite" } 1/13/14
Android (初期処理詳細) 同様にマップを初期化 同様にマップを初期化 exciteList = new ArrayList<Integer>(); happyList = new ArrayList<Integer>(); sadList = new ArrayList<Integer>(); exciteList.add(R.raw.excite1); ~ happyList.add(R.raw.happy1); sadList.add(R.raw.sad1); 1/13/14
iPhone (選択時のイベントハンドラ) 選択したカテゴリを保持しておく - (IBAction)controlTextDidBeginEditing:(id)sender { choiceStr = [(NSComboBox *)sender stringValue]; } 1/13/14
Android (選択時のイベントハンドラ) Button start = (Button)findViewById(R.id.button1); start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.excite1); mediaPlayer.start(); } }); 1/13/14
iPhone (音楽再生①) - (IBAction)startMusic:(id)sender { if (self.choiceStr == nil || [self.choiceStr isEqualToString:@""]) { [self showDialog:@"注意" message:@"カテゴリを選択して下さい"]; return; } NSMutableArray *list = (NSMutableArray *)[self.mapList objectForKey:self.choiceStr]; if (list == nil) message:@"存在するカテゴリを選択して下さい"]; 1/13/14
iPhone (音楽再生②) int n = arc4random() % list.count; NSString* select = [list objectAtIndex:n]; NSString *path = [[NSBundle mainBundle] pathForResource:select ofType:@"m4a"]; if (self.player != nil) { [self.player stop]; self.player = nil; } player = [[AVAudioPlayer alloc ] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; [self.player play]; 1/13/14
Android (音楽再生) メディアプレイヤーオブジェクトを生成し、 音楽ファイルを指定した後、再生 mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.excite1); mediaPlayer.start(); 1/13/14
- (IBAction)stopMusic:(id)sender { [self.player stop]; } iPhone (音楽停止) - (IBAction)stopMusic:(id)sender { [self.player stop]; } 1/13/14
再生中だった場合、音楽を止める if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } Android (音楽停止) 再生中だった場合、音楽を止める if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } 1/13/14
全ソースはストレージにアップしてあります。 1/13/14
・Androidの方はJavaを使うため、 クラスも豊富で、扱いやすいので開発しやすい。 感想 ・Androidの方はJavaを使うため、 クラスも豊富で、扱いやすいので開発しやすい。 ・ただ、Androidはエミュレータの起動が とんでもなく遅いのでちょっとした動作確認にも 凄く時間がかかる。 (マシンスペックのせい?) 1/13/14
・挫折しないためのAndroidプログラミング 128のキホン 参考資料 ・挫折しないためのAndroidプログラミング 128のキホン http://www.shuwasystem.co.jp/products/7980html/3292.html ・詳解 Objective-C 2.0 第3版 http://www.sbcr.jp/products/4797368277.html 1/13/14