Este bloqueo ha sido un problema de bloqueo. Utilicé los siguientes pasos para reproducir el problema:
- Crear un proyecto de Cocoa Touch Framework
- Agregue un archivo rápido y una clase Perro
- Construir un marco para dispositivo
- Crear una aplicación de vista única en Swift
- Importar marco en proyecto de aplicación
- Instanciar clases rápidas desde el marco en ViewController
- Crea y ejecuta una aplicación en el dispositivo
La aplicación se bloqueó inmediatamente al iniciarse, aquí está el registro de la consola:
dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
Referenced from: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
Reason: image not found
He intentado construir en dispositivos iOS 7.1 y 8.0, ambos tienen el mismo bloqueo. Sin embargo, puedo construir una aplicación y ejecutar bien en el simulador. Además, soy consciente de que puedo cambiar el marco para formar Obligatorio a Opcional en Enlace binario con bibliotecas , pero no resolvió completamente el problema, la aplicación se bloqueó cuando creé una instancia de Dog . El comportamiento es diferente en el dispositivo y el simulador, sospecho que no podemos distribuir un marco para el dispositivo usando una versión beta de Xcode. ¿Alguien puede arrojar luz sobre esto?
Link Binary with Libraries
y, de alguna manera, Xcode sabe copiarlos en el paquete de su aplicación, mientras que para marcos personalizados esto simplemente no sucede.Respuestas:
En la pestaña General del objetivo , hay un campo Binarios incrustados . Cuando agrega el marco allí, se resuelve el bloqueo.
La referencia está aquí en los foros de desarrolladores de Apple.
fuente
Para iOS mayor o igual que 8
En la pestaña General del objetivo, en la sección Binarios incrustados, agregue el marco. Esto copiará el marco en el compilado para que pueda vincularse en tiempo de ejecución.
¿Por qué está pasando esto? : porque el marco al que está vinculando se compila como un marco vinculado dinámicamente y, por lo tanto, está vinculado en tiempo de ejecución.
** Nota: ** La incrustación de marcos personalizados solo es compatible con iOS> 8 y, por lo tanto, sigue una solución alternativa que funciona en versiones anteriores de iOS.
Para iOS menos de 8
Si influye en este marco (tiene acceso al código fuente / proceso de compilación), puede cambiar este marco para que esté vinculado estáticamente en lugar de estar vinculado dinámicamente. Esto hará que el código se incluya en su aplicación compilada en lugar de vincularse en tiempo de ejecución y, por lo tanto, el marco no tendrá que incrustarse.
** Cómo: ** En la pestaña Configuración de compilación del marco, en la sección Vinculación, cambie el Tipo de Mach-O a Biblioteca estática. Ahora no debería necesitar incluir el marco en binarios incrustados.
Incluyendo activos: para incluir cosas como imágenes, audio o archivos xib / nib, recomiendo crear un paquete (esencialmente un directorio, más información aquí bit.ly/ios_bundle) y luego cargar los activos del paquete usando NSBundle.
fuente
Swift is not supported for static libraries
Simplemente arrastrar el marco a su proyecto no será lo suficientemente bueno. Eso es como estar en el mismo estadio pero no poder encontrar a tus hijos. Sigue estos pasos:
1) Crea tu marco
COMMAND
+B
cree su marco y asegúrese de recibir "Build Succeeded".2) Acceda a su marco
Products
carpeta en su proyecto..framework
y seleccione "Mostrar en el buscador".3) Coloque el marco en su proyecto
.framework
desde la ventana del Finder a la carpeta "Framework" de su proyecto de aplicación.4) Configurar proyecto de aplicación para framework
+
botón. En el menú desplegable, elija "Nueva fase de copia de archivos".Destination
en "Frameworks". Deja el subpath vacío. Luego haga clic en el+
botón en la parte inferior izquierda.5) Limpia, luego ejecuta tu proyecto
COMMAND
+SHIFT
+K
COMMAND
+R
fuente
Creé un marco usando Swift3 / Xcode 8.1 y lo estaba consumiendo en un proyecto Objective-C / Xcode 8.1. Para solucionar este problema, tuve que habilitar la
Always Embed Swift Standard Libraries
opción enBuild Options
.Echa un vistazo a esta captura de pantalla:
fuente
Embedded Binaries
sección de mi objetivo . Entonces, ¿por qué esto hace que funcione?En primer lugar, intente compilar después de Command + Option + Shift + K. Si aún falla, siga los pasos a continuación.
Si alguien se enfrenta a este error en Xcode 8, cambie el estado de su marco a Opcional en lugar de Requerido en la pestaña General de su objetivo.
fuente
Tengo el mismo tipo de problema en la versión iOS 9.x
He resuelto este problema cambiando
Required
aOptional
inLinked Frameworks and Libraries
forUserNotifications.framework
framework.fuente
Tuve que (además de lo mencionado aquí) agregar la siguiente línea a las Rutas de búsqueda de Runpath en la pestaña Configuración de compilación :
@executable_path/Frameworks
fuente
Debe agregar el marco a una nueva Fase de creación de archivos de copia para garantizar que el marco se copie en el paquete de la aplicación en tiempo de ejecución.
Consulte Cómo agregar una 'Fase de compilación de Copiar archivos' a mi Destino para obtener más información.
Documentos oficiales de Apple: https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html
fuente
Si está utilizando Xcode 11 o más reciente :
Desplácese hacia abajo hasta Marcos, Bibliotecas y Contenido incrustado .
Asegúrese de que el valor Incrustar y firmar o Incrustar sin firmar esté seleccionado para la opción Incrustar si es necesario.
fuente
Agregue el marco en binarios incrustados
Luego limpiar y construir.
fuente
Sorprendentemente, no todas las piezas necesarias están documentadas aquí, al menos para Xcode 8.
Mi caso fue un marco personalizado como parte del mismo espacio de trabajo. Resulta que se estaba construyendo incorrectamente. Basado en la última respuesta de jeremyhu a este hilo:
https://forums.developer.apple.com/thread/4687
Tuve que establecer
Dynamic Library Install Name Base
(DYLIB_INSTALL_NAME_BASE
) debajoBuild Settings
del Proyecto Marco y luego reconstruirlo. Estaba configurado incorrectamente$(LOCAL_LIBRARY_DIR)
y tuve que cambiarlo a@rpath
.Entonces, en la etapa de procesamiento de enlaces en el Proyecto de aplicación , estaba instruyendo a la aplicación host para cargar dinámicamente el marco en tiempo de ejecución desde
/Library/Frameworks/fw.Framework/fw
(como en la raíz del sistema de archivos de tiempo de ejecución) en lugar de la ruta a la aplicación/Frameworks/fw.Framework/fw
Con respecto a todos los demás valores: que no tiene por qué ser en 3 lugares en
Build Phases
, pero estos son todos conjunto a la vez cuando se acaba de añadir a laEmbedded Binaries
configuración de laGeneral
pestaña de la aplicación de alojamiento.Yo no tengo que configurar un extra de
Copy Files
fase, que intuitivamente parece redundante con respecto a la etapa de incorporación de todos modos. Al verificar el final de la transcripción de compilación, podemos asegurar que eso no es necesario.[Se eliminaron muchas líneas detalladas, pero está claro a partir de la transcripción simplificada en la interfaz de usuario de Xcode.]
Todavía no tengo idea de por qué Xcode estableció el
DYLIB_INSTALL_NAME_BASE
valor incorrectamente en mí.fuente
En mi caso, la solución fue eliminar el marco compilado de Embedded Binaries, que era un proyecto independiente en el espacio de trabajo, limpiarlo y reconstruirlo, y finalmente volver a agregarlo a Embedded Binaries.
fuente
Mi entorno: Cocos2d 2.0, Box2d, Objetivo C
Además de hacer las otras respuestas anteriores, finalmente fui a la pestaña General e hice WatchKit Opcional.
fuente
Si está utilizando un marco de terceros y está utilizando Cocoapods como su administrador de dependencias, intente hacer una
pod install
actualización de sus pods.Este bloqueo estaba ocurriendo en una biblioteca de terceros que estaba usando, así que me alegro de que la solución anterior funcionó para mí, ¡espero que funcione para usted!
fuente
Resuelto para mí al desmarcar "Copiar solo cuando está instalado" en Fases de compilación-> Incrustar marcos
fuente
Es un error de tiempo de ejecución causado por
Dynamic Linker
El error
Library not loaded
con@rpath
indica queDynamic Linker
no se puede encontrar el binario.Compruebe si se agregó el marco dinámico a
General -> Embedded Binaries
Compruebe la
@rpath
configuración entre consumidor (aplicación) y productor (marco dinámico):Build Settings -> Dynamic Library Install Name
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Enlazador dinámico
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
que es utilizado porloadable bundle
(Dynamic framework
como derivado) dondedyld
entra en juegoDynamic Library Install Name
: ruta al archivo binario (no .framework). Sí, tienen el mismo nombre, peroMyFramework.framework
es unapackaged bundle
con elMyFramework
archivo binario y los recursos dentro.Esta ruta al directorio puede ser absoluta o relativa (p
@executable_path
. Ej .@loader_path
,@rpath
). La ruta relativa es más preferible porque se cambia junto con un ancla que es útil cuando distribuye su paquete como un solo directorioruta absoluta - ejemplo de Framework1
@executable_path
@executable_path - relativo a la entrada binaria - Caso de uso de ejemplo de Framework2
: incrustar un
Dynamic framework
en una aplicación@loader_path
@loader_path - relativo al paquete que es propietario de este
caso de uso binario : framework con framework incrustado - Framework3_1 con Framework3_2 dentro
@rpath - Ruta de búsqueda de Runpath
Ejemplo de Framework2
Anteriormente teníamos que configurar un Framework para trabajar con dyld. No es conveniente porque el mismo Framework no se puede usar con configuraciones diferentes
@rpath
es un concepto compuesto que se basa en partes externas (Aplicación) y anidadas (Marco dinámico):Solicitud:
Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS)
- define una lista de plantillas con las que se puede sustituir@rpath
.Build Phases -> Embed Frameworks -> Destination, Subpath
para ser el condado donde se encuentra exactamente el marco de incrustaciónMarco Dinámico:
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
- punto que@rpath
se usa junto con la ruta del paquete local a un binario*
../
- ir al padre del directorio actualotool
- herramienta de visualización de archivos de objetosinstall_name_tool
cambiar los nombres de instalación de biblioteca compartida dinámica usando-rpath
CocoaPods
utilizause_frameworks!
[Acerca de] para regular unDynamic Linker
[Vocabulario]
fuente
Recientemente me encontré con este problema al importar CoreNFC en iphones más antiguos (por ejemplo, iPhone 6) y Xcode (11.3.1). Pude conseguir que funcionara
Esto me permitió compilar para iPhones más viejos / más nuevos sin hacer ningún cambio de código. Espero que esto ayude a otros.
fuente
Tuve el mismo problema Intenté construir mi proyecto con un iPhone que nunca antes había usado y no agregué un nuevo marco. Para mí, la limpieza funcionó bien ( Shift + Command + K ). Tal vez sea porque uso la beta 5 de Xcode 7 y un iPhone 6 con iOS 9 Beta, pero funcionó.
fuente
En mi caso, mi proyecto está escrito por Objective-C y en la biblioteca hay archivos Swift. Así que cambié "Insertar siempre bibliotecas estándar de Swift" en la pestaña Configuración de compilación de mi proyecto a Sí y se volvió totalmente correcto.
fuente
Para cualquier proyecto o proyecto de Framework en Xcode que use pods, una manera fácil de evitar que la biblioteca dinámica (dylb) no se cargue es configurar el archivo de pod en tinta en modo estático. Para hacerlo, solo asegúrese de no escribir la siguiente línea en su archivo pod.
Una vez que la línea eliminada de su archivo que guardó, simplemente ejecute desde la consola:
fuente
Si tiene un pod de desarrollo Elimine su aplicación de la instalación del simulador desde el pod -> limpiar -> ejecutar de nuevo ...
fuente
Lo mismo ocurrió cuando creé un nuevo esquema de configuración y compilación.
Entonces la solución para mí fue correr
para esta configuración recién creada.
fuente
Después de probar todos los métodos disponibles en Internet y mis propios trucos de prueba y error 100 veces. Finalmente pude resolverlo. - Apeksha Sahu hace 6 minutos
Goto iTunes en Mac -> cuentas -> Autorizar esta computadora - Apeksha Sahu hace 5 minutos
segundo paso ... Goto desarrollador en configuraciones en iPad y iPhone y reindexar con identificadores y borrar las computadoras de confianza todo. Funcionó para mí ........ ....... Después de reinstalar Mac OS Alta versión 10.13.15 seria de Mac OS seirra beta última versión, para reinstalar la última versión de Xcode, después de actualizar todos los certificados. etc etc etc ... tantos métodos como puedas pensar que hice. -
fuente
Intente cambiar el indicador
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
(en versiones anteriores de xcode:)Embedded Content Contains Swift Code
en la Configuración de compilación de NO a SÍ.fuente
Xcode 11
fuente
En Xcode 11
Estaba enfrentando el mismo problema
Cambiar "No incrustar" en la pestaña General > "Marcos, bibliotecas y contenido incrustado" seguía dando como resultado el mismo error.
Lo que sí me resolvió fue agregar el Marco en la pestaña Construir fases > sección Incrustar marcos
--Actualizado---
Observé que en proyectos creados en versiones anteriores de Xcode Embed Frameworks Section no está disponible cuando se ejecuta en Xcode 11, encuentre los pasos a continuación para lograr la solución:
1: Primero debe agregar la nueva fase Copiar archivos en la pestaña Fases de compilación .
2: Segundo, cambie el nombre de la fase agregada a Incrustar marcos
3: Cambiar el destino a Frameworks .
4: Agregue el marco para el cual ocurrió el error.
fuente
Aunque todo el mundo dice que se debe incrustar el marco en los binarios incrustados, todavía no funciona, porque nos estamos perdiendo un paso importante aquí.
Estos son los dos pasos correctos para agregar los binarios en la pestaña Binarios incrustados:
Elimine el marco que genera el error de "Bibliotecas y marcos vinculados" en la pestaña General.
Ahora agregue el marco eliminado solo en la pestaña Binarios incrustados y eso es todo lo que uno tendría que hacer.
Ejecútalo en el dispositivo y mantén esa sonrisa;)
fuente
Los pasos anteriores resolvieron mis problemas.
fuente
La solución simple es seguir esta captura de pantalla y luego el bloqueo desaparecerá:
Notado: Esto es Xcode 11.5
fuente
En caso de que alguien aún experimente este problema, a pesar de seguir todos los pasos descritos en las muchas otras respuestas, es posible que deba revocar y volver a crear su certificado de firma de código , según lo siguiente:
https://developer.apple.com/library/ios/qa/qa1886/_index.html
fuente