AndroidとiPhoneに おける開発比較 2014/01 0-1. 初めに • • • • 現在、スマートフォンアプリの開発と言えば、 Android or iPhoneがシェアの大半を独占 実際の開発に当たり、どのような違いがある かは気になるところ 今回は開発するに当たっての違いから、簡単 なアプリ作成までを検証 ゴールとして動作するアプリを見せます 0-2. 目次 • 以下の手順で比較していきます 1. 概要 2. 各種構文 3. 実際のアプリ作成 1-1. 概要(シェア) • • • • 世界と日本ではなぜか大きく異なる(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言語を拡張した言語です この「@」はコンパイラに対して、Objective-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クラス定 義) • まず、C言語を拡張したということはヘッダファ イルにクラスの宣言が必要ですね。 【ヘッダファイル】(拡張子を「.h」で作成) @interface Animal:NSObject { //赤部分は親クラ スを指定 // ここにクラスフィールドを定義 } // ここに関数を定義 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」の後にクラス名で定義 2-4.構文(最後に) • あまり、説明できていませんが詳細に説明す ると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" atIndex:[choiceMood numberOfItems]]; [choiceMood insertItemWithObjectValue:@"Excite" atIndex:[choiceMood numberOfItems]]; } 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 (選択時のイベントハンドラ) Rを元にボタンを取得し、ハンドラ登録 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) { [self showDialog:@"注意" message:@"存在するカテゴリを選択して下さい"]; return; } 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]; 1/13/14 [self.player play]; Android (音楽再生) メディアプレイヤーオブジェクトを生成し、 音楽ファイルを指定した後、再生 mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.excite1); mediaPlayer.start(); 1/13/14 iPhone (音楽停止) - (IBAction)stopMusic:(id)sender { [self.player stop]; } 1/13/14 全ソースはストレージにアップしてあります。 1/13/14 感想 ・Androidの方はJavaを使うため、 クラスも豊富で、扱いやすいので開発しやす い。 ・ただ、Androidはエミュレータの起動が とんでもなく遅いのでちょっとした動作確認 にも 凄く時間がかかる。 (マシンスペックのせい?) 1/13/14 参考資料 ・挫折しないためのAndroidプログラミング 128 のキホン http://www.shuwasystem.co.jp/products/7980 html/3292.html ・詳解 Objective-C 2.0 第3版 http://www.sbcr.jp/products/4797368277.html 1/13/14
© Copyright 2024 ExpyDoc