2010年6月27日日曜日

is deprecated 対応

"is deprecated" を放置しておくとAppleからスピンオフされてしまう。
今回は NSFileManager 関係で2件対応


directoryContentsAtPath is deprecated

NSArray *array = [[NSFileManager defaultManager] directoryContentsAtPath:path];

for (NSString *fname in array) { }

⇒ enumeratorAtPath

NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:path];

NSString *fname;

while (fname = [dirEnum nextObject]) { }


fileAttributesAtPath is deprecated

NSDictionary *fileDict = [[NSFileManager defaultManager] fileAttributesAtPath:[path stringByAppendingPathComponent:fname] traverseLink:NO];

attributesOfItemAtPath

NSError *error = nil;

NSDictionary *fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath:[path stringByAppendingPathComponent:fname] error:&error];

以上

iOS4対応: iAd対応と下位互換

ここに全てがありました。iAd.framework を Weak(弱リンク)に指定すればOK
ありがとう。

iOS4対応: 下位互換にする方法

iOS4SDKを入れてXcodeを使うと選択可能なOSが、3.2 と 4.0 だけしか無い!
これでは、これまで培ってきた 3.0以上(未満の方には申し訳ない)を放置することになる。

アップデートを控えていたため、翌日には 3.2SDKに戻した。

その後、ドキュメントを正しく見ると、互換性確保の方法があったのでメモしておく。
  • Xcodeプロジェクト設置にて
  • ビルド>Deployment>iPhone OS Deployment Target が下位OSになる
  • ビルド>アーキテクチャ>ベースSDK が上位OSになる
これだけなら簡単。しかし、ここからが肝心、

下位OSの指定は、単に「このOS以上で動くハズです」と言うだけのようだ。
つまり、下位OS上で動いても問題が生じないようにするのは作者の役目。

例えば、下位OSに備わった機能だけを使っていれば問題はない。
しかし、下位OSより後に追加された新機能を使った場合に問題が生じる。

これを回避するためには、コンパイル時の「条件付きコンパイル」ではダメ
どのOSで実行されても大丈夫なように「実行時チェック」が必要。

ただ、実行時リンク(参照)される機能だけならば良いのだが、
現在、困っているのは iAd 対応。

if (NSClassFromString(@"ADBannerView")) {

ADBannerView *ad = [[ADBannerView alloc] initWithFrame:CGRectZero];

[self.view addSubview:ad];

[ad release];

}


NSClassFromStringを使って実行時にADBannerViewクラスの存在をチェクしている。
これを、iOS4で実行すれば正常。
iOS4未満で実行すると実行(起動)時に、iAd.Frameworkが無いとのエラーが表示中断される。
この回避方法が解らない。
解れば追ってメモする。

2010年6月21日月曜日

gcc-4.2 failed 発生したとき

Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

原因は、GDataプロジェクト側のビルド設定にある「アーキテクチャ」が初期値である「MAC OS」になっていることのようです。

アーキテクチャを Debug構成なら「Standard」 Release構成なら「Optimized」にする
ベースSDKを「iPhoneデバイス3.0」(バージョンはお好みに)

このように変更して再ビルドしてスタティックライブラリを更新した後、
開発アプリ側をビルドすれば正常終了するハズ

どうでしょうか

GData API Object-C 組み込み手順

gdata-objectivec-client-1 1.9 から 1.10 への移行に際して、これまで何となくやっていた手順を記録しておきます。
また、iPhone用のスタティックライブラリにして最適化するようにしました。

ソースコードの入手と配置
  • Google Codeサイトから gdata-objectivec-client-1 をダウンロードする
  • 解凍したフォルダを丸ごと開発中のアプリソースがある場所へコピーまたは移動する
  • data-objectivec-client-1/Source/GData.xcodeproj があることを確認する

XCodeへの組み込み
  • 開発アプリのXCodeを開いて「グループとファイル」にあるプロジェクト名の下に先ほど確認した、GData.xcodeproj をドラッグ&ドロップする(GData.xcodeproj を展開すると含まれるファイルは全て赤色すなわち存在しないでOK)
  • この中にある libGDataTouchStaticLib.a を下部の「ターゲット>プロジェクト名>バイナリをライブラリにリンク」の中へドラッグ&ドロップする(libGDataTouchStaticLib.a が目的とするスタティックライブラリだがまだ存在しない)
  • ドラッグ&ドロップ時に「・・・項目をコピーする(必要な場合)」のチェックを外してコピーせずに参照させること(以下の操作でも同様)
スタティックライブラリ(libGDataTouchStaticLib.a)の作成準備
  • 「グループとファイル」にドロップしたGData.xcodeprojをダブルクリックして、新しいXcodeプロジェクト(GData)を開ける
  • メニュー>プロジェクト>プロジェクト設定を編集>一般>プロジェクトフォーマット>Xcode3.2-互換 にしておく(既定 2.4 ではビルド時に警告が出る)
  • メニュー>プロジェクト>アクティブターゲットを設定>GDataTouchStaticLib を選択
  • メニュー>プロジェクト>アクティブSDKを設定>iPhoneデバイス3.0 を選択
  • メニュー>プロジェクト>アクティブターゲット"GDataTouchStaticLib"を編集
  • ビルド>構成:Debug>その他のCフラグ> (既定どおり)
  • ビルド>構成:Release>その他のCフラグ> _nameServiceHere_ を必要機能名に変えて追加する。例えば、ドキュメントでスプレッドシートを利用する場合
    -DGDATA_INCLUDE_DOCS_SERVICE=1
    -DGDATA_INCLUDE_SPREADSHEET_SERVICE=1
    を追加する。

スタティックライブラリを作成する
  • 構成をDebugにしてビルドする
  • 構成をReleaseにしてビルドする
  • 問題なく終了すれば、このプロジェクト(GData)を閉じて開発プロジェクトに戻る
  • すると、先ほどまで赤色であった libGDataTouchStaticLib.a が黒色になっているハズ
  • 黒色になれば存在している(作成できた)と言うこと
  • ドラッグ&ドロップ時に「・・・項目をコピーする(必要な場合)」のチェックを外してコピーせずに参照させること

開発プロジェクトをビルドする前の作業
  • GDataのDebugビルドの出力フォルダ
    gdata-objectivec-client-1/Source/build/Debug-iphoneos の中にある Headers フォルダを「グループとファイル」GData.xcodeprojの下辺りへドラッグ&ドロップする
  • #import "GData/GData*****.h" から GData/ を取り除いて "GData*****.h" に修正する
    (GData/ は Framework を参照指定するものでありスタティックライブラリには不要)

開発プロジェクトをビルドする

以上


    はじめます

    Tweet @azukisoft からこちらを中心にしようかと思っています。
    まず1歩