ios - pages - Cómo agregar un marco dentro de otro marco(Marco Paraguas)
como poner bordes en word ipad (4)
Tengo construir un marco utilizando el siguiente tutorial .
Y también obtuve this marco.
Estoy tratando de implementar el segundo Framework dentro de los míos, por lo que leí en los documentos de Apple, el marco resultante se llama "Umbrella Framework".
Agregué el segundo marco en el marco utilizando arrastrar y soltar y verifico que está en el "Enlace binario con bibliotecas".
Y después de que traté de hacer la próxima importación en una de las clases de mi framework:
#import <CrashReporter/CrashReporter.h>
Recibí un error ya que el marco importado no es visible.
También he visto la publicación stackoverflow: ¿cómo crear un framework paraguas en iOS SDK?
Actualizar
¿Alguien ha tratado de extraer las clases PLCrashReporter para iOS e integrarlas en un proyecto?
Puedes encontrar mi intento here .
Apple te desalienta a crear un marco paraguas pero, aún así, sigue diciendo que es posible con alguna descripción sobre su estructura, etc. '' así que me centraré en cómo hacerlo realmente.
Debo mencionar que si controlas uno o más frameworks, agruparlos en uno no es una mala idea y puede ayudar al desarrollador final.
Crear un marco paraguas es realmente simple ahora en Xcodes recientes (7 en adelante)
He aquí cómo hacerlo.
Primero crea un marco:
Arrastre CrashReporter.framework
al proyecto de marco de Umbrella:
Código de ejemplo para asegurarse de que ambos marcos funcionen:
Umbrella.h:
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface Umbrella : NSObject
+(void)sayHelloFromUmbrella;
@end
Umbrella.m:
#import "Umbrella.h"
#import <CrashReporter/CrashReporter.h>
@implementation Umbrella
+(void)sayHelloFromUmbrella
{
NSLog(@"Hey from Umbrella");
PLCrashReporter *crashObject = [[PLCrashReporter alloc]initWithConfiguration:nil];
NSLog(@"crashObject: %@",crashObject);
}
@end
Compila y obtendrás el CrashReporter.framework
Umbrella.framework
(que contiene CrashReporter.framework
) en tu carpeta de compilación.
Arrastra Umbrella.framework
y Umbrella.framework
dentro de "Binarios incrustados" en el proyecto que va a usarlo:
Luego solo importa tu marco finalizado.
ViewController.m del proyecto que acabamos de arrastrar Umbrella.framework a:
#import "ViewController.h"
#import <Umbrella/Umbrella.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[Umbrella sayHelloFromUmbrella];
}
Que dará como resultado esto:
Hey from Umbrella
crashObject: <PLCrashReporter: 0x7fb441d5c650>
Lo que nos dice que ambos marcos funcionan.
Intenté hacer lo que sugirió @Segev, pero seguí recibiendo el error de que faltaban los archivos del marco incrustado.
Sin embargo, al hacer algunas configuraciones adicionales ¡conseguí que funcionara!
Esto es lo que hice:
- Agregue el archivo de encabezado de marco incrustado dentro del proyecto de marco paraguas.
- En el encabezado del paraguas, agregue: import "EmbeddedFramework.h"
- A continuación, importe el marco paraguas en el proyecto deseado y no obtendrá más errores
Verá que la carpeta ''Headers'' del marco del paraguas incluirá el archivo ''EmbeddedFramework.h''
Puede ver un proyecto de ejemplo aquí:
- Marco sombrilla: https://github.com/AdrianaPineda/FrameworkGOMobileSample
- Aplicación de ejemplo: https://github.com/AdrianaPineda/iOSGOMobileSampleApp
Espero que esto ayude
La tentación de distribuir otro marco es comprensible, pero altamente desalentada. Trataré de explicar por qué eso (con argumentos), y también proporcionaré algunas buenas alternativas que te ayudarán en tu caso.
El marco de Umbrella está diseñado para su uso, solo cuando usted es el distribuidor de ambos frameworks, usted tiene control total sobre ellos, y se distribuirán juntos.
Hay una cita popular sobre el tema de Apple, donde dicen que desalientan los frameworks paraguas.
No crear marcos de paraguas
Si bien es posible crear frameworks paraguas utilizando Xcode, hacerlo no es necesario para la mayoría de los desarrolladores y no es recomendable. Apple usa frameworks paraguas para enmascarar algunas de las interdependencias entre bibliotecas en el sistema operativo. En casi todos los casos, debería poder incluir su código en un único paquete de marco estándar. Alternativamente, si su código era suficientemente modular, podría crear múltiples marcos, pero en ese caso, las dependencias entre los módulos serían mínimas o inexistentes y no deberían garantizar la creación de un paraguas para ellas.
En primer lugar, esto es lo que hacen la mayoría de los desarrolladores en esta situación, ya que hay muchos marcos que dependen de otros.
Informe al usuario que su marco requiere el uso de otro marco de terceros. Esto es completamente estándar y esperado en la mayoría de los casos. Luego, vincúlelo a nivel del sistema. Es tan simple como eso. Su marco de trabajo encontrará que el tercero y la función son parecidos, al igual que el uso de un marco nativo. Tome UIKit
por ejemplo. Para vincular a un tercero, siga los pasos en la siguiente sección. Sin duda se puede hacer de la manera estándar, pero usar una herramienta como CocoaPods hará que su proyecto sea más fácil de mantener.
Para responder completamente a su pregunta , en lugar de agregar el marco de terceros de la manera habitual, ya que podría tener problemas y complicaciones, use CocoaPods para agregarlo. De esta forma, elimina posibles problemas y también obtiene el beneficio adicional de CocoaPods para obtener la versión exacta del tercero que necesitará.
Aquí está CocoaPods Podfile para una aplicación llamada "CrashTest"
target ''CrashTest'' do
pod ''PLCrashReporter'', ''~> 1.2.0''
end
Solo para aclarar, cuando desarrolle el marco, se agregará a su proyecto y será visible. La gran diferencia aquí es que se distribuirá por separado de su marco, y los usuarios finales tendrán que agregar ambos a sus proyectos para que todo funcione.
Aquí están las razones por las que esto se hace de esta manera.
Por ejemplo, le gustaría incluir PLCrashReporter
en su marco. Digamos que otro proveedor de framework también quiere incluirlo en el suyo. La aplicación que usa ambos frameworks tendrá PLCrashReporter
incluido dos veces (como parte de cada framework paraguas). Posible incluso versiones diferentes de esto. Esto podría ocasionar serios problemas dentro de la aplicación del usuario. Si ambos frameworks paraguas están vinculados a PLCrashReporter, como se describe en la sección anterior, este problema se evitaría por completo.
Otro punto, que mencioné anteriormente es el control de versiones. Al distribuir un marco paraguas, necesita poder controlar las versiones de todos los marcos involucrados, y no tiene control sobre el marco de terceros. Lo que nuevamente conduciría a un problema similar al descrito anteriormente.
Sé que este enfoque no proporciona una respuesta directa a la pregunta, sino que trata de desalentar una mala práctica, al tiempo que señala la forma estándar de la industria de hacer las cosas.
AQUÍ HAY UN PROYECTO DEMO:
Demostración del marco paraguas
Todas las respuestas bajo esta línea son incorrectas, porque simplemente hacen lo que copia manualmente los marcos secundarios en el "marco general".
Incrustar un marco dentro de un marco (iOS 8+)
¿Cómo crear un marco paraguas en iOS SDK?
Cómo agregar un marco dentro de otro marco (Marco Paraguas)
Lo primero que debemos saber es que el "marco paraguas" es una concepción en Mac OS que no está en iOS, el documento oficial está aquí
si desea crear un "UmbrellaFramework" no recomendado, debe realizar este proceso paso a paso y conocer los detalles durante los períodos de compilación y enlace.
- Cambie todos los sub frameworks Mach-O a Static Library, significa compilar este objetivo como Static Library (.a)
- Copie manualmente todo el sub-Framework en UmbrellaFramework durante la fase de compilación (como hicieron otras respuestas)
- Agregue "FakeBundleShellScript" al objetivo "UmbrellaFramework", hace que todos los subframes se empaqueten a sí mismos como un paquete para unirse a "UmbrellaFramework"
- Cambie la función de carga del marco, debe cargar los recursos del subarmazón a través de la ruta o url, porque se convirtió en un paquete, este paso significa que debe tener el control supremo de todos los códigos, tanto sub-frameworks como paraguas.
¡Aquí hay un ejemplo de "FakeBundleShellScript" al que puedes referirte
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
find "$APP_PATH" -name ''*.framework'' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
BUNDLE_IN_ROOT="$APP_PATH/${FRAMEWORK_EXECUTABLE_NAME}.bundle"
if [[ -e "$FRAMEWORK_EXECUTABLE_PATH" ]]; then
FRAMEWORK_MACH_O="$(otool -a "$FRAMEWORK_EXECUTABLE_PATH" | head -n 1)"
FRAMEWORK_FAT_ARCH="$(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")"
else
FRAMEWORK_MACH_O="NO EXIST"
FRAMEWORK_FAT_ARCH="NO EXIST"
fi
echo "FRAMEWORK_EXECUTABLE_NAME is $FRAMEWORK_EXECUTABLE_NAME"
echo "FRAMEWORK_EXECUTABLE_PATH is $FRAMEWORK_EXECUTABLE_PATH"
echo "FRAMEWORK_MACH_O is $FRAMEWORK_MACH_O"
echo "FRAMEWORK_FAT_ARCH is $FRAMEWORK_FAT_ARCH"
echo "BUNDLE_IN_ROOT is $BUNDLE_IN_ROOT"
if [[ "$FRAMEWORK_MACH_O" =~ "Archive :" ]]; then
echo "Rmove Static-Mach-O is $FRAMEWORK_EXECUTABLE_PATH"
rm "$FRAMEWORK_EXECUTABLE_PATH"
defaults write "$FRAMEWORK/Info.plist" CFBundlePackageType "BNDL"
defaults delete "$FRAMEWORK/Info.plist" CFBundleExecutable
if [[ -d "$BUNDLE_IN_ROOT" ]]; then
rm -rf "$BUNDLE_IN_ROOT"
fi
mv -f "$FRAMEWORK" "$BUNDLE_IN_ROOT"
elif [[ "$FRAMEWORK_FAT_ARCH" =~ "Architectures in the fat file" ]]; then
#statements
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
fi
done
Como todo lo que dije, el punto clave para hacer un "UmbrellaFramework" no recomendado es !!!! [Compila los sub-frameworks como Static, procesa los recursos a través de fake a bundle], RECUERDA !! Apple siempre dijo "NO CREES UN UmbrellaFramework"
si puedes entender chino, más detalles para hacer un "UmbrellaFramework" se pueden obtener de mi blog