ios - publicar - subir app a app store 2018
No se encontró el archivo ModuleName-Swift.h en xcode8 (6)
El supuesto que hice en la Edición 4 resultó ser el correcto. Si un proyecto tiene múltiples destinos, los archivos "-Swift.h" no se pueden importar todos en un archivo .m ObjectiveC.
Por lo tanto, hay una solución que debe adoptarse y es cambiar la configuración de compilación SWIFT_OBJC_INTERFACE_HEADER_NAME y hacer que sea la misma en diferentes destinos. Para ello, cambie la instrucción que genera esta propiedad de $ (SWIFT_MODULE_NAME) -Swift.h a $ (PROJECT_NAME) -Swift.h como se explica here
También es posible establecer que la configuración del Nombre del módulo del producto en Configuraciones de compilación sea la misma en todos los módulos (lo puse en $ (NOMBRE DE PROYECTO)), de modo que el archivo -Swift.h que se genera tenga el mismo nombre en todos los módulos . Esto elimina la necesidad de agregar / verificar macros del preprocesador.
Después de hacer esta Carpeta de compilación limpia, presione Alt y vaya al menú Producto. Dado que el nombre del encabezado se comparte entre los destinos ahora, se puede importar una vez en el archivo .m ObjectiveC y todos los destinos pueden beneficiarse de las clases Swift.
Si después de construirlo aún muestra el error, asegúrese de que se pueda acceder al encabezado desde XCode haciendo clic en Cmd sobre su nombre. Debería abrir un archivo que contenga código similar a este:
SWIFT_CLASS("_TtC27ProjectName_Summary11MyClass")
@interface MyClass : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
Si es necesario asegurarse de que esos encabezados se están generando, abra un terminal y use este comando
find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h"
Debería ver un encabezado para cada objetivo
Otro problema que me ocurrió después de esos cambios es que comenzó a dar errores en el código de ObjectiveC que no toqué. El problema se debió a la posición de la importación, como se informó here :
Exactamente donde se encuentra en la parte superior de un archivo .m #que importa el encabezado de puente oculto puede marcar la diferencia. El signo habitual de problemas es que obtiene un error de compilación de "Nombre de tipo desconocido", donde el tipo desconocido es una clase declarada en Objective-C. La solución es #importar también el archivo .h que contiene la declaración del tipo desconocido en sus archivos de Objective-C, antes de #importar el encabezado de puente oculto. Tener que hacer esto puede ser una molestia, especialmente si el archivo de Objective-C en cuestión no necesita saber acerca de esta clase, pero resuelve el problema y permite que la compilación continúe.
¡Al final, el código se compila y ejecuta en el dispositivo y simulador!
Estoy tratando de trabajar en un proyecto mixto de Swift y ObjectiveC sin suerte.
Mi proyecto consta de 6 objetivos:
- Aplicación
- Núcleo
- CoreTest
- Resumen
- Extensión de WatchKit
- Aplicación WatchKit
He podido agregar una clase Swift que tiene una membresía de destino (App) y utiliza el código ObjectiveC que pasa desde App-Bridging-Header.h El paradigma "ObjectiveC into Swift code" funciona como un encanto.
En cambio, estoy luchando con el paradigma "Swift into ObjectiveC code". En el caso específico, necesito usar una nueva clase Swift dentro de un archivo .m de ObjectiveC que sea miembro de cuatro objetivos.
Lo que he estado haciendo hasta ahora es esto:
- Agregue un nuevo archivo Swift al proyecto Core especificando las cuatro membresías (App, Core, Summary, WatchKit Ext)
- XCode solicita crear -Bridging-Header.h para tres proyectos Core, Summary y WatchKit Ext (App-Bridging-Header.h ya existe desde que se usó anteriormente), y doy mi consentimiento (no sé por qué crea esos archivos dentro la misma carpeta de grupo donde agrego mi clase Swift pero no recuerdo)
- Creo la clase Swift agregando la clave @objc antes de la clase
- Voy a verificar si el nombre del encabezado de interfaz generado por Objective-C está configurado para todos los módulos, y sí lo está
- Verifico si Definir Módulo está configurado como No en todos los módulos y establecido como Sí en el proyecto principal, y sí lo está
- Anoto las importaciones de los archivos -Swift.h para los cuatro objetivos
- Dentro de mi clase Objective-C trato de usar mi nueva clase Swift, aparentemente parece funcionar (incluso autocompletar)
- Intento generar el proyecto pero falla al decir que no se encuentra el archivo -Swift.h
He seguido la guía Mix and Match de Apple y muchos hilos SO, incluido este que aparentemente aborda el mismo problema que el mío, pero no funciona.
También he visto this y this pero no funcionó.
También intenté eliminar los datos derivados y limpiar todo el proyecto varias veces sin suerte.
EDITAR 1: Más detalles
Esta es la declaración de mi clase Swift Import RealmSwift
@objc class MyClass: Object {}
Este es el fragmento de uso de la clase Swift dentro de ObjectiveC
MyClass *app = [[MyClass alloc] init];
Si evito usar #import ...- Swift.h, la compilación falla y dice que estoy usando un idenfier no declarado "MyClass" y esto es correcto.
Si uso los archivos #import ...- Swift.h dice que el módulo X no puede encontrar el módulo Y y así sucesivamente.
EDIT 2: nombre del módulo Swift
Al observar la propiedad SWIFT_OBJC_INTERFACE_HEADER_NAME de cada objetivo, he visto que se ha creado con esta sintaxis $ (SWIFT_MODULE_NAME) -Swift.h ¿Debo cambiar SWIFT_MODULE_NAME a MODULE_NAME ?
EDIT 3: Importaciones
Este es el conjunto de importaciones para los encabezados Swift en el archivo .m ObjectiveC. Estoy usando los nombres de los módulos especificados en las propiedades relativas de Configuración de Construcción. Observe que uno tiene el carácter ''_'' ya que el objetivo de la extensión WatchKit tiene un espacio en el nombre del objetivo.
#import "ProjectName_App-Swift.h"
#import "ProjectName_Core-Swift.h"
#import "ProjectName_Summary-Swift.h"
#import "ProjectName_WatchKit_Extension-Swift.h"
EDIT 4: visibilidad cruzada de archivos -Swift.h
He intentado lo siguiente:
- Se agregó una clase Swift solo en la aplicación objetivo
- XCode creó el encabezado puente
- Se insertó #import "ProjectName_App-Swift.h" en el archivo ObjectiveC utilizado solo por la aplicación
- Hice uso de la clase Swift dentro de este archivo.
- ¡Se compila! Y soy capaz de usar la clase Swift
Cuando la clase Swift se define para múltiples objetivos y el archivo ObjectiveC es utilizado por esos múltiples objetivos, no funciona. Los errores de compilación son así: No se encontró el archivo Target X -> "ProjectName_TargetY-Swift.h". Parece que un objetivo no puede ver otros objetivos: archivos Swift.h.
¿Qué estoy haciendo mal? Gracias por tu ayuda
En mi caso, tengo un espacio de trabajo con un subproyecto de aplicación para iOS, un subproyecto de marco y un subproyecto Podcas de CocoaPods. Se produjo el error "ModuleName-Swift.h file not found" en mi subproyecto de framework porque el subproyecto Pods todavía no había creado el archivo.
No estoy seguro de si hay una manera de decirle a Xcode sobre las dependencias entre subproyectos, pero simplemente los reordené en el Project Navigator del lado izquierdo:
- Vainas
- marco de referencia
- aplicación iOS
Trabajó muy bien después de eso!
Esta no es una solución para la pregunta, pero como muchos podrían terminar en esta página buscando el problema por el cual no se encuentra el archivo <ModuleName>-Swift.h
(como yo), me gustaría agregar una posible razón más:
Cuando hay un problema con el compilador en un archivo swift, el encabezado podría no ser generado por Xcode y, por lo tanto, falta el archivo.
Al menos en mi caso, el <ModuleName>-Swift.h not found
desapareció una vez que solucioné el error de compilación en el archivo Swift.
La solución para mí fue importar el encabezado Swift generado a través de la sintaxis <>
:
#import <OtherTargetWithSwiftClass/OtherTargetWithSwiftClass-Swift.h>
Para mi caso, funciona bien en Xcode 8 pero los archivos con
#import "Project-Swift.h"
ha perdido importaciones como lo describe LucioB
Usando Xcode 9 elimina esos errores
Tuve un problema similar y casi terminé pasando un día entero resolviendo el problema mientras seguía las sugerencias de otros desarrolladores en y algunas otras fuentes.
Estaba actualizando de Xcode 7.3.1 a Xcode 8.2.1 y Swift 2.2 a Swift 3.0.1.
En mi caso, descubrí que el archivo PROJECT_NAME-Swift.h
no se creó en:
~/Library/Developer/Xcode/DerivedData/PRODUCT-NAME-hdkrxixrxbiorwesffpqvefxsrzl/Build/Intermediates/PRODUCT-NAME.build/Debug/PRODUCT-NAME.build/Objects-normal/x86_64/PRODUCT-NAME-Swift.h.
Supongo que de alguna manera intenta referirse a este archivo de encabezado de la ruta anterior y, por lo tanto, al error. Lo copié manualmente. No hice la construcción limpia después de esto. Esto resolvió mi problema y el archivo de encabezado Swift comenzó a crearse para compilaciones y compilaciones adicionales.