2011-01-19 16 views
97

¿Se admiten bibliotecas dinámicas en iOS (iPhone/iPad)?¿Puedes construir bibliotecas dinámicas para iOS y cargarlas en tiempo de ejecución?

En Xcode, he tratado de crear un nuevo proyecto -> Marco & Biblioteca ->cacao Biblioteca (dinámico). En la configuración del proyecto, que establezca el SDKbase a iOS device 4.1 y el objetivo a iOS4.1, pero tiene un error de compilación:

target specifies product type 'com.apple.product-type.library.dynamic', but there's no such product type for the 'iphonesimulator' platform".

La acumulación i seleccionado es Simulador -> Depuración -> i386.

+0

No, pero usted [puede construir y vincular una biblioteca estática] (http://stackoverflow.com/questions/6124523/linking-a-static-library-to-an-ios-project-in-xcode-4) – bobobobo

+3

iOS8 + admite marcos basados ​​en biblioteca compartida. – Eonil

+1

@Eonil, ¿pueden dar más detalles sobre eso? Me gustaría obtener más información al respecto, un artículo o un enlace a alguna información sería muy apreciado. –

Respuesta

94

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

Sin embargo, en iOS8 puede usar bibliotecas y marcos dinámicos. Debe "sólo trabajo"

+14

¿Alguien sabe por qué es eso? Para mí, parece completamente loco. –

+70

@Erik de Castro Lopo: El motivo es la seguridad: dado que una biblioteca dinámica puede cargarse y descargarse en tiempo de ejecución, puede * descargar * código ejecutable adicional y cargarlo (pensemos en el complemento). Esto podría verse comprometido por un hacker y luego tener código malicioso ejecutándose en su teléfono es algo muy malo. También haría posible agregar funciones no aprobadas a una aplicación aprobada. En resumen: en este entorno, Apple considera que los enlaces dinámicos son una caja de Pandoras que debe controlarse estrictamente, de lo contrario podría comprometer la seguridad y acepto que tiene sentido * en el teléfono *. – DarkDust

+0

excelente respuesta. Gracias por explicar que tan sucinintly – levous

145

Realmente no estoy en desacuerdo con DarkDust's answer, pero si se me permite canalizar mi interior Bill Clinton, it depends on what the meaning of supported is :)

Apple no quiere que haciendo esto para aplicaciones de la App Store, pero el sistema operativo ciertamente lo permite. Las aplicaciones de Jailbreak usan esta técnica todo el tiempo. Básicamente, utiliza una técnica estándar de UNIX para abrir dinámicamente un marco/biblioteca, y luego usar cosas en él. El dlopen function le permite abrir la biblioteca pasando the path to that framework o dylib. De alguna docs for building jailbreak apps, he aquí un ejemplo de llamar a una función init() implementado dentro de su propia, dylib separada:

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

Por otra parte, la restricción por defecto contra lo que le permite acumulación un proyecto de biblioteca dinámica para iOS es algo en XCode que usted tiene la capacidad de anular mediante la edición de algunos archivos xml: XCode

Build and use dylib on iOS

una vez hecho esto, se puede construir un iOS normales .dylib biblioteca, y úsala según el código de muestra anterior. (Sí, probablemente tendrá que desbloquear esta capacidad 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 no requiere jailbreaking, aunque si la aplicación está en espacio aislado, puede limitar donde se pueden cargar los dylibs.



Editar: con el fin de asegurarse de que esta información no se pierde en el futuro la podredumbre enlace, aquí es el contenido del enlace que he proporcionado sobre cómo activar iOS dylibs en Xcode. (Nota: este proceso aún funciona en Xcode 4, pero vea los comentarios a continuación para actualizaciones de rutas, etc.) Fuente es el iOS Place blog:


Xcode no permite que usted construya dylib para iOS. La aplicación será rechazada si no es un solo binario. Pero tengo una aplicación que tiene una arquitectura de complemento para cargar módulos opcionales. Solo quiero un prototipo rápido para probar el concepto antes de portarlo por completo a iOS. Es más rápido si dylib simplemente funcionara. Por lo tanto, esta publicación muestra cómo construir y usar dylib, pero tenga en cuenta que no se aprobará en App Store. (Probado con Xcode 3.2.4, 10.6.4)

1. abrir estos archivos en el editor de listas de Propiedad: /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Tipos de productos .xcspec y /Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications/iPhone Simulador ProductTypes.xcspec

2. localizar el elemento en el “MacOSX Producto Types.xcspec” que tiene el tipo de producto com.apple.product-type.library.dynamic y arrástrelo al "iPhone Simulator ProductTypes.xcspec ".

Xcode screenshot 1

3. abierto “MacOSX paquete Types.xcspec” y “simulador de iPhone PackageTypes.xcspec” que se encuentra en los mismos lugares.

4. localizar el elemento en el “MacOSX Producto Types.xcspec” que tiene el paquete de tipo com.apple.package-type.mach-o-dylib y arrastrarlo a la “simulador de iPhone PackageTypes.xcspec”.

Xcode screenshot 2

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

Ahora, vamos a construir un dylib. Comience con la "Biblioteca Estática Cocoa Touch" Templete. Eso debería incluir el marco de la Fundación en el proyecto. Estos son los cambios que hice en la parte superior de la Templete para construir dylib.

1. Abrir el archivo project.pbxproj (que se encuentra en el interior del archivo de paquete de proyecto de 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, ir a Proyecto-> Editar configuración del proyecto

2.Directorio de instalación” ajustado a @executable_path/ porque tengo la intención de poner el dylib en el mismo directorio como el ejecutable de la aplicación.

3.Mach-O Tipo” conjunto de Dynamic Library

4.ejecutable de extensión” ajustado a dylib

5.Ejecutable Prefijo” set vaciar

6. Agregue uno o dos métodos simples a la biblioteca y compárelo.

Ahora, crea una aplicación para probarlo. Esta vez, elijo Aplicación basada en la vista. Conecte un UIButton y un UILable para llamar a la lib y mostrar el mensaje de devolución. Puedes download the complete project TestApp y jugar con él.

+2

A partir de XCode 4.5, estos archivos se pueden encontrar en (por ejemplo) /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications –

+0

@ChrisDevereux, gracias! Puse una nota para verificar su comentario sobre rutas actualizadas ... que, por supuesto, podría cambiar nuevamente en una versión futura :) – Nate

+3

Esta respuesta necesita más votos ascendentes (y realmente debería ser la respuesta aceptada, pero dudo user510951 regresará después de estar alejado de SO durante 2 años). Muy buena respuesta Nate! – chown

Cuestiones relacionadas