3/09/2010

Automate to delete private header of own framework

When you build application using own framework, class header file does exist in package.
It's no matter for public framework, but off course we don't want to open class header rerated to activation or authorization.
After build application, you need delete

MyApp.app/Contents/Frameworks/MyKit.framework/PrivateHeaders
or
MyApp.app/Contents/Frameworks/MyKit.framework/Versions/A/PrivateHeaders

It's troublesome.
In Xcode, select your target and
Project > New Build Phase > New Run Script Build Phase
or control click target and select
Add > New Build Phase > New Run Script Build Phase
from context.
Write script like follow and you can perfectly automate this work

cd "${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}/Contents/Frameworks"
rm -rf *.framework/PrivateHeaders
rm -rf *.framework/Versions/*/PrivateHeaders

It saves much time.


自作フレームワークを組み込んだアプリケーションをビルドする時、パッケージの中にヘッダファイルが残ってしまう。
公開したいフレームワークの場合はいいんだけど、アクティベートとかオーソライズといったものに関連したフレームワークのヘッダなんてもちろん公開したくない。
アプリケーションをビルドしたあと、ビルドされたアプリ内の

MyApp.app/Contents/Frameworks/MyKit.framework/PrivateHeaders

MyApp.app/Contents/Frameworks/MyKit.framework/Versions/A/PrivateHeaders

あたりのファイルを削除する必要があるけど、アプリケーションのビルドの都度これらを Finder 上で削除するのは非常に面倒。
Xcode のメニューで
プロジェクト > 新規ビルドフェーズ > 新規スクリプトを実行
もしくはターゲットを右クリックしてコンテクストメニューから
追加 > 新規ビルドフェーズ > 新規スクリプトを実行
を選択し以下のようなスクリプトを入力することでこの作業を完全自動化できる。

cd "${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}/Contents/Frameworks"
rm -rf *.framework/PrivateHeaders
rm -rf *.framework/Versions/*/PrivateHeaders

めちゃくちゃ時間の節約になる。

3/04/2010

UIImagePickerController doesn't work in certain cases

The following are the codes that use UIImagePickerController with UIImagePickerControllerSourceTypeCamera.
This code is written in subclass of UIViewController and "self" is UIViewController.

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
  UIImagePickerController *controller = [[UIImagePickerController alloc] init];
  controller.sourceType = UIImagePickerControllerSourceTypeCamera;
  [self presentModalViewController:controller animated:NO];
  [controller release];
}

This code doesn't work at -viewDidLoad and -viewWillAppear:
At -viewDidAppear:, that works properly.

For example, in AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  //insert initialize code here, not work
  [window addSubview:viewController.view];
  [window makeKeyAndVisible];
  //insert initialize code here, work

  return YES;
}

初期化した UIImagePickerController を View がオフスクリーン状態の ViewController を利用して表示しようとすると正しく動作しない。UIImagePickerControllerSourceTypePhotoLibrary でも試してみたけど同じく動作しない。View がオンスクリーンになっている ViewController を利用して表示しないといけないみたい。

spec iPhone 3GS OS 3.1.3