¿Puede crear bibliotecas dinámicas para iOS y cargarlas en tiempo de ejecución?


¿Las bibliotecas dinámicas son compatibles con iOS (iPhone/iPad)?

En Xcode, intenté crear un nuevo proyecto -> & Biblioteca de Marco -> Cocoa Library (dynamic) . En la configuración del proyecto, establecí el SDK Base en iOS device 4.1 y el objetivo en iOS4.1, pero tiene un error de compilación:

Target especifica el tipo de producto " com.manzana.tipo de producto.biblioteca.dinámico', pero no hay tal tipo de producto para la plataforma' iphonesimulator'".

El la compilación que seleccioné es Simulator -> Debug -> i386 .

Author: Nate, 2011-01-19

2 answers

En el momento en que se hizo esta pregunta, las bibliotecas dinámicas no eran compatibles con iOS y su aplicación será rechazada. Solo se permiten bibliotecas estáticas.

Sin embargo, en iOS8 puede usar bibliotecas y marcos dinámicos. Debería"simplemente funcionar"

 95
Author: DarkDust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-29 09:20:48

Realmente no estoy en desacuerdo con la respuesta de DarkDust , pero si puedo canalizar mi Bill Clinton interior, depende de cuál sea el significado de apoyado :)

Apple no quiere que hagas esto para las aplicaciones de la Tienda de aplicaciones, pero el sistema operativo ciertamente lo permite. Las aplicaciones de Jailbreak utilizan esta técnica todo el tiempo. Básicamente se usa una técnica estándar de UNIX para abrir dinámicamente un framework / biblioteca, y luego se usan cosas en él. La función dlopen permite puede abrir la biblioteca pasando la ruta a ese framework, o dylib. De algunos documentos para crear aplicaciones de jailbreak , aquí hay un ejemplo de llamar a una función init() implementada dentro de su propio dylib separado:

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

Además, la restricción predeterminada contra permitirle construir un proyecto de biblioteca dinámica para iOS es algo en XCode que puede anular editando algunos archivos xml de XCode:

Construir y usar dylib en iOS

Una vez hecho esto, puede construir un iOS normal .biblioteca dylib, y utilícela según el código de ejemplo anterior. (sí, probablemente tendrá que desbloquear esta capacidad de nuevo cada vez que instale una nueva versión de XCode).

Por lo tanto, no es una limitación técnica, sino una limitación de la política de la Tienda de aplicaciones. Si no estás limitado a la App Store, entonces puedes hacerlo. Tenga en cuenta que esta técnica hace no requiere jailbreaking, aunque si la aplicación es sandboxed, se puede limitar desde donde se puede cargar dylibs.



Edit: con el fin de asegurarse de que esta información no se pierda en el futuro enlace rot, aquí está el contenido del enlace que proporcioné sobre cómo habilitar iOS dylibs en Xcode. (Nota: este proceso todavía funciona en Xcode 4, pero consulte los comentarios a continuación para obtener actualizaciones de rutas, etc.) Fuente es el iOS Lugar blog :


Xcode no te permite compilar dylib para iOS. Aplicación será rechazado si no es binario único. Pero tengo una aplicación que tiene arquitectura de plug-in para cargar módulos opcionales. Solo quiero un prototipo rápido para probar el concepto antes de portarlo completamente a iOS. Es más rápido hacerlo si Dylib pudiera simplemente trabajar. Por lo tanto, este post muestra cómo construir y usar dylib, pero tenga en cuenta que no será aprobado para App Store. (Probado con Xcode 3.2.4 en 10.6.4)

1. Abra estos archivos en el Editor de Lista de propiedades: /Desarrollador/Plataformas/MacOSX.plataforma / Desarrollador/Biblioteca/Xcode/Especificaciones / Tipos de productos MacOSX.xcspec and /Developer/Platforms/iPhoneSimulator.plataforma / Desarrollador / Biblioteca / Xcode / Especificaciones / iPhone Simulator ProductTypes.xcspec

2. Ubique el artículo en los tipos de producto "MacOSX.xcspec" que tiene el tipo de producto com.apple.product-type.library.dynamic y arrástrelo a los "iPhone Simulator ProductTypes.xcspec ".

Xcode captura de pantalla 1

3. Abra " Tipos de paquetes MacOSX.xcspec" y "iPhone Simulator PackageTypes.xcspec" encontrado en los mismos lugares.

4. Ubique el artículo en los tipos de producto "MacOSX.xcspec " que tiene el tipo de paquete com.apple.package-type.mach-o-dylib y arrástrelo a los " iPhone Simulator PackageTypes.xcspec ".

Xcode captura de pantalla 2

5. Repita los pasos para el "iPhoneOS.platform " y relanzar Xcode si se estaba ejecutando.

Ahora, vamos a construir un dylib. Comience con el Templete" Cocoa Touch Static Library". Eso debería incluir a la Fundación.marco en el proyecto. Aquí están los cambios que hice en la parte superior del templete para construir dylib.

1.Abra el archivo proyecto.pbxproj (se encuentra dentro del paquete de archivos de proyecto Xcode) en un Editor de texto. Busque la cadena " producttype ", cambie su valor a com.apple.product-type.library.dynamic;

Ahora, abra el proyecto con Xcode, vaya a Proyecto- > Editar proyecto Preferencias

2. "Installation Directory " establecido en @executable_path/ porque planeo poner el dylib en el mismo directorio que el ejecutable de la aplicación.

3. "Mach-O Type " establecer como Biblioteca dinámica

4. "Extensión ejecutable " establecido en dylib

5. "Prefijo ejecutable " establecido en vacío

6. Agregue uno o dos métodos simples a la biblioteca y compílelos.

Ahora, crea una aplicación para probarlo. Esta vez, elijo la Aplicación basada en vistas . Conecta un UIButton y un UILable para llamar a la lib y mostrar el mensaje de retorno. Puede descargar el proyecto completo TestApp y jugar con él.

 150
Author: Nate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:30