web-dev-qa-db-fra.com

Pouvez-vous créer des bibliothèques dynamiques pour iOS et les charger au moment de l'exécution?

Les bibliothèques dynamiques sont-elles prises en charge sur iOS (iPhone/iPad)?

Dans Xcode, j'ai essayé de créer un Nouveau projet -> Framework & Library -> Cocoa Library (dynamic). Dans les paramètres du projet, je règle SDK de base sur iOS device 4.1 et cible pour iOS4.1, mais il y a une erreur de construction:

cible spécifie le type de produit 'com.Apple.product-type.library.dynamic', mais ce type de produit n'existe pas pour la plateforme 'iphonesimulator' ".

La construction que j'ai sélectionnée est Simulator -> Debug -> i386.

110
user510951

Au moment où cette question a été posée, les bibliothèques dynamiques n'étaient pas prises en charge par iOS et entraîneraient le rejet de votre application. Seules les bibliothèques statiques sont autorisées.

Cependant, dans iOS8, vous pouvez utiliser des bibliothèques et des infrastructures dynamiques. Il faut "juste travailler"

101
DarkDust

Je ne suis pas vraiment en désaccord avec la réponse de de DarkDust , mais si je peux canaliser mon Bill Clinton intérieur, , cela dépend de la signification de supporté est :)

Apple ne veut pas que vous fassiez cela pour les applications de l'App Store, mais le système d'exploitation le permet certainement. Les applications de jailbreak utilisent cette technique tout le temps. Vous utilisez essentiellement une technique UNIX standard pour ouvrir dynamiquement un framework/une bibliothèque, puis y utiliser des éléments. La fonction dlopen vous permet d'ouvrir la bibliothèque en passant le chemin d'accès à ce framework , ou à dylib. Voici quelques exemples de documents permettant de créer des applications de jailbreak : appeler une fonction init() implémentée dans votre propre dylib séparé:

#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);
    }
}

De plus, la restriction par défaut de vous permettre de construire un projet de bibliothèque dynamique pour iOS correspond à quelque chose dans Xcode que vous avez la possibilité de remplacer en modifiant du code XML XCode. des dossiers:

Construire et utiliser dylib sur iOS

Une fois cette opération effectuée, vous pouvez créer une bibliothèque iOS normale . Dylib et l’utiliser conformément au code exemple ci-dessus. (oui, vous devrez probablement déverrouiller cette fonctionnalité chaque fois que vous installerez une nouvelle version de XCode).

Donc, ce n'est pas une limitation technique, mais une limitation de la politique de l'App Store. Si vous n'êtes pas limité à l'App Store, vous pouvez le faire. Notez que cette technique ne ne nécessite pas , même si l'application est en mode bac à sable, elle peut limiter dylibs peut l'être chargé de.

Edit: Afin de vous assurer que ces informations ne seront pas perdues pour la 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 toujours sur Xcode 4, mais voir les commentaires ci-dessous pour les mises à jour des chemins, etc.) La source est la iOS Place le blog :


Xcode ne vous permet pas de créer dylib pour iOS. L'application sera rejetée s'il ne s'agit pas d'un fichier binaire simple. Mais j'ai une application qui a une architecture de plug-in pour charger des modules optionnels. Je veux juste un prototype rapide pour prouver le concept avant de le porter complètement sur iOS. C’est plus rapide si dylib peut simplement fonctionner. Cet article explique donc comment créer et utiliser Dylib, mais sachez qu'il ne sera pas approuvé pour l'App Store. (Testé avec Xcode 3.2.4 sur 10.6.4)

1. Ouvrez ces fichiers dans l'éditeur de liste de propriétés: /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Spécifications/Types de produits MacOSX.xcspec et /Développeur/Plateformes/iPhoneSimulator.platform/Développeur/Bibliothèque/Xcode/Spécifications/ProductTypes du simulateur iPhone. xcspec

2. Recherchez l'élément dans les “ Types de produits MacOSX.xcspec ”. qui a le type de produit com.Apple.product-type.library.dynamic et faites-le glisser vers le " simulateur iPhone ProductTypes.xcspec ".

Xcode screenshot 1

3. Ouvrez “ MacOSX Package Types.xcspec ” et “ iPhone Simulator PackageTypes.xcspec ”se trouvant aux mêmes endroits.

4. Recherchez l'élément dans les “ Types de produits MacOSX.xcspec ”. qui a le type de paquetage com.Apple.package-type.mach-o-dylib et faites-le glisser vers le " iPhone Simulator PackageTypes.xcspec ".

Xcode screenshot 2

5. Répétez les étapes pour le “ iPhoneOS.platform ” et relancez Xcode s'il était en cours d'exécution.

Maintenant, construisons un dylib. Commencez avec le modèle “ Cocoa Touch Static Library ”. Cela devrait inclure Foundation.framework dans le projet. Voici les modifications apportées au-dessus du modèle pour construire dylib.

1. Ouvrez le fichier project.pbxproj (présent dans l’ensemble de fichiers de projet Xcode) dans un éditeur de texte. Recherchez la chaîne “ producttype ”, remplacez sa valeur par com.Apple.product-type.library.dynamic;

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

2. “Répertoire d'installation ” réglé sur @executable_path/ parce que j’envisage de placer le répertoire dans le même répertoire que l’exécutable de l’application.

3. " Type Mach-O " défini sur Bibliothèque dynamique

4. " extension exécutable " défini sur dylib

5. préfixe exécutable ” défini sur vide

6. Ajoutez une ou deux méthodes simples à la bibliothèque et générez-la.

Maintenant, créez une application pour la tester. Cette fois, j'ai choisi l'application basée sur la vue . Branchez un UIButton et un UILabel pour appeler la bibliothèque et afficher le message de retour. Vous pouvez télécharger le projet complet TestApp et jouer avec.

157
Nate