使用するマップを初期化し - ForeFrontier

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