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


114

ダイナミックライブラリはiOS(iPhone / iPad)でサポートされていますか?

Xcodeで、新しいプロジェクト -> Framework&Library- > Cocoa Library(dynamic)を作成しようとしました。プロジェクト設定では、私はセットベースSDKをするiOS device 4.1と、ターゲットiOS4.1が、それはビルドエラーがあります。

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

選択したビルドは、シミュレータ->デバッグ-> i386です。



4
iOS8 +は、共有ライブラリに基づくフレームワークをサポートしています。
eonil 14年

1
@Eonil、詳しく説明してもらえますか?もっと知りたいのですが、記事や情報へのリンクをいただければ幸いです。
Maxim Chetrusca 2014

回答:


105

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

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


14
それがなぜか誰か知っていますか?私にはそれは完全に正気ではないようです。
エリックデカストロロポ

73
@Erik de Castro Lopo:理由はセキュリティです。動的ライブラリは実行時にロードおよびアンロードできるため、追加の実行可能コードをダウンロードしてロードできます(プラグインを考えてください)。これはハッカーによって危険にさらされる可能性があり、携帯電話で悪意のあるコードが実行されることは非常に悪いことです。また、承認されていないアプリに承認されていない機能を追加することもできます。つまり、この環境では、Appleはダイナミックリンクを厳密に制御する必要のあるPandorasボックスと見なします。そうしないと、セキュリティが低下する可能性があり、電話でも意味があることに同意します。
DarkDust 2011

6
私はAppStore経由で配布されない社内アプリを開発しているので、AppleのAppStoreに対する制限を気にしません。iOSアプリ用の動的ライブラリを作成することは技術的に可能ですか?
Aliaksei 2011

3
@Aliaksei:技術的にはそうです。そうでなければ、Appleのライブラリーにリンクすることはできません。AFAIKダイナミックライブラリのサポートは、Mac OS Xの場合とほぼ同じです。ただし、Xcodeはサポートしていませんが、バンドルを使用できるようです。この記事を参照してください
DarkDust

3
サポートされないことは、許可されないことと同じではありません。
dtech 2014

162

私はDarkDustの答えに実際には同意していませんが、私の内側のBill Clinton をチャネリングすることができるかどうかは、サポートの意味が何であるかに依存します :)

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プレイスのブログです。


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シミュレーターProductTypes.xcspec

2.MacOSX Product Types.xcspec」で製品タイプが含まれているアイテムを見つけcom.apple.product-type.library.dynamicて、「iPhone Simulator ProductTypes.xcspec」にドラッグします。

Xcodeスクリーンショット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スクリーンショット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でプロジェクトを開き、[プロジェクト]> [プロジェクト設定の編集]に移動します

2.インストールディレクトリ」をに設定しまし@executable_path/た。これは、dylibをアプリの実行可能ファイルと同じディレクトリに配置する予定だからです。

3.Mach-Oタイプ」をダイナミックライブラリに設定

4. dylibに設定された「実行可能拡張機能

5.空に設定された「実行可能プレフィックス

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

次に、アプリを作成してテストします。今回は、ビューベースのアプリケーションを選択します。UIButtonとUILabelを接続してlibを呼び出し、戻りメッセージを表示します。完全なプロジェクトTestAppダウンロードして遊ぶことができます


2
XCode 4.5以降、これらのファイルは(例)/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications
Chris Devereux

@ChrisDevereux、ありがとう!コメントをチェックして最新のパスを確認します...もちろん、将来のバージョンで再び変更される可能性があります:)
Nate

3
この回答にはより多くの賛成票が必要です(実際に受け入れられる回答でなければなりませんが、user510951が2年間SOを離れた後に戻ってくるとは思いません)。とてもいい答えネイト!
chown

1
@chownが答えが正しいと言った場合、なんらかのマスターオーバーライドが必要です。
ティム

@Panagiotis、新しい質問を投稿してください。これで適切に対処できます。使用しているコードとすべてのエラーメッセージを表示します。もし欲しかったらどうぞこの質問/回答にリンクを戻すます。「iphone-privateapi」タグを追加すると表示されます。これはアプリストア向けではないことを明記してください。そうでない場合、投票して質問を閉じる可能性があります。
2013

0

Xcode 11.4.1以降、動的ライブラリは許可されていません(プロジェクトがすべての宛先に対してコンパイルされるわけではありません)。libs / frameworksを使用する新しい方法は、xcodebuildのcreate-xcframeworkです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.