2009-06-17 14 views
12

他のiPhoneアプリケーションに含める再利用可能なコード用のフレームワークを作成したいと思います。それを行う最善の方法は何ですか?理想的には、私は組み込みのフレームワークのように動作し、アプリケーションがビルドファイルを手放すことなく使用するようにしたいと思います。iPhoneフレームワークを作成して他のiPhoneアプリケーションで使用する方法

答えて

0

私は同じことを考えていました。これまで私がやってきたのは、あるプロジェクトを私が望むのと同じようにして、別のフォルダにコピーして新しいプロジェクトを開始することです。次に、.xcodeprojファイルの名前を変更して開きます。次に、新しいアプリケーションをビルドする前に、基本(アイコン、default.png、ターゲット、実行可能ファイル)をカスタマイズします。

コードが再利用される方法ではありません。よりよい解決策があると確信しています。たぶんソースコード管理/バージョン管理の巧妙な使用ですか?多分XCodeに組み込まれた何か?他のアイデア?私はここにもっと多くの投稿を見ることを楽しみにしています。

9

AppleはiPhoneでカスタムフレームワークを使用できないようにしています。しかし、あなたは良い古い静的ライブラリを使うことができます。 3.0 GM SDKには、そのためのプロジェクトテンプレートもありますが、静的ライブラリターゲットを自分で設定することもできます。

+0

参照マイケルの答えを得るためにaggrigateターゲットを実行します。フレームワークを作成することは可能ですが、少し手作業によるアプローチが必要です。 – DougW

0

@Nikolai Ruhe - AppleがiPhone上でカスタムフレームワークを使用することは、正確にどこで禁止されていますか?私はiOS Developer Program License AgreementとApp Store Review Guidelinesの両方を読んだので、そのような禁止について言及されていないようです。

アップルがカスタムスタティックライブラリの使用を許可し、カスタムフレームワークの使用を禁止する理由はわかりません。おそらく私はいくつかの法的文書を紛失していますか?

+0

インターフェイスビルダーにiphone-pluginsを作成するのが難しい/不可能なような、技術的なものかもしれません – hfossli

+0

実行時にiOSの実行可能ファイルにコードをリンクすることはできません。これは、dylib、フレームワーク、およびプラグインで起こることです。静的アーカイブはコンパイル時にリンクされています。これはおそらく、アプリが卑劣でSDKの規約に違反したり、意図せず悪用されたり、ユーザーのデータが危険にさらされたりしないようにするためです。 (アドレス帳などのように) –

+0

"注:カスタムフレームワークの作成はiOSではサポートされていません。 http://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW1 –

5

Xcode 4用のテンプレートを作成しました。このテンプレートを使用すると、デバイスとシミュレータの両方で動作する汎用iOSフレームワークを構築できます。

テンプレートがインストールされたら、新しいプロジェクトを作成するときに「Static iOS Framework」を選択するだけで残りの作業が実行されます。ユニットテストでも動作します。

https://github.com/kstenerud/iOS-Universal-Framework

+0

とてもいいです。それを共有していただきありがとうございます! –

0

あなたは絶対にフレームワークを作成し、それを使用することができ、このリンクを参照してください。あなたのプログラムを構造化すると、なぜappleがあなたのアプリケーションを拒否しますか? see this link

フレームワークは、コードの構造上の構造に過ぎません。それを行う直接的なアプローチはありません。あなたはバンドルとアグリゲートされたターゲットを使って達成することができます。 プロジェクトに新しいバンドルを追加し、次のBase SDKを実行します。最新のiOS(iOS X.X)(X.Xには、あなたのマシンにインストールされている最新のiOS SDKの番号が表示されます)。 アーキテクチャ:$(ARCHS_STANDARD_32_BIT)armv6(この値は "armv6"の前のスペースも含めてこの値にすることが非常に重要です)この設定はXcode 4.2で有効です。古いバージョンを使用している場合は、 "Standard(armv6 armv7)オプション。 (このプロパティの値は、項目の値によって異なりますので、最初に設定してください)。 アクティブなアーキテクチャのみを構築する:そうでない場合は、同時にarmv6とarmv7にコンパイルできません。 有効なアーキテクチャ:$(ARCHS_STANDARD_32_BIT)(これは正確にこの値にすることが非常に重要です)。あなたのXcodeがarmv6とarmv7で2行を表示している場合は、この値を削除して1行に挿入してください。 デッドコードストリップ:NO。 標準ライブラリとのリンク:いいえ。 Mach-Oタイプ:リロケータブルオブジェクトファイル。これが最も重要な変更です。ここでは、バンドルをリロケータブルファイルとして扱うようにコンパイラに指示します。これにより、バンドルをラッパー設定のフレームワークに変換できます。 その他のリンカーフラグ:この設定は必須ではありませんが、任意の種類のC++コード(.cppまたは.cpp)を使用する予定がある場合は必須です。mm)、このムービーでChris Moore(コメント上)は "-lstdC++"オプションの使用を推奨しています。この場合、古いコンパイラでの競合を避けるために、 "-ObjC"も使用することをお勧めします。 ラッパー拡張:フレームワーク。ここでバンドルをフレームワークに変更します。 Xcodeでは、フレームワークは.frameworkという拡張子を持つフォルダで、コンパイルされたバイナリソース、リソース、およびいくつかのフォルダの中にあり、通常Headersと呼ばれるフォルダにはすべてのパブリックヘッダが含まれます。 デバッグシンボルを生成:いいえ(これは非常に重要な設定です。そうしないと、フレームワークは他のコンピュータ/プロファイルでは機能しません)。 プレフィックスヘッダーをプリコンパイルします。

aggrigatedターゲットを作成し、実行スクリプトに

# Sets the target folders and the final framework product. 
FMK_NAME=FI 
FMK_VERSION=A 

# Install dir will be the final output to the framework. 
# The following line create it in the root folder of the current project. 
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework 

# Working dir will be deleted after the framework creation. 
WRK_DIR=build 
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework 
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework 

# Building both architectures. 
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos 
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator 

# Cleaning the oldest. 
if [ -d "${INSTALL_DIR}" ] 
then 
rm -rf "${INSTALL_DIR}" 
fi 

# Creates and renews the final product folder. 
mkdir -p "${INSTALL_DIR}" 
mkdir -p "${INSTALL_DIR}/Versions" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers" 

# Creates the internal links. 
# It MUST uses relative path, otherwise will not work when the folder is copied/moved. 
ln -s "${FMK_VERSION}" "${INSTALL_DIR}/Versions/Current" 
ln -s "Versions/Current/Headers" "${INSTALL_DIR}/Headers" 
ln -s "Versions/Current/Resources" "${INSTALL_DIR}/Resources" 
ln -s "Versions/Current/${FMK_NAME}" "${INSTALL_DIR}/${FMK_NAME}" 

# Copies the headers and resources files to the final product folder. 
cp -R "${DEVICE_DIR}/Headers/" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/" 
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/" 

# Removes the binary and header from the resources folder. 
rm -r "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/Headers" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/${FMK_NAME}" 

# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product. 
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}" 

rm -r "${WRK_DIR}" 

これをコピーして、以下のフレームワーク

+0

あなたのウェブサイトへのスパムリンクを止めてください。 –

+0

@AndrewBarberあなたはそれが私のウェブサイトだと思いますか?私がちょうど質問に答えたら?それが私のウェブサイトだったら私はずっともっと幸せになるでしょう:) –

+0

このサイトの回答の有用な点をこのサイトに投稿してください、またはあなたの投稿のリスクは[回答ではありません] //meta.stackexchange.com/q/8259)。必要に応じてリンクを含めることができますが、「参照」としてのみリンクを含めることができます。答えは、リンクを必要とせずに単独で立つべきです。 –

関連する問題