Xamarin.iOS
Encuadernación de bibliotecas rápidas
Buscar..
Introducción
Una guía fácil de seguir que lo guiará a través del proceso de enlace de archivos Swift .framework para su uso en un proyecto de Xamarin.
Observaciones
Cuando se construye una biblioteca en Xcode, tiene una opción para incluir las bibliotecas swift. No lo hagas Se incluirán en su aplicación final como NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib pero deben incluirse como NAME.app/Frameworks/libswift*.dylib
Puede encontrar esta información en otra parte, pero vale la pena mencionarlo: no incluya Bitcode en la biblioteca. A partir de este momento, Xamarin no incluye Bitcode para iOS y Apple requiere que todas las bibliotecas admitan las mismas arquitecturas.
Encuadernación de una Biblioteca Swift en Xamarin.iOS
El enlace de una Biblioteca Swift en Xamarin.iOS sigue el mismo proceso para Objective-C como se muestra en https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/ , pero con algunas advertencias.
- Una clase swift debe heredar de NSObject para ser enlazada.
- El compilador Swift traducirá los nombres de clase y protocolo a otra cosa a menos que use la anotación @objc (por ejemplo, @objc (MyClass)) en sus clases swift para especificar el nombre c objetivo explícito.
- En tiempo de ejecución, su APP debe incluir algunas bibliotecas centrales rápidas junto con su marco enlazado en una carpeta llamada Marcos;
- Cuando la aplicación se envía a AppStore, debe incluir una carpeta SwiftSupport junto con su carpeta de carga útil. Esos están dentro del archivo IPA.
Aquí puede encontrar un enlace de muestra simple: https://github.com/Flash3001/Xamarin.BindingSwiftLibrarySample
Y un ejemplo de enlace completo: https://github.com/Flash3001/iOSCharts.Xamarin
Por favor encuentre los pasos a continuación:
1.1 Prepara las clases Swift que quieres exportar.
Para cualquier clase de Swift que quiera usar, debe heredar de NSObject y hacer explícito el nombre de Objective-C usando la anotación objc. De lo contrario, el compilador Swift generará diferentes nombres. A continuación se muestra un código de ejemplo de cómo podría verse una clase Swift. Tenga en cuenta que no importa qué clase hereda mientras la clase raíz hereda de NSObject.
//Add this to specify explicit objective c name
@objc(MyClass)
open class MyClass: NSObject {
open func getValue() -> String
{
return "Value came from MyClass.swift!";
}
}
1.2 Construir el marco
Desactivar el código de bits. *
Construir para el lanzamiento de dispositivo y simulador. *
- No relacionado solo con Swift binding.
2. Crear una biblioteca de grasa
Un marco contiene varios archivos, el que necesita comer un poco es NAME.framework / NAME (sin extensión).
- Copie Release-iphoneos / NAME.framework a NAME.framework
- Crea la biblioteca FAT usando:
- lipo -create Release-iphonesimulator / NAME.framework / NAME Release-iphoneos / NAME.framework / NAME -output NAME.framework / NAME
- Copie los archivos en Release-iphonesimulator / NAME.framework / Modules / NAME.swiftmodule en NAME.framework / Modules / NAME.swiftmodule (hasta ahora solo contenía archivos del iPhoneOS)
3. Importar la biblioteca
Asumiré que ya creó el proyecto de enlace en Archivo -> Nuevo -> iOS -> Biblioteca de enlaces.
Soporte para Xamarin importando .frameworks. Simplemente haga clic derecho en 'Referencias nativas' y haga clic en 'Agregar referencia nativa'. Encuentra el marco de grasa recién creado y agregarlo.
4. Cree la ApiDefinition basada en el archivo LIBRARY-Swift.h dentro de los encabezados.
Puedes hacerlo manualmente, pero no estará bien. Puedes usar Objetivo Sharpie. La herramienta que Xamarin utiliza para enlazar sus propias bibliotecas.
Cómo usarlo en https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/
El comando básico será algo así como: sharpie bind -sdk iphoneos9.3 NAME-Swift.h
Si obtiene una System.Reflection.TargetInvocationException
probablemente se deba a que tiene instalada una versión diferente de SDK. Ejecute el siguiente comando para verificar con el iPhone OS SDK que ha instalado:
sharpie xcode -sdks
El archivo NAME-Swift.h se encuentra en NAME.framework / Headers / NAME-Swift.h
Nota: las clases swift deben heredarse de "NSObject", de lo contrario, NAME-Swift.h no importará sus clases y Objetivo Sharpie no convertirá nada.
Reemplace los contenidos de su proyecto de enlace ApiDefinition.cs con el recién creado.
5. Cambie todos [Protocolo] y [Tipo de base] para incluir el nombre de la clase en el tiempo de ejecución de Objective-C.
En caso de que la clase o el protocolo Swift original no incluya la anotación @objc (MyClass) como se especifica en el paso 1.1, se cambiarán sus nombres internos de Objective-C, por lo que debe asignarlos al correcto.
Todos los nombres están disponibles en el archivo NAME-Swift.h en el siguiente formato:
SWIFT_CLASS("_TtC11SwiftSample7MyClass")
@interface MyClass : NSObject
Y
SWIFT_PROTOCOL("_TtP6Charts17ChartDataProvider_")
@protocol ChartDataProvider
Para establecer el nombre, use BaseTypeAttribute.Name https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#BaseType.Name propiedad para las clases y ProcotolAttribute.Name https: // developer.xamarin.com/api/property/MonoTouch.Foundation.ProtocolAttribute.Name/ para protocolos.
[BaseType(typeof(NSObject), Name = "_TtC11SwiftSample7MyClass")]
interface MyClass
Hacerlo manualmente no está bien. Puede utilizar esta herramienta https://github.com/Flash3001/SwiftClassify para insertar todos los nombres. (Es un trabajo en progreso. Pero es bastante simple, solo con mirar el código obtendrá cómo funciona).
6.1 Incluir todas las dependencias Swift para ejecutar.
Si intenta consumir la biblioteca en una aplicación e intenta ejecutarla ahora mismo, se bloqueará. El error se debe a la falta de libswiftCore.dylib
Algo como esto:
Dyld Error Message:
Library not loaded: @rpath/libswiftCore.dylib
Referenced from: /Users/USER/Library/Developer/CoreSimulator/Devices/AC440891-C819-4050-8CAB-CE15AB4B3830/data/Containers/Bundle/Application/27D2EC87-5042-4FA7-9B80-A24A8971FB48/SampleUsing.app/Frameworks/SwiftSample.framework/SwiftSample
Reason: image not found
Xamarin.iOS no ofrece soporte oficial para vincular una biblioteca Swift. Por lo tanto, debe incluir manualmente las bibliotecas de Swift Core en las carpetas Frameworks y SwiftSupport. Los archivos para la carpeta Frameworks son diferentes para Simulator y Device. Se pueden encontrar en /Applications/Xcode.app/Contents/Developer//XcodeDefault.xctoolchain/usr/lib/swift.Toolchains
En lugar de copiar manualmente los archivos dentro de la carpeta de Framework, puede usar esta biblioteca https://github.com/Flash3001/Xamarin.Swift3.Support . Incluye cada una de las necesidades de Swift 3.1, cada una en un solo paquete NuGet.
Como puede ver, el paquete Nuget está incluido en la aplicación del consumidor, no en el enlace en sí. Si intentas incluirlo en el enlace obtendrás errores de compilación.
Si está creando un paquete Nuget, puede indicar a Nuget que lo incluya como una dependencia.
6.2. Averiguar qué dependencias Swift incluir.
Una cosa importante que hacer es averiguar cada paquete que necesita incluir en su proyecto. Un enlace simple usualmente necesitará:
libswiftCore.dylib
libswiftCoreGraphics.dylib
libswiftCoreImage.dylib
libswiftDarwin.dylib
libswiftDispatch.dylib
libswiftFoundation.dylib
libswiftObjectiveC.dylib
libswiftQuartzCore.dylib
libswiftUIKit.dylib
Para enumerar cada dependencia, puede ejecutar el siguiente comando dentro de LibraryName.framework
otool -l -arch armv7 LibraryName | grep libswift
No incluya todos los paquetes disponibles en NuGet para Swift3, ya que pueden aumentar el tamaño de su aplicación.
7. Incluya SwiftSupport para llevar la aplicación a AppStore.
Apple requiere que su aplicación se envíe con una carpeta SwiftSupport junto con su carpeta de carga útil. Ambos están dentro de su paquete de IPA.
Puede usar este script https://github.com/bq/ipa-packager para hacer este trabajo por usted.
Este proceso es el único que el consumidor de la biblioteca tendrá que hacer manualmente. Cada vez que él / ella intenta empujar la aplicación a AppStore.
Haga clic en 'Firmar y distribuir' y guardar en disco
Crea la nueva API usando el script antes mencionado.
Si descomprime el archivo, este contendrá la carpeta SwiftSupport.
Observaciones
Cuando se construye una biblioteca en Xcode, tiene una opción para incluir las bibliotecas swift. No lo hagas Se incluirán en su aplicación final como NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib pero deben incluirse como NAME.app/Frameworks/libswift*.dylib
Puede encontrar esta información en otra parte, pero vale la pena mencionarlo: no incluya Bitcode en la biblioteca. A partir de este momento, Xamarin no incluye Bitcode para iOS y Apple requiere que todas las bibliotecas admitan las mismas arquitecturas.
Renuncia
Esta guía fue creada originalmente por Lucas Teixeira . Todos los créditos le pertenecen. Gracias, Lucas.