はじめてのiOSアプリケーション開発

iOSアプリケーションを実際に作ってみましょう。

今回は題材として簡易メモ帳を制作します。

Xcodeでのプロジェクト作成

まず[File]->[New Project]をクリックする。すると次の画面が表示される。

この中の「View-Based Application」を選択する。プロジェクトの名前の設定になるのでMemoPadと入力する。これでMemoPadプロジェクトが作成されプロジェクトウィンドウが表示される。

Xcodeによってあらかじめいくつかのファイルが生成されている。その中でMemoPadAppDelegateとMemoPadViewControllerクラスがあるのが確認できる。また拡張子がxib(XML Interface Builderの頭文字)のファイルはユーザーインターフェースのレイアウトを行うためのファイルでInterface Builderを使って編集することになる。

MemoPadViewController.hの編集

次にMemoPadViewController.hを次のように編集する。

[objc]
#import

@interface MemoPadViewController : UIViewController {
// テキストビューのためのアウトレット
IBOutlet UITextView* textView;
}

// キーボードを隠すためのアクション
- (IBAction)done;

@end
[/objc]

textViewインスタンス変数の先頭に付いているIBOutletはアウトレットと呼ばれ、Interface Builderに対して、この変数をユーザインタフェース上の部品と関連づけることができることを示している。
doneメソッドの返り値のIBActionはアクションと呼ばれ、アクションもInterface Builderで利用される。

[File]->[Save]で編集を保存しておく。

Interface Builderでのレイアウト

次にMemoPadViewController.xibをダブルクリックし、Interface Builderを起動する。

すると4つのウィンドウが表示される。

  • MemoPadViewController.xibはxibファイルの内容を示すものである。
  • Viewはアプリケーションを実行した時に表示される画面でこの上に部品を配置していくことになる。
  • Attributesはビュー上に配置した部品の設定を行う画面
  • Libraryはビューに配置する部品を選択することができる。

上の画像のように部品を配置する。ナビゲーションバーにはタイトルを設定する。Bur Button Item Attributesの「Style」と「Identifier」を「Done」に設定しておく。

アウトレットとアクションの接続

xibウィンドウ中のFile’s Ownerアイコンを右クリックする。

ここでこのインスタンスから接続可能なアウトレットのアクションの一覧が表示される。textViewの右端にある○をドラッグしてテキストビュー上でドロップする。

さらにdoneの右端にある○をドラッグしてDoneボタン上でドロップする。

[File]->[Save]で作業内容を保存する。

MemoPadViewController.mの編集

@implementationと@endという指示子の間に次のコードを書く。

[objc]
- (IBAction)done
{
// キーボードを隠す
[textView resignFirstResponder];
}
[/objc]

これで入力が終わったらDoneボタンを押すことでキーボードが隠れるようになった。

ビルドと実行

メニューからSimulatorとiPhoneを選択する。

そして「Build and Run」ボタンを押し、コンパイル、インストール、シミュレータ起動までを行う。

これでひとまず完成である。次からは機能の拡張をしていく。

デバイスの回転への対応

MemoPadViewController.mの次の部分を修正する。

[objc]
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// デバイスが回転したとき、ビューも回転させる
return YES;
}
[/objc]

これで端末を回転すると画面も回転するようになる。

テキストの保存と読み込み

MemoPadViewController.mを次のように編集する

[objc]
- (void)viewWillDisappear:(BOOL)animated
{
// テキストファイルのパスを決定する
NSArray* paths;
NSString* path;
paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
path = [paths objectAtIndex:0];
path = [path stringByAppendingPathComponent:@"text"];

// テキストからバイト列を作成する
NSData* data;
data = [textView.text dataUsingEncoding:NSUTF8StringEncoding];

// バイト列をファイルに書きこむ
[data writeToFile:path atomically:YES];
}
[/objc]

[objc]
- (void)viewWillAppear:(BOOL)animated
{
// テキストファイルのパスを決定する
NSArray* paths;
NSString* path;
paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
path = [paths objectAtIndex:0];
path = [path stringByAppendingPathComponent:@"text"];

// テキストファイルが存在する場合
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
// ファイルをバイト列として読み込む
NSData* data;
data = [NSData dataWithContentsOfFile:path];

// バイト列をテキストに変換する
NSString* string;
string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
[string autorelease];

// テキストをテキストビューに設定する
textView.text = string;
}
}
[/objc]

上のコードでビューが隠れるときにテキストを保存し、ビューが現れるときにテキストを読み込んでいる。

参考:

【特集】iPhoneアプリケーション開発入門 | エンタープライズ | マイコミジャーナル

Xcodeを使ったjailbreak済みiPod touchアプリの開発

MacでiOS向けのアプリを作る場合Appleの統合開発環境(IDE)であるXcodeを使って開発すると便利です。そこでjailbreak済みのiPou touch向けアプリを作るための方法を紹介します。

1.公式のガイドを参考にしながら証明書をつくる(Obtaining a Signing Identityのみ行えばよい)

2.jailbreak済みのiPod touchでCydiaを使い、AppSyncをインストールする。しかしデフォルトのリポジトリにはAppSyncはないのでhttp://cydia.hackulo.usを追加してからインストールする

3.SDKSettings.plistを編集する

[plain]
cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.0.sdk
sudo cp SDKSettings.plist SDKSettings.plist.orig
sudo vi SDKSettings.plist
[/plain]

<key>CODE_SIGNING_REQUIRED<key>
<string>YES<string>

という部分と

<key>ENTITLEMENTS_REQUIRED<key>
<string>YES<string>

という部分を見つけそれぞれYESをNOに書き換える。

4.Info.plistを書き換える

[plain]
cd /Developer/Platforms/iPhoneOS.platform/
sudo cp Info.plist Info.plist.orig
sudo vi Info.plist
[/plain]

<key>CODE_SIGN_CONTEXT_CLASS<key>
<string>XCiPhoneOSCodeSignContext<string>

という部分の

<string>XCiPhoneOSCodeSignContext<string>

という行を

<string>XCCodeSignContext<string>

に書き換える。

5.Xcodeのパッチを書く

[plain]
cd ~/Desktop
vi script
[/plain]

[shell]
#!/bin/bash
cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
printf "\xc3\x26\x00\x00" >> working
/bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
/bin/mv working iPhoneOS\ Build\ System\ Support
chmod a+x iPhoneOS\ Build\ System\ Support
[/shell]

上記を貼りつける。

[plain]
chmod 777 script
./script
[/plain]

うまういくと以下のように表示される。

[plain]
$ ./script
223+1 records in
223+1 records out
111648 bytes transferred in 0.002678 secs (41692099 bytes/sec)
[/plain]

これでコードサインが必要ないことをXcodeに伝えた。

6.Xcodeでコードサインしないように設定する

Xcodeを起動し、Project>Edit Project Settingsをクリックし”Buid”タブを開く。
“Code Signing Identity”とその中の”Any iOS”の設定を”Don’t Code Sign”に設定する。
iOSのバージョンに合わせて”iOS Deployment Target”の値を変更する。

これでCode Sign error: The identity ‘iPhone Developer’ doesn’t match any valid certificate/private key pair in the default keychainというエラーはでなくなる。

7.次のコードを実行する

[plain]
mkdir /Developer/iphoneentitlements401
cd /Developer/iphoneentitlements401
curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
mv gen_entitlements.txt gen_entitlements.py
chmod 777 gen_entitlements.py
[/plain]

8.iPod touchをつなぎ、Xcodeを立ち上げる。Window>Organizerをクリックし、デバイスを選択する。そして”Use for development.”をクリックする。provisioning website loginを求められるがcancelをクリックする。

これで実機で動作するようになったはずである。

Error from debugger: The program being debugged is not being run
というエラーがでる場合の対処:

Project > New Build Phase > New Run Script Build Phaseを開き、windowに次のコードをコピペする。

[plain]
export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
/Developer/iphoneentitlements401/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" –entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi
[/plain]

参考:

Developing for a Jailbroken iPhone A to Z (iOS 4.0.1) « alexwhittemore.com

Code Signing Guide: Procedures

MacでiPod touch用アプリのコンパイルを行う(クロスコンパイル)方法

Mac上でiPod touch用のアプリケーションの開発を行おうと思っても、iPod touchではarmというCPUアーキテクチャを使っているため、x86アーキテクチャを使っているMacなどではiPod touch用のオブジェクトコードを出力することができません。

しかし公式SDKの中に含まれるgccコンパイラを使えば、iPod touch向けコードを生成することができます。

まずApple公式ページよりiOS SDKをダウンロードします。

そして次のコマンドを実行することでiPod touch用にソースをコンパイルすることができます。

/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -arch armv6
– isysroot/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -o hell o hello.c

なお、-frameworkオプションも使えるため-framework Foundationという風にオプションを追加すればObjective-Cのソースもコンパイルすることができます。

参考:
iOS Dev Center – Apple Developer

Toolchain 2.0 – The iPhone Wiki