処理を一時停止する方法

UITableView のセルに UITextField を保持したカスタム セルを用意し、設定値を入力できるようにした。

カスタマイズ UITableViewCell

画面に”登録”ボタンを配置したが、UITextField に設定値を入力編集後、”登録”ボタンを押下し、画面遷移すると設定値が保存されていないという問題が発生した。

原因は、以下の通り。
UITextField の UIControlEventEditingDidEndOnExit コントロール イベントを取得し、編集終了と判断して入力された設定値を保存しようとしていたが、UIControlEventEditingDidEndOnExit の通知を受ける前に”登録”ボタン押下時の処理が行われていた。
結果、編集した設定値を保存する前に画面遷移が行われていたのが問題だと分かった。

というわけで、
(対処前)”登録”ボタン押下処理 → (変更前の)設定値 保存 → UITextField 編集終了の通知
(対処後)UITextField 編集終了の通知 → “登録”ボタン押下処理 → (変更後の)設定値 保存
“対処後”の順番で処理が行われるように、NSRunLoop クラスを利用して UITextField 編集終了の通知を受けるまで、処理を一時停止するようにした。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 登録ボタンが押下された際の処理
- (void)registerButtonAction
{
    // 編集終了通知が受信されるまで待つ (0.5秒間隔で受信確認する)
    while (!didEndEditingFlag_) {
        // ソフトキーボードが表示されている場合、非表示にしないと編集終了通知がされないため、非表示とする
        [editingTextField_ resignFirstResponder];
 
        // 処理を一時停止し NSRunLoop へ制御を戻す
        // 0.5秒後、処理を再開する
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
    }
 
    // 設定情報マネージャへデータを保存する
    [self writeSettingManagerValue];
     :
     :

iOS アプリでバージョン情報を保持する方法

iOS アプリのバージョン情報は、プロジェクトで指定することができる。

バージョンとビルドの設定

バージョンとビルドの設定

プログラム コードで参照するには以下の通り。

1
2
3
4
5
6
7
// バージョン情報を取得する
- (NSString *)getVersion 
{
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"バージョン:%@ ビルド:%@", version, build];
}

UITapGestureRecognizer と通常のアクション メソッドを利用する

1
2
3
4
5
6
7
8
UITapGestureRecognizer *tapRecognizer;
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapColumn:)];
 
// 通常のテーブル ビューのアクションもコールバックさせるため
tapRecognizer.cancelsTouchesInView = NO;
 
[tblView addGestureRecognizer:tapRecognizer];
[tapRecognizer release];

UISwitch のテキストが、”|”と”◯”で表示される場合の対処方法

UISwitch を利用する際、プロジェクトに英語リソースしかない場合、UISwitch コントロールに”|”と”◯”が表示されてしまう。

日本語リソースを追加すると、”オン”と”オフ”で表示してくれる。

でも、結構流通しているアプリでも UISwitch コントロールが”|”と”◯”のアプリって見かけるしなぁ〜 どうなんだろう?

NSArray から NSMutableArray を作成する方法

NSUserDefaults などから NSArray を取得し、NSMutableArray としてオブジェクト配列を利用したい場合、mutableCopy メソッドが利用できる。

1
2
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* mutableArray= [[defaults arrayForKey:@"STATE"] mutableCopy];

UIPopoverController を閉じる際に注意すること

dismissPopoverAnimated:メソッドをコールすると
– (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
がコールされない。

ポップオーバー コントロール作成時にポップオーバー コントロールのメンバ変数を参照し、alloc している場合は、必ず nil をセットしておく。
また、ポップオーバー コントロールへ release メッセージを送信し、解放しておかないとリークの原因になるので注意すること。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// ポップオーバー コントロールの表示処理
- (void)dispPopoverControll
{
    // ポップオーバー コントロールを表示する
    if (!popoverController_) {
    	// ポップオーバー コントロールを alloc する
    	:
    }
    if (!popoverController_.popoverVisible) {
		:
    }
}
 
#pragma mark -
#pragma mark UIPopoverControllerDelegate Method
 
// ポップオーバー コントロールがコントロール領域外をタップするなどして非表示とされた際の処理
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    // the user dismissed the popover, so release it here
    [popoverController release];
    popoverController = nil;
 
    popoverController_ = nil;    
}
 
- (void)closePopoverController
{
    // 本ポップオーバーを非表示にする
    if (popoverController_.popoverVisible == YES) {
        [popoverController_ dismissPopoverAnimated:YES];
 
        [popoverController_ release];
        popoverController_ = nil;
    }
    :
}

iPad アプリを OTA 配信(Over The Air)する方法

オーガナイザでビルドが完了した後の処理は以下の通り。
IIS にアプリを配置し配信しようとして悩んだ箇所があったので、対処方法も記す。

1. ”Save for Enterprise Distribution”チェックボックスをチェックすると設定項目が表示されるので、OTA配信に必要な情報を入力し、[Save]ボタンを押下する
“Save As:”にアプリ名を入力する
“Application URL:”に配信用URLを入力する
→ アプリケーション(.ipa)ファイルの完全修飾 HTTP または HTTPS URL
“Title:”に適当なタイトル(???アプリ配信など)を入力する

2. 配信用ページを用意する
アプリ名と配信用URL(.plist)を記入し、配信用ページを用意する
→ index.html (配信用ページ)

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html>
<head> 
  <meta name="viewport" content="width=device-width" />
  <title>(アプリ名)</title> 
</head> 
<body>
<center>
<h1>(アプリ名)</h1>
<a href="itms-services://?action=download-manifest&url=http://example.com/(アプリ名).plist">(アプリ名)をインストール</a>
</center>
</body>
</html>

3. 作成した以下のファイルをサーバへアップロードする
– .ipa (アプリファイル)
– .plist(”Save for Enterprise Distribution”チェックボックスをチェックしておくと生成される)
– (必要であれば、)画像ファイル
– 配信用ページ(index.html)

4. 配信用URLへアクセスし、テストする
ここで問題が起きるようであれば、サーバのMIMEタイプの設定を確認する
私は IIS サーバを利用したが、ここで問題が起きたので、以下の資料を基に MIME タイプの設定を行うことで、問題が解決した
→ MIME タイプ設定を行うと web.config ファイルが作成されていた

Apple公開のSDK
– iOS 4 搭載デバイス用 エンタープライズアプリケーションの配布

– サーバの MIME タイプの設定
マニフェストファイルとアプリケーションファイルが正常に配信されるように、Web サーバの構成が必要になる場合があります。
– Mac OS X Server の場合は、サーバ管理を使用して「MIME タイプ」設定に次の MIME タイプを追加します。
application/octet-stream ipa
text/xml plist
– IIS の場合は、IIS マネージャを使用して、サーバの「プロパティ」ページで次の MIME タイプを追加します。
.ipa application/octet-stream
.plist text/xml

Ad Hoc ビルドする方法 (マルチ アプリケーションバンドルで ipa ファイルがビルドできないときの対処)

開発中アプリを関係者に配布する際、開発者に負担が少ない Ad Hoc ビルドという方法があります。
~.ipa ファイルのみを配布すれば良いので、開発者にとっては非常に助かるはずです。
以前より、Ad Hoc ビルドという手法があることは知っていましたが、なかなか試す機会がなかったので、実際試してみました。
また、その際にスタティック リンク ライブラリなどを利用していて ~.ipa ファイルがビルドできないという問題にも遭遇したので、対処方法をまとめておきます。
(xcode3.xではこの様な問題はなかったんだけどなぁ~。)

■ iTunes から iPad アプリを実機にインストールする方法
1. ディストリビューション用証明書をダウンロードする
Ad Hoc ディストリビューション用プロビジョニングファイルをダウンロードする
Create and Download an iOS Distribution Certificate
Create and Download an Ad Hoc Distribution Provisioning Profile

2. xcodeでアプリをビルドする
[Product]-[Archive]メニューを選択する

(注意点) 複数のプロジェクトが設定されているプロジェクトの場合、xcode 4.2.1ではビルドに失敗するため、スタティック リンク ライブラリなどのプロジェクト設定を以下の通りにすること。
“Skip Install” を “YES” にする
(自分が開発しているアプリのプロジェクトは、設定する必要なし)
Archiving project in XCode incorrectly creates multi-application bundle

3. ビルドが完了するとオーガナイザーが起動する
オーガナイザー – Archives にビルドしたアプリが一覧表示される。
対象のバージョンを選択し、[Share…]ボタンを押下する。

[iOS App Store Package(.ipa)]を選択し、[Identity:]は、ディストリビューション用プロビジョニングファイルを選択する。

ファイル名、出力先を設定し、[Save]ボタンで、〜.ipa ファイルを出力する。

■ OTA(企業の配信) する方法
1.上記の ”Save for Enterprise Distribution”チェックボックスをチェックすると設定項目が表示される。

2.配信用Webページを作成することで、配信できる。

■ iTunes から iPad アプリを実機にインストールする方法
1. 上記で作成した 〜.ipa ファイルをダブルクリックすると、iTunes – App に登録される。
2. iPad を iTunes と同期することでインストールすることができる。

xcode4 で static link library を追加する2

1. static link library の xcodeプロジェクト ファイルが公開されている場合は、プロジェクトファイルを xcode のプロジェクトナビゲータへドラッグ&ドロップする。

2. スタティック リンク ライブラリにより設定方法は異なるが、たいていは以下の様な事柄を設定する
プロジェクト設定
・プロジェクトの依存設定
TERGETS – プロジェクトを選択し、Build Phases – Target Dependencies にスタティック リンク ライブラリ プロジェクトを設定する。
・ “Header Search Paths” 設定
・ライブラリが利用しているフレームワークを追加設定する
・ビルド設定:“Other Linker Flags” under the “Linker” section, and add “-ObjC” and “-all_load” to the list of flags.

3. スタティックリンクライブラリのビルド
プロジェクト ナビゲータで、適切に認識されているか?確認する(問題がある場合、赤く表示される?)

4. スタティック リンク ライブラリを利用するプロジェクトの設定を行う
TERGETS – Build Phases – Target Dependences にリンクライブラリのプロジェクトを設定する
Link Binary With Libraries にスタティック リンク ライブラリを追加設定する

xcode 4.2.1 のアップデートができない場合の対処

mac AppStore で xcode がアップデートと表示されているのに、アップデートができない場合があります。
(私の場合、3台のマシンで xcode をアップデートして、1台がアップデートできませんでした。)

対処方法としては、アプリケーション フォルダの”Install Xcode.app”を削除し、再度、アップデートを試みることで正常にアップデートができました。