iPhone京都勉強会に参加して以来、多忙ということもありなかなかアプリ作成までに至りませんでした。しかし、勉強会も8月5日で第4回(最終回)を迎えるので、それまでに何か一つ実になるようなアプリを作らねばならないと奮起して作成を始めました。
ソース内には、多くの日本語コメントがあり、本デベロッパーノートでは、各バージョンの説明と気づいた点をメモしていますので、開発に役立つかも知れません。また、PHP的に理解するとこうだとかいうコメントが若干入ってます。
2009年8月28日深夜にApp Storeに初登録申請しました。勉強会も第2回目が始まり、今度はObjective-Cの勉強ではなく、作成したアプリの紹介という形式になり、OpenGLアプリなどの紹介がなされました。第3弾では、iPad, AndroidなどiPhoneだけでなく、その周辺機器も含めた勉強会に拡大し、2011年2月現在の第5弾ではMac AppStoreも加え、さらに社会人向けにガジェット全般における関連情報についても発表されています。
筆者のアプリもiPad日本上陸前になんとかiPadに対応させることが出来ました。次はOS 4.0対応ですかねぇ。(2010.05.28 更新)
作成アプリのアイコンやLoading画面の画像は、小学生になった我が娘が作ったオリジナル作品です (2010.05.19)
iOS4.xとiOS3.xの共存に苦労。特にiOS3.2以降の新機能を使う場合、iOS3.1などで実機動作させたときにEXC_BAD_ACCESSがそのメソッド部分で出てしまう。これには苦労しました・・・(2011.04.06)
iOS6登場に伴うXcode 4.5の到来によって、iOS4.3以上しかサポートされないようになった。選択肢は2つ、新しいアプリとして登録するのか、サポートを打ち切るのか。内容を考えると新アプリとして出すほどのものでもないので、サポートを打ち切る方向で勧める。これにともない、バージョンは1.0とした(2012.10.10)。しかし新しい開発環境を整えるだけで半日も時間を費やした。
初期画面 | 利用中画面 | v0.3(利用) | v0.3(抽選終了時) | v0.52(利用) |
iPad画面 | iPadのLoading画面(縦) | iPadのLoading画面(横) |
#define CANCEL [NSString stringWithCString:"キャンセル" encoding:NSUTF8StringEncoding]のように使う。iPhoneはUTF8が標準のようだ。MacOSXはUTF16らしい。
CFBundleShortVersionString = "抽選くん version 0.56"; CFBundleGetInfoString = "抽選くん version 0.56, Copyright 2009 Kimiya Kitani(kitani@kitaney.jp)."; NSHumanReadableCopyright = "Copyright 2009 Kimiya Kitani(kitani@kitaney.jp).";
"ユニーク名" = "文字列";といれてゆけばいい。ボタンなどは省略記号であるケースも多く、ユニーク名の方を意味がわかる言葉にしておいてもいい。たとえば、「Set Data」は英語表記で「Set」日本語で「初期化」これでもいいんではないでしょうか。
[UIView beginAnimations:nil context:nil]; // アニメーション開始 [UIView setAnimationDuration:0.4]; // 0.4秒で view.alpha = 1.0; // 現在のViewを透明にして、 HELP.alpha = 0.0; // 指定したViewを不透明にして、 [UIView commitAnimations]; // あたかも切り替わったように見せる。ヘルプの説明自体は、UILabel * help_exp;で
help_exp.numberOfLines = 0; // ラベルを複数行OKにする help_exp.font = [UIFont systemFontOfSize:17]; help_exp.text = NSLocalizedString(HELP_EXP, @""); //ローカナイズ
-(IBAction)GoToURL { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:NSLocalizedString(GoToHP, @"")]]; }GoToHPはdefine定義です。
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientationメソッド(回転した後に実行される)に、iPadかそうでないかの判定をした上で、iPad以外ならば、横向けにしたときにY軸を2/3にした上で、フォントを13に変更。縦向けなら、Y軸を3/2にした上で、フォントを17(デフォルト)。
#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200) if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { // iPadなら無視 }else{ // iPadでなければ縦横でフォントとUIlabelのサイズ変更(Y軸を2/3 --元に戻す) if (fromInterfaceOrientation == UIInterfaceOrientationPortrait || fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){ help_exp.frame = CGRectMake(help_exp.frame.origin.x,help_exp.frame.origin.y, help_exp.frame.size.width,help_exp.frame.size.height/3*2); help_exp.font = [UIFont systemFontOfSize:13]; } else { help_exp.frame = CGRectMake(help_exp.frame.origin.x,help_exp.frame.origin.y, help_exp.frame.size.width,help_exp.frame.size.height/2*3); help_exp.font = [UIFont systemFontOfSize:17]; } } #else // iPadでない(3.1.3以下) if (fromInterfaceOrientation == UIInterfaceOrientationPortrait || fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){ help_exp.frame = CGRectMake(help_exp.frame.origin.x,help_exp.frame.origin.y, help_exp.frame.size.width,help_exp.frame.size.height/3*2); help_exp.font = [UIFont systemFontOfSize:13]; } else { help_exp.frame = CGRectMake(help_exp.frame.origin.x,help_exp.frame.origin.y, help_exp.frame.size.width,help_exp.frame.size.height/2*3); help_exp.font = [UIFont systemFontOfSize:17]; } #endifのように変更すればいい。
scand(time(NULL)); で時間に応じて乱数のタネをかえた上で、rand() % 最大数 + 1から、
arc4random() % 最大数 + 1;に切り替えた。arc4randomの方がよりランダムだそうなのでね。
// SDKがiOS3.2以上をサポートしていたらコンパイル #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200 // iOSが3.2以上なら if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) { // 外部ディスプレイが接続されたときに自動的に、screenDidConnectメソッドが呼びだされる。 // 後は、そのメソッドに外部ディスプレイ表示部分の実装をすればいい。 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenDidConnect) name:UIScreenDidConnectNotification object:nil]; // 外部ディスプレイの接続が切れた場合に自動的に、screenDidDisconnectが呼び出される。 // ここはrelease処理だな。 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenDidDisconnect) name:UIScreenDidDisconnectNotification object:nil]; // 外部スクリーンに接続(とりあえず最初から接続されているかもしれないので呼び出しておく) // screenDidConnectメソッド内でもディスプレイ接続されているかのチェックをしちえる [self screenDidConnect]; } #endifscreenDidConnect内では、UIScreenModeを使って現在の利用可能なモードのうち、最大値をチェック。最大モード(解像度)で外部ディスリプレイに表示するプログラムとなる。
[externalWindow release]; externalWindow = nil;のようにリリースしてから、nil(空ポインタであってNULLではない)を代入し、メモリ参照を解除することで確実にreleaseさせる
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200 - (void)screenDidConnect{ } - (void)screenDidDisConnect{ } #endifのようにかこっておく。まぁいまどきそんな古いSDKは使われてないと思いますけどね。
iPhone/iPodならではの設定などがMacOSXとは異なるので手間取りまし た。というかPHPやC言語をしていた人間がいきなり作ったプログラムですから、 まだまだ稚拙です。まずは勉強のためということで作ってみています。