× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
iPhone を立て向きで使うか、横向きで使うか。
指定するには、ViewControllerクラスに以下の定義を追加する (あるいは、プロジェクト作成時にデフォルトでコメント内に記述されていれば、コメントから外す)
向きを表す定数が、このメソッドに引数として渡されて来るので、 アプリとして対応したい向きの場合にYESを返すようにする。 上記の例だと、デバイスが左向きの場合だけ対応ということなので、デバイスをどういう向きにしても常に左向きとして描画する。 2方向以上の向きでYESを返すようにした場合、デバイスの向きを変えると、画面が「くるっ」と回転するアレが発生する。 定数は以下。
PR |
XCode4。3とかなり変わっている。
役に立ちそうなショートカットコマンドをここに書いておく。 ビュー系 Cmd + 1 プロジェクト Cmd + 2 シンボル Cmd + 3 検索 Cmd + 4 Issue(ビルド時の警告とエラー) Cmd + 5 デバッグ Cmd + 6 ブレークポイント一覧 Cmd + 7 ログ Cmd + 0 ナビゲータ(左のカラム)表示ON/OFF Shift + Cmd + 2 オーガナイザ表示 Shift + Cmd + Y デバッグエリア表示 ファイル移動系 Ctrl + 1 関連するアイテム Ctrl + 2 カーソル位置の履歴(戻る) Ctrl + Cmd + 2 カーソル位置の履歴(進む) ←入れ替えた Ctrl + 3 ファイル履歴(戻る) ←入れ替えた Ctrl + Cmd + 3 ファイル履歴(進む) Ctrl + 4 プロジェクトディレクトリ以下表示 Ctrl + 5 グループのファイル一覧 Ctrl + 6 ファイル内の関数一覧 Ctrl + 7 問題の表示(?) ソース系 Cmd + クリック 定義にジャンプ Cmd + Ctrl + D 定義にジャンプ Cmd + ] 右シフト Cmd + [ 左シフト Opt + Cmd + ← 折り畳む Opt + Cmd + → 開く Opt + クリック クイックヘルプ Ctrl + Cmd + ? クイックヘルプ Opt + Cmd + ? APIリファレンス Ctrl + Opt + Cmd + / ドキュメント検索 デバッグ系 Cmd + B ビルド Cmd + ' 次のビルドエラー位置にジャンプ Cmd + R 実行 Cmd + . 中止 Ctrl + Cmd + Y 一時停止 F6 ステップオーバー F7 ステップイン F8 ステップアウト Cmd + \ ブレークポイント追加 Cmd + Y ブレークポイント有効化 |
XCodeとSDKを更新しようとして、
http://developer.apple.com/xcode/index.php からダウンロードしようとしたら、 Access denied と言われた。。 ADC サポートセンターに問い合わせて、と英語でのたまっている。 なんでよ!? と思って、とりあえずメンバーセンターに入ってみたら、 SDKが4.3に更新されて、もろもろのことに同意を求めるメッセージが出ていた。 それに同意して、もう一度ダウンロード試してみたら、できた。 そういうことか。 「同意が必要です」くらいのメッセージ出してよね。 |
アプリが完成したら、App Storeに置こう。
そのために、完成したアプリをAppleに提出する必要がある。 まず、Apple Menber Centerに登録することと、 iOS Developer Program を購入していることが前提。 また、アプリ名は当然のことながら、自分の会社名(またはチーム名)を考えておくと良い。 それから、サポート用のURLが必要なので、ブログでも開いておくと良いだろう。 意外と時間がかかる。 今回は動作確認やアプリのファイル構成を変えたりした時間も含めたためもあるが、6時間もかかった。 まず、アプリを完成させたら、 ここのチェック項目を全部済ます。 これが全部済んだら、アプリそのものを作る作業は終わったということ。 |
前もこういう記事を書いたような気もするが、検索しても出てこなかったので
たぶんまとめて書いたことはないんだろう。 ユーザ名(英字) NSUserName() XXXX ユーザ名(漢字) NSFullUserName() 名名名名 ホームディレクトリ NSHomeDirectory() /Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13 指定ユーザのホームディレクトリ NSHomeDirectoryForUser(@"XXXX") /Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13 テンポラリディレクトリ(不明) NSTemporaryDirectory() /var/folders/16/1607jAmvGO45jkoiNniJ6E+++TI/-Tmp-/ ルートディレクトリ NSOpenStepRootDirectory() / バンドルのパス [[NSBundle mainBundle] bundlePath] /Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app バンドルのリソースパス [[NSBundle mainBundle] resourcePath] /Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app バンドルの実行パス [[NSBundle mainBundle] executablePath] /Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/action [[NSBundle mainBundle] pathForAuxiliaryExecutable: [[NSBundle mainBundle] executablePath]] /Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/action バンドルのプライベートフレームワークへのパス [[NSBundle mainBundle] privateFrameworksPath] /Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/Frameworks バンドルのシェアードフレームワークへのパス [[NSBundle mainBundle] sharedFrameworksPath] /Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/SharedFrameworks バンドルのシェアードサポートパス [[NSBundle mainBundle] sharedSupportPath] /Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/SharedSupport バンドルのビルトインプラグインへのパス [[NSBundle mainBundle] builtInPlugInsPath] /Users/XXXX/Library/Application Support/iPhone Simulator/4.3.2/Applications/CED2DC6B-645C-40F5-A3D4-84EDABF15B13/YYYY.app/PlugIns |
確認すべきこと
ビルド構成をReleaseでリビルドして、ワーニングやエラーが無いか? 当然のことながら、バグは無いか? iPhone/iPad/iPod、どのデバイスで動作するアプリかを正しく設定したか? 動作確認したデバイスとOSのバージョンは控えた? バックアップを取った? アプリのタイトルを決めた? Icon.png(72x72)を描いてプロジェクトに追加した? データを確認した? セーブデータを空にした状態で問題なく動いた? 無用なデータを載せていないか?(もう使っていない画像ファイルとか) 広告は載せた?(必要なら) スクリーンショットを撮る XCodeのオーガナイザで。 xxxx-info.plistの記入 xxxx-info.plist の Bundle display name に記入する。無記入だと、プロジェクトの名前がアプリ名になる。 これがアプリ固有の識別名になる。 ここの名前を変えてビルド実行すると、別のアプリとして作られる。実機iPhone上にも新たなアイコンが出て別のアプリとして起動するし、シミュレータ実行すれば、iPhone Simulatorディレクトリ下に新たにディレクトリが追加される。 ゲームを最初の状態から開始したいときは、名前を変えちゃうのが楽で確実。 履歴を残す意味で、バージョン管理ツールでいうタグのようなつもりで、ときどき名前を変えていてもいいかも。 xxxx-info.plistの Icon file にファイル名を追記する。(ファイル名をIcon.pngのままにするなら書いてなくても良い) Localization native development region を Japan に。 Bundle identifier の yourcompany の部分を自分固有の名前に。 問題ないなら、次はDeveloper Centerへ行っての作業に成ります。 |
iAdを組み込む方法。
まず、iOS4以降であること。 XCodeを開く iAdフレームワークを追加 プロジェクトビュー→Frameworks→右クリック→追加→既存のフレームワーク→iAd.framework viewController.h に以下のように追記
viewController.mm に以下のように追記
で、オシマイ。なんとこれだけ。 1分で終わる。 |
iOS4以降では、アプリを中断して、別のアプリを実行することが出来る。
中断されてバックグラウンドに行っているアプリは、フォアグラウンドに戻って来るときのため、メモリ上にまだ存在している。 しかし、フォアグラウンドのアプリがメモリを消費してシステムのメモリが足りなくなったとき、 バックグラウンドのアプリのメモリが解放されるときがある。 解放されてしまったアプリを再開すると、アプリの頭から開始される。 これは市販のアプリでもそうなっているものが多い。 (解放されていなければ、中断した状態からアプリを再開できる…iOS4以降対応のアプリなら) デバッグ実行していると、
と出て終了してしまう。 バックグラウンドのアプリが終了してしまったというログが XCode→オーガナイザ→デバイスログ に残るわけではないので、(実行中アプリ自体がメモリ確保に失敗した場合は、Crash とか Low Memory といったログが残るが) 確認する方法はこれしか見つけていない。(他にもあるんだろうか) **以下、仕様的な話** 使用可能なメモリ領域が少なくなったとき、 - (void)didReceiveMemoryWarning が呼ばれる。 または、 AppDelegate の applicationDidReceiveMemoryWarningメソッド や UIApplicationDidReceiveMemoryWarningNotification でも通知を受け取れる。 ただしこれらの通知は、フォアグラウンドで実行中のアプリにしか行われない。 この通知を受け取ったら、使っていないメモリを速やかに解放する必要がある。 キャッシュやイメージオブジェクトなどが望ましい。あとで必要になったときに再生成できるからである。 規定の動作の例として、例えばビューコントローラの場合、visibleでないビューを解放する。 (ビューが解放されたかどうかは、viewDidUnload の処理が呼ばれるかどうかで確認することができる。なお、viewDidUnload は dealloc 後には呼ばれない) なお、メモリ不足をシミュレートする機能が、iOSシミュレータには付いている。 アプリをシミュレータで起動した状態で iOSシミュレータ→ハードウェア→メモリ警告をシミュレート とすると、すぐに前述の MemoryWarning 系の通知が飛んでくる。 参考:iOS Application Programming Guide pp.120~ |
NSTimerクラス。
タイマーの機能が使える。 http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html インスタンスを生成するメソッドはいくつかあるけれど、今回はこれを使う。 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 / 60.0 target:self selector:@selector(timerEvent) userInfo:nil repeats:YES]; intervalがタイマー間隔 targetとselectorが、時間が来たときに呼ばれるインスタンスとメソッド。 userInfoはnilにしておく(のが良いとリファレンスにも書いてある) repeatsは、繰り返すかどうか。 タイマーを発動させるときは、 [timer fire]; タイマーを止めるときは、 [timer invalidate]; 以上。簡単。 注意すべき点としては、invalidateを呼び出すと、timerインスタンスが無効になる。 この状態でタイマーを再開しようと思って単に [timer fire]; とすると、落ちてしまう。 この場合、 timer = [NSTimer scheduledTimerWithTimeInterval...]; からやり直さなければならない。 |