122 votes

Pouvez-vous construire les bibliothèques dynamiques pour iOS et de les charger à l'exécution?

Sont les bibliothèques dynamiques pris en charge sur iOS (iPhone/iPad)?

Dans Xcode, j'ai essayé de créer un Nouveau projet -> Cadre Et de la Bibliothèque -> Cocoa (dynamique). Dans les paramètres du projet, j'ai mis la Base SDK d' iOS device 4.1 et la cible à iOS4.1, mais il a une erreur de compilation:

cible précise le " type de produit com.apple.type de produits.de la bibliothèque.dynamique", mais il n'y a pas de tel type de produit pour le "iphonesimulator plate-forme".

Le build que j'ai sélectionné est Simulator -> Debug -> i386.

169voto

Nate Points 22452

Je ne suis pas vraiment en désaccord avec DarkDust de la réponse, mais si je peut canaliser mon intérieur Bill Clinton, cela dépend de ce que le sens des prises en charge est :)

Apple ne veut pas que vous le faire pour de apps de l'App Store, mais le système d'exploitation certainement le permet. Jailbreak apps utilisez cette technique tout le temps. Fondamentalement, vous utilisez un UNIX standard technique dynamique d'ouvrir un cadre/la bibliothèque, et puis des trucs. Le dlopen fonction vous permet d'ouvrir la bibliothèque en passant par le chemin d'accès à ce cadre, ou dylib. À partir de quelques docs pour la construction de jailbreak apps, voici un exemple d'appel d'un init() fonction implémentée à l'intérieur de votre propre 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);
    }
}

En outre, le défaut de restriction contre vous permettant de construire une bibliothèque dynamique de projet pour iOS est quelque chose dans XCode que vous avez la possibilité de remplacer par la modification d'une partie de XCode fichiers xml:

Construire et utiliser dylib sur iOS

Une fois que vous faites cela, vous pouvez construire une normale iOS .dylib bibliothèque, et de l'utiliser par l'exemple de code ci-dessus. (oui, vous aurez probablement à débloquer cette fonctionnalité de nouveau chaque fois que vous installez un nouveau XCode version).

Il n'est donc pas une limitation technique, mais un Magasin d'Application de la politique de limitation. Si vous n'êtes pas limité à l'App Store, alors vous pouvez le faire. Notez que cette technique n'a pas besoin de jailbreak, même si l'application est en mode bac à sable, il peut limite dylibs peut être chargé de.



Edit: afin de vous assurer que cette information n'est pas perdu pour l'avenir pourriture des liens, voici le contenu du lien que j'ai fourni sur la façon d'activer iOS dylibs dans Xcode. (Remarque: ce processus fonctionne encore sur Xcode 4, mais voir le commentaire(s) ci-dessous pour les mises à jour des chemins d'accès, etc.) La Source est l' iOS Place blog:


Xcode ne vous permet pas de construire dylib pour iOS. L'application sera rejetée si elle n'est pas binaire. Mais j'ai une application qui a architecture de plug-in pour charger les modules optionnels. Je veux juste un prototype rapide de prouver concept avant de pleinement port pour iOS. C'est plus rapide à faire si dylib pourrait simplement de travailler. Donc, cet article montre comment créer et utiliser dylib, mais être conscient de ne pas être approuvé à l'App Store. (Testé avec Xcode 3.2.4 sur 10.6.4)

1. Ouvrir ces fichiers dans la Liste des propriétés de l'Éditeur: /Développeur/plates-formes/MacOSX.de plate-forme/Developer/Library/Xcode/Spécifications/MacOSX Types de Produits.xcspec et /Développeur/plates-formes/iPhoneSimulator.de plate-forme/Developer/Library/Xcode/Spécifications/Simulateur d'iPhone, ProductTypes.xcspec

2. Recherchez l'élément dans le "MacOSX Types de Produits.xcspec" qui a le type de produit com.apple.product-type.library.dynamic et faites-le glisser vers le "Simulateur d'iPhone, ProductTypes.xcspec".

Xcode screenshot 1

3. Ouvrir "MacOSX Types De Colis.xcspec" et "Simulateur d'iPhone PackageTypes.xcspec", à la même place.

4. Recherchez l'élément dans le "MacOSX Types de Produits.xcspec" qui a le type de colis com.apple.package-type.mach-o-dylib et faites-le glisser vers le "Simulateur d'iPhone PackageTypes.xcspec".

Xcode screenshot 2

5. Répétez les étapes pour le "iPhoneOS.plate-forme" et de relancer Xcode si elle a été en cours d'exécution.

Maintenant, permet de construire un dylib. Commencer avec le "Cocoa Touch Bibliothèque Statique" Templete. Qui doit la Fondation.dans le cadre du projet. Voici les modifications que j'ai apportées sur le dessus de la templete pour construire dylib.

1. Ouvrez le fichier de projet.pbxproj (qui se trouve à l'intérieur du fichier de projet Xcode bundle) dans un Éditeur de Texte. Recherchez la chaîne "producttype", changez la valeur de com.apple.product-type.library.dynamic;

Maintenant, ouvrez le projet avec Xcode, allez dans Projet->Modifier les Paramètres du Projet

2. "Répertoire d'Installation" ensemble pour @executable_path/ parce que j'ai l'intention de mettre la dylib dans le même répertoire que l'application exécutable.

3. "Mach-O, Type" set de Bibliothèque Dynamique

4. "Exécutable Extension" ensemble pour dylib

5. "Exécutable Préfixe" vide

6. Ajouter une ou deux méthodes simples à la bibliothèque et de le construire.

Maintenant, créez une application à tester. Cette fois, je choisis l' Affichage en fonction de l'Application. Le raccordement d'un UIButton et un UILable à l'appel de la lib et montrant message de retour. Vous pouvez télécharger le projet complet TestApp et de jouer avec elle.

114voto

DarkDust Points 47584

À l'époque, cette question a été posée, les bibliothèques Dynamiques n'ont pas été pris en charge par iOS et fera en sorte que votre application se faire rejeter. Seules les bibliothèques statiques sont autorisés.

Cependant, dans iOS8, vous pouvez utiliser les bibliothèques dynamiques et des cadres. Il devait tout simplement "travail"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X