web-dev-qa-db-ja.com

iOS用の動的ライブラリを構築し、実行時にロードできますか?

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

Xcodeでは、新しいプロジェクト-> フレームワークとライブラリ-> ココアライブラリ(動的)を作成しようとしました。プロジェクト設定で、Base SDKiOS device 4.1に設定し、ターゲットをiOS4.1に設定しましたが、ビルドエラーがあります。

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

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

110
user510951

この質問が行われた時点では、動的ライブラリはiOSでサポートされていなかったため、アプリが拒否されます。静的ライブラリのみが許可されます。

ただし、iOS8では、動的ライブラリとフレームワークを使用できます。 「正常に動作する」はずです

101
DarkDust

DarkDust's answer にはまったく同意しませんが、もし内側のビルクリントンをチャネリングできれば、 の意味がサポートされているかどうかに依存しますis :)

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

#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用の動的ライブラリプロジェクトbuildを許可することに対するデフォルトの制限は、Xcodeの一部であり、XCode xmlファイルを編集することでオーバーライドできます。

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

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

したがって、これは技術的な制限ではなく、App Storeポリシーの制限です。 App Storeに限定されていない場合は、それを行うことができます。このテクニックはジェイルブレイクを必要としないnotに注意してください。ただし、アプリがサンドボックス化されている場合、dylibの読み込み元whereが制限される場合があります。

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


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

1。これらのファイルをプロパティリストエディターで開きます:/ Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Product Types.xcspecおよび/ Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications/iPhone Simulator ProductTypes.xcspec

2。MacOSX Product Types.xcspec」内の製品タイプcom.Apple.product-type.library.dynamicを持つアイテムを見つけて、[ iPhone Simulator ProductTypes.xcspec」。

Xcode screenshot 1

3。MacOSX Package Types.xcspec」および「iPhone Simulator PackageTypes.xcspec」を開きます同じ場所。

4。MacOSX Product Types.xcspec」内で、パッケージタイプcom.Apple.package-type.mach-o-dylibを持つアイテムを見つけて、[ iPhone Simulator PackageTypes.xcspec」。

Xcode screenshot 2

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

次に、dylibをビルドします。 「Cocoa Touch Static Library」テンプレートから始めます。 Foundation.frameworkをプロジェクトに含める必要があります。ここに、dylibをビルドするためにテンプレートの上で行った変更を示します。

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

Xcodeでプロジェクトを開き、Project-> Edit Project Settingsに移動します

2。Installation Directory」は@executable_path/に設定します。これは、dylibをアプリの実行可能ファイルと同じディレクトリに配置する予定があるためです。

3。Mach-O Type」をダイナミックライブラリに設定

4。Executable Extension」をdylibに設定

5。Executable Prefix」を空に設定

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

次に、テストするアプリを作成します。今回は、View-based Applicationを選択します。 UIButtonとUILabelを接続して、libを呼び出して戻りメッセージを表示します。 完全なプロジェクトTestAppをダウンロード を試してみてください。

157
Nate