117

動的ライブラリは iOS (iPhone/iPad) でサポートされていますか?

Xcode で、 New project -> Framework & Library -> Cocoa Library (dynamic)を作成しようとしました。プロジェクト設定で、Base SDKを にiOS device 4.1、ターゲットをに設定しiOS4.1ましたが、ビルド エラーが発生します。

ターゲットは製品タイプ「com.apple.product-type.library.dynamic」を指定していますが、「iphonesimulator」プラットフォームにはそのような製品タイプはありません」.

私が選択したビルドはSimulator -> Debug -> i386です。

4

3 に答える 3

165

私はDarkDustの答えに本当に反対しているわけではありませんが、私の内なるビル・クリントンを導くことができるなら、それはサポートされていることの意味に依存します:)

Apple は、App Store アプリでこれを行うことを望んでいませんが、オペレーティング システムでは確かに許可されています。脱獄アプリは常にこの手法を使用しています。基本的に、標準の UNIX 手法を使用してフレームワーク/ライブラリを動的に開き、その中のものを使用します。dlopen 関数を使用すると、そのフレームワークまたは dylibへのパスを渡すことで、ライブラリを開くことができます。脱獄アプリを構築するためのいくつかのドキュメントからinit()、独自の個別のdylib内に実装された関数を呼び出す例を次に示します。

#include <dlfcn.h>

initWrapper() {
    char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";

    void *libHandle = dlopen(dylibPath, RTLD_NOW);
    if (libHandle != NULL) {
        // This assumes your dylib’s init function is called init, 
        //    if not change the name in "".
        void (*init)() = dlsym(libHandle, "init");
        if (init != NULL)  {
            init();
        }
        dlclose(libHandle);
    }
}

さらに、iOS 用の動的ライブラリ プロジェクトのビルドを許可することに対するデフォルトの制限は、Xcode の一部であり、一部の XCode xml ファイルを編集することでオーバーライドできます。

iOS で dylib をビルドして使用する

これを行うと、通常の iOS .dylibライブラリを構築し、上記のサンプル コードに従って使用できます。(はい、おそらく、新しい XCode バージョンをインストールするたびに、この機能を再度ロック解除する必要があります)。

つまり、これは技術的な制限ではなく、App Store ポリシーの制限です。App Store に限定されていない場合は、それを行うことができます。この手法は脱獄を必要としないことに注意してください。ただし、アプリがサンドボックス化されている場合は、dylib をどこからロードできるかが制限される可能性があります。

編集:この情報が将来のリンクの腐敗で失われないようにするために、Xcode で iOS dylib を有効にする方法について提供したリンクの内容を次に示します。(注:このプロセスは Xcode 4 でも機能しますが、パスの更新などについては以下のコメントを参照してください) ソースはiOS Place ブログ:


Xcode では、iOS 用の dylib をビルドできません。シングル バイナリでない場合、アプリは拒否されます。しかし、オプションのモジュールをロードするためのプラグイン アーキテクチャを持つアプリケーションがあります。iOSに完全に移植する前に、簡単なプロトタイプでコンセプトを証明したいだけです。dylib が単純に機能する場合は、実行する方が高速です。そのため、この投稿では dylib をビルドして使用する方法を示しますが、App Store では承認されないことに注意してください。(10.6.4 上の Xcode 3.2.4 でテスト済み)

1.プロパティリストエディターで次のファイルを開きます。 /iPhone シミュレーター ProductTypes.xcspec

2.製品タイプcom.apple.product-type.library.dynamicを含む「<strong>MacOSX Product Types.xcspec」内の項目を見つけて、「<strong>iPhone Simulator ProductTypes.xcspec」にドラッグします。

Xcode スクリーンショット 1

3.同じ場所にある「<strong>MacOSX Package Types.xcspec」と「<strong>iPhone Simulator PackageTypes.xcspec」を開きます。

4.パッケージ タイプを含む「<strong>MacOSX Product Types.xcspec」内のアイテムを見つけてcom.apple.package-type.mach-o-dylib、「<strong>iPhone Simulator PackageTypes.xcspec」にドラッグします。

Xcode スクリーンショット 2

5.「<strong>iPhoneOS.platform」についても手順を繰り返し、実行中の場合は Xcode を再起動します。

それでは、dylib をビルドしましょう。「<strong>Cocoa Touch Static Library」テンプレートから始めます。これにより、プロジェクトに Foundation.framework が含まれているはずです。dylib をビルドするためにテンプレートに加えた変更を次に示します。

1.ファイルproject.pbxproj (Xcode プロジェクト ファイル バンドル内にあります) をテキスト エディターで開きます。文字列「<strong>producttype」を検索し、その値を に変更しcom.apple.product-type.library.dynamicます。

次に、Xcode でプロジェクトを開き、[プロジェクト] -> [プロジェクト設定の編集]に移動します。

2.@executable_path/アプリの実行可能ファイルと同じディレクトリに dylib を配置する予定なので、「<strong>Installation Directory」を に設定します。

3.「<strong>Mach-O Type」をダイナミック ライブラリに設定

4.「<strong>Executable Extension」を dylib に設定

5.「<strong>実行可能プレフィックス」を空に設定

6.ライブラリに 1 つまたは 2 つの単純なメソッドを追加してビルドします。

次に、テストするアプリを作成します。今回は、View-based Applicationを選択します。UIButton と UILabel をフックして lib を呼び出し、戻りメッセージを表示します。完全なプロジェクト TestAppをダウンロードして、それで遊ぶことができます。

于 2012-05-09T03:29:16.550 に答える
109

この質問が行われた時点では、ダイナミックライブラリはiOSでサポートされておらず、アプリが拒否される結果になります。静的ライブラリのみが許可されます。

ただし、iOS8では、ダイナミックライブラリとフレームワークを使用できます。それは「うまくいく」はずです

于 2011-01-19T10:00:08.987 に答える