デベロッパーノート for 抽選くん (iPhone)

木谷 公哉(KITANI Kimiya)
kitani@bakkers.gr.jp

はじめに

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)。しかし新しい開発環境を整えるだけで半日も時間を費やした。

iPhone勉強会
発表資料は下記の通り
ポリシーと開発環境
  • 基本的に、Interface Builderでの値設定はしない(コード内に書く)
  • 常に最新OSで開発する(現在:iOS 4.2、MacOS10.6.x..ただしiPhone 3.0開発環境も残しテストしている)。
  • 2009.08.31: Snow Leopardに開発環境を変更
  • 2009.09.30: iPhone SDK 3.1 with XCode 3.2に変更
  • 2009.10.01: シミュレータで動作しない問題を解決。ソースの0.61aを入れ替え。(printfを使っていたら、10.6用gccコンパイルはこける。10.5以下に設定変更が必要)
  • 2010.04.15: iPhone 4.0betaで動作確認。iPhone 3.1.3/iPadのユニバーサルバイナリーの作成。App Store申請。翌日Reject。横向きに対応しなければならないとのこと。うーん、これは面倒。iPadも1ヶ月販売延期したから、その間に考えるか・・・。
  • 2010.05.13: iPhone 3.0以上/iPadのユニバーサルバイナリーを作成。App Storeに3度目の申請。今度は実機で確認したからいけるはず!
  • 2010.05.19: 抽選くん v0.81を掲載(まだv0.80が申請中なので、本バージョンはここに掲載するのみ)
  • 2010.05.20: 抽選くん v0.80(ソースコード v0.80b)が審査に通過。抽選くん v0.81を申請
  • 2010.05.28: 抽選くん v0.81が、App Storeの審査通過で27日に掲載されました! iPadも本日日本上陸で、何とか間に合いましたね。次はOS4.0ですか。
  • 2011.04.06: 開発環境を、XCode 4.0.1 with SDK4.0にし、抽選くん v0.9を申請
  • 2012.10.10: 開発閑居を、Xcode 4.5.1とし、抽選くん v1.0を作成。
抽選くん (2009.07.28開設)
DrawingXを参考に作ってみました。
0.56でアプリ名を変更
初期画面 利用中画面 v0.3(利用) v0.3(抽選終了時) v0.52(利用)
iPad画面 iPadのLoading画面(縦) iPadのLoading画面(横)

[ソース]
[実装済]
  • 0.1 (2009.07.28)
    • 番号の最大値に、上限の数を入力し、初期化ボタンをクリックします。
    • 番号の最大値をいれずに初期化ボタンを押したりすると、エラー表示でます
    • 番号の最大値は、1以上の整数しか入力できなくなっています。
    • 初期化されるまで、「抽選」ボタンはクリックできません
    • 「区切り」をクリックすると、履歴に「-」が入ります
    • 「抽選」を押すと、ランダムな数字がでますが、同じ物はでません
    • 出たものの結果は、下部に出てきます

  • 0.2 (2009.07.28)
    • 日本語コメントの充実
    • 番号の最大値のデフォルトキーレイアウトを「Numbers & Punctuation」にセット(Interface Builder)→次のバージョンからプログラム内に埋め込むように変更予定
    • Returnキーでの反応
    • テキストフィールドは、クリックするたびにキーボードの表示・非表示となる
    • 初期化ボタンをおしたら、開いているキーボードはすべて閉じる
    • 番号の最大値の入力中にReturnを押すと、「初期化」ボタンを押したのと同じ動作をさせる
    • 番号の最大値の限界を10万とする
    • Iconを作ってみる(iPhone SDKの教科書のP184-185)
      1. 最終的に画像を「57x57」に縮小し、pngかjpgで保存
      2. http://icone.flabo.org/ でかっこよく整形し、Icon.pngという名前で保存
      3. プロジェクトに新規グループ「Images」を作成
      4. Imagesに作成したIcon.pngをほおりこむ

  • 0.3 (2009.07.29)
    • 結果フィールドのTouch Downを解除(クリックしてもキーボード解除しない)
    • 番号の最大値は、数字パットに変更
    • 一つ前と一つ先の抽選番号を表示できるようにした
      • オブジェクトの表示、非表示メソッドの追加
      • 一つ前の抽選結果は、抽選2度目以降に表示
      • 一つ先の抽選結果は、最後に「終了」と出て終了かどうか知らせてくれる

  • 0.4 (2009.07.30)
    • 抽選結果表示をクリップボードに保存するボタン「Clip」を追加
      • UIPasteboard *clip = [UIPasteboard generalPasteboard]; // クリップボードにアクセス
      • clip.string; // クリップボードからデータを取得
      • [clip setString: str]; //クリップボードにデータを保存
    • global-define.hを作成し、ここで定義した変数、定義は全体に有効になるように配慮(現時点ではデータなし)

  • 0.41 (2009.07.30)
    • Viewのレイアウトを若干変更
    • ClipボタンをCopyボタンに変更
    • 履歴表示でReturn押したらキーボード隠す

  • 0.5 (2009.07.30)
    • 該当者なしボタンを追加し、それを押すと抽選結果の該当数字を()で囲む
      • 各番号に対して、フラグ(-1: 無効、1: 有効)をたてる
    • 区切りボタンを廃止し、かわりに回復ボタンを付ける。
      • 該当者無しで、履歴を消しても全データを再描写するならば、履歴をあやまってけしても回復おせば復活するよねということ

  • 0.51 (2009.07.30)
    • 該当者なしを押したら、結果表示(今の)を消す(clearColor)にする。
    • 番号の最大値がおかしいデータならエラーを出していたが、さらに入力したデータも削除することにした。

  • 0.52 (2009.07.30)
    • 前の抽選結果について、該当者なしボタンを押していたら()表示する。
    • COPYを押したときのクリップボードには、該当者なしフラグ以外のデータを保管。

  • 0.53 (2009.07.30)
    • 該当者なしボタンのタイトル名を#defineで定義できるように変更
      • これでボタンのタイトルを自由に変更できる
    • COPYを押したときのクリップボードには、該当者なしフラグ以外のデータを保管。
      • 「キャンセル」を押したら、「該当者なし」にボタンが変更され、現在の抽選結果も有効になる。
      • [(UIButton *) setTitle:(NSString *) forState:UIControlStateNormal]; でタイトル変更できる。
      • ただし、#define AAA @"テスト"; のような場合には、NSString *str = AAA;としてから
        [button setTitle:str forState:UIControlStateNormal]; のようにしないとエラーになる(仕様?)

  • 0.54 (2009.07.30)
    • 該当なしを押して、抽選を押すと、「キャンセル」の表示のままであるバグを修正
      • setTitleButtonメソッドを追加。
      • でもviewDidLoadではこのメソッドを使うと、以後タイトル変更できない・・何故かは不明。(0.55で修正。文字列比較の方法が間違っていた)

  • 0.55 (2009.07.31)
    • 文字列比較の修正
      • str == str2などをしていたが、[str isEqualToString:str2]に変更
    • #defineの間違いを修正(#define CANCEL @"キャンセル"; のようにしていたが2つ問題を指摘され修正)
      • まず#defineの末尾に「;」は入れてダメ
        しかし不思議なことに、NSString *temp = CANCEL; として呼び出してやると処理できた。
      • @"ASCII文字列だけしか使っちゃダメよ"。@を使う場合には日本語使うなと。
        #define CANCEL [NSString stringWithCString:"キャンセル" encoding:NSUTF8StringEncoding]
        のように使う。iPhoneはUTF8が標準のようだ。MacOSXはUTF16らしい。

  • 0.56 (2009.08.01)
    • アプリ名の変更
      • XcodeのResourcesに新規ファイルを追加。OthersのStringファイルを選択して、InfoPList.stringsを作成
      • CFBundleDisplayName = "抽選くん"; // をいれるだけでアプリ名を変更できる
      • その他として
        CFBundleShortVersionString = "抽選くん version 0.56";
        CFBundleGetInfoString = "抽選くん version 0.56, Copyright 2009 Kimiya Kitani(kitani@kitaney.jp).";
        NSHumanReadableCopyright = "Copyright 2009 Kimiya Kitani(kitani@kitaney.jp).";

  • 0.60 (2009.08.05)
    • デバッグログをDebug指定したときのみ表示
      • http://d.hatena.ne.jp/Psychs/20081120/1227203259を参照。
    • 文字列のローカナイズ
      • #define CANCEL @"ユニーク名" としておき、NSString *cancel = NSLocalizedString(CANCEL, @""); のように使うと、後から名称変更も出来て便利。
      • ResoucesにLocalizable.stringsを追加し、そのファイルの情報で「ローカナイズを可能に」をする。するとLocalizable.stringsの下層にEnglishが出来る
      • 再度、Localizable.stringsの情報を見て、ローカリゼイションの追加で、Japaneseを加える。下層にJapaneseが出来る。
      • 後はEnglishとJapaneseのファイルに対して、
        "ユニーク名" = "文字列";
        といれてゆけばいい。ボタンなどは省略記号であるケースも多く、ユニーク名の方を意味がわかる言葉にしておいてもいい。たとえば、「Set Data」は英語表記で「Set」日本語で「初期化」これでもいいんではないでしょうか。
    • アプリ名のローカナイズ
        文字列のローカナイズと同じで、注意点は、ビルドからクリーニングしておかないといけない点だ。
    • アプリ終了時の状態保存と起動時の状態復元
      現時点では、状態保存は実装済。保存した状態をひろうところまでは出来たが、状態復元のためには値を戻すだけでなく描写部分もあるので、現在は未実装。状態復元のみ無効の状態だ。今回は、NSMutableArrayに全データを入れて、1つのオブジェクトとして保管する手法をとったが、NSDictionaryでも出来そうだ(本日これについて勉強したが、まだコードには入れていない。

  • 0.61 (2009.08.14)
    • アプリ終了時に状態を自動保存し、次回起動時に状態を復旧するようにした
      • 操作せず、アプリ終了をするとそれまで自動保存したファイルを削除するようにした
      • 今回は保存に、NSMutableArrayを利用し、NSNumber, NSArray, NSStringを纏めて保存するようにした。
      • DataStore.hが環境設定を操作するためのメソッド群としている
      • データ初期化メソッド、initializeDataを作成。起動時はviewDidLoadで呼び出している。アプリ終了時はwillTerminateで処理しているのでそれらを見ると保存、復元処理がわかるでしょう
  • 0.62 (2009.10.29)
    • ResroucesにDefault.pngを含め、起動画面に出るようにした。
    • App Storeに登録できるように、Distribute用の設定と登録に必要なアイコン等を整えた(申請中)
  • 0.70 (2009.11.11)
    • 起動時のビューを刷新(Default.png)。我が娘が描きました。
    • iPhone OS 3.0で動作するように若干調整
    • ヘルプビューを作成し、ツールバーからアプリの説明を見ることができるようにした。
      Viewをひとつ追加して、ロード時に完全透明でメインViewに追加しておく。そして切り替えるときに透明を不透明に切り替えることで2つの画面を変更する手法を使った。
      	[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, @""); //ローカナイズ
      
    • アプリ説明サイトへ飛ぶボタンをツールバーに追加。
      リンク先のHPをブラウザで開くには
      -(IBAction)GoToURL {
      	[[UIApplication sharedApplication] openURL:[NSURL URLWithString:NSLocalizedString(GoToHP, @"")]];
      }
      
      GoToHPはdefine定義です。
  • 0.80 (2010.04.15)
    • ユニバーサルアプリにしたが、iPadのポリシーによりApp StoreからRejectされた。
  • 0.80a (2010.05.06)
    縦横両対応して、再度App Storeに0.80として登録申請、iPadの横向きにしたときのHELPのナビゲーションバーに不具合があったのでRejectされた(2010.05.12)
    1. shouldAutorotateToInterfaceOrientationメソッドのコメントを外し、return YESを入れる。これで回転するようになる
    2. SubView(今回はヘルプメニュー)のY軸が+20ずれる問題(シミュレーションのバグだそうだが)を解決(UILabelのY軸とナビゲーションバーのY軸を+20する
    3. 横回転したときに、自動的に左右のサイズを調整するようにする。
      すべてのviewの部品(view本体のぞく)に対して、Interface Builderから、Autorisizingについて、水平方向のみ整列設定する(上下のみチェックを入れる)
    4. ナビゲーションバーは、Intarface BuilderからWidth方向に伸縮するチェックを入れておく
    5. ヘルプメニューの文字数を横方向で調整する
      - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
      メソッド(回転した後に実行される)に、iPadかそうでないかの判定をした上で、iPad以外ならば、横向けにしたときにY軸を2/3にした上で、フォントを13に変更。縦向けなら、Y軸を3/2にした上で、フォントを17(デフォルト)。
      UILabel *help_expを変更するものとすると
      #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
      
      のように変更すればいい。
  • 0.80b (2010.05.13)
    • iPad実機でのテストを行い。さらにiPadの4方向のLoading画面に対応。iPhoneは4.0ぐらいからしか対応しないと思います。回転はiPhoneにも対応
      • UILaunchImageFile~ipadをInfo.plistに追加し、値をDefaultiPadとする。これで、DefaultiPad.pngがiPad用のLoading画面。Default.pngがiPhone用のLoading画面と分離した。参考資料: iPad Programming Guide
      • UISupportedInterfaceOrientations~ipadとUISupportedInterfaceOrientationsを追加し、追加できる4つを追加。 それぞれ4方向に対するLoadingに対応。それぞれの画像(DefaultiPad-LandscapeLeft.png,DefaultiPad-LandscapeRight.png, DefaultiPad-Portrait.png,DefaultiPad-PortraitUpsideDown.png)を追加。iPhoneは現在未対応だが、同じくDefault-で入れておく。
      • それぞれの画像は、縦横2種類を作って、逆向きは必要なし。コピイーすればいい。(LandscapeLeft.png = LandscapeRight.pngということだ)
  • 0.81 (2010.05.19)
    • subviewのY軸座病が-20ずれる件の修正
      View ControllerのInspectorの
      • Layout: Wants Full Screenのチェックを外す
      • NIB: Resize View From NIBにチェック
      をすることで解決。それが基本であるはずが、触ってしまったのでしょう。
    • ICONをiPadの縦横だけにして、サイズを減らす。
    • HELPビューに、Aboutボタンを付けて、バージョンや著者情報を出す(Alert)
      結局、Localizable.strings内に記載。
  • 0.9 (2011.04.06)
    • Modeの追加
      • これはまぁHELPビューと同様、ビューを一つ増やすだけなのでそれほど難しくはなかった
      • ユーザから要望があったのでやってみた
    • 乱数の処理変更
      scand(time(NULL)); で時間に応じて乱数のタネをかえた上で、rand() % 最大数 + 1
      から、
      arc4random() % 最大数 + 1;
      に切り替えた。arc4randomの方がよりランダムだそうなのでね。
    • 外部ディスプレイ対応
      • iOS3.2以上で、iPhone4, iPod Touch 4th, iPad, iPad2のみ対応。ですが、iOS3.1.3などの実機で動作させた場合、このメソッドを呼び出してしまって、EXC_BAD_ACCESSとエラーがでて止まってしまう。これを防ぐためには、[[[UIDevice currentDevice] systemVersion] floatValue]で、OSのバージョンをチェックして条件分岐すること。もちろん、UIDevice自体に対応しない古いOSのケースや、SDKが非対応(もうそんなレベルのものはないはずだが)の場合にはエラーがでるので条件分岐をする。
        // 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];
        
            }	
        #endif
        
        screenDidConnect内では、UIScreenModeを使って現在の利用可能なモードのうち、最大値をチェック。最大モード(解像度)で外部ディスリプレイに表示するプログラムとなる。
        screenDidDisconnectでは、まず[view removeFromSuperview];でビューを外部ウィンドウから取り除いた上で、
        [externalWindow release];
        externalWindow = nil;
        
        のようにリリースしてから、nil(空ポインタであってNULLではない)を代入し、メモリ参照を解除することで確実にreleaseさせる
        くどいようだが、このUIScreenもSDKが古いとコンパイル失敗するので、screenDidConnectとscreenDidDisConnectのメソッド全体を
        #if	__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200
        
        - (void)screenDidConnect{
        }
        
        - (void)screenDidDisConnect{
        }
        
        #endif
        
        のようにかこっておく。まぁいまどきそんな古いSDKは使われてないと思いますけどね。
  • 1.0 (2012.10.10)
    • iPhone5およびRetonaディスプレイ対応
    • iOS6をサポート(iOS4.2以下のサポートは打ち切り)

[実装計画]
  • 結果表示を押したときにキーボードを隠す (0.41で実装: Returnをおしたら隠す)
  • (0.61で実装)履歴の保存(次回アプリ起動時も覚えてくれる)
  • (0.3で実装)「今当たった人の記録を取る」前に「次の番号を教えて」に対応
  • (0.5で実装): 抽選後の有効・無効(履歴に残すかどうか)--ひいたけど該当者ない場合。
  • シェイクしたら、抽選ボタンを押したのと同じにする(確認ボタンを出しても面白いかも知れない。だって間違えてシェイクする可能性もありますよねぇ)
  • (0.80aで実装): 縦横両対応する
  • (0.9で実装): 外部ディスプレイ対応
  • (1.0で実装予定): AirPrint対応

iPhone/iPodならではの設定などがMacOSXとは異なるので手間取りまし た。というかPHPやC言語をしていた人間がいきなり作ったプログラムですから、 まだまだ稚拙です。まずは勉強のためということで作ってみています。

注意点
  1. (Xcode4): Xcode3で作成したプロジェクトを4.0で読み込んだ場合の問題
    • シミュレーションモードのコンパイルがエラー: Project Build InfoのValid Architecturesに、i386を追加が必要
    • Application Loaderでarmv6エラーが出る: iOS3.xもサポートする場合、ProjectおよびTargetのBuild InfoのValid Architecture, Arcitecturesの両方に、armv6, armv7の両方が入っていることを確認。特にTaretの方は忘れがち。Code Signも同じことが言える。
    • iOS3.xもサポートする場合: ios deployment targetを3.0など、サポートするOSのもっとも小さいものを入れておくこと。SDKはLatestでいいでしょう。

  2. (Xcode4): Xcode4でBuildしたアプリはどこに?
    • Xcode3までは、プロジェクトのあるフォルダのBuildフォルダ以下でした。でもXcode4は違います
    • ユーザ/ライブラリ/Developer/Xcode/DevicedData/ 以下に入ります。ユニークなフォルダが生成されます。どれかのBuild/Products/Release-iphoneos/ とかに入っている。なおシミュレーションモードでBuildしたアプリは、App Storeでは受け付けてくれない。つまり何らかの実機を登録しないとApp Store用のBuildはできないってこと
  3. (Xcode4): App Store申請方法
    • iTunes Connectでアプリ登録のための情報を入力
    • Waiting for BinaryというStatusになったら、/Developer/Application/Utilities/Application Loader.app のアプリを起動
    • Apple IDを入れると、Waiting for Binaryになっているアプリ一覧表が出てくる(何もでていなければ、それができてないということ)。選択して、iOS4.0対応かどうかの選択を経て、アプリの選択画面がでたら、Buildしたアプリをzip圧縮したものを選択。うまくいけばUpdateされ、Received UploadedとかのStatusとなる
    • そのうち、Waiting For Reviewとなるでしょう。そして最終的にAcceptかRejectとなる。いずれにせよメールで連絡がくる
    • なお、アプリに問題があるとか変えたい場合には、iTunes ConnectからBinary DetailにあるReject This Binaryを選べばいい。また後で登録しなおす場合には、iTunes ConnectからRejectしたアプリを再度Binary Uploadまちの状態にして、Application Loader経由でupdateすればいい。


Back