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

  1. 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

  2. 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.

  1. Una clase swift debe heredar de NSObject para ser enlazada.
  2. 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.
  3. En tiempo de ejecución, su APP debe incluir algunas bibliotecas centrales rápidas junto con su marco enlazado en una carpeta llamada Marcos;
  4. 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. *

Desactivar Bitcode

Construir para el lanzamiento de dispositivo y simulador. * Establecer como lanzamiento en esquemas de Xcode Construir para dispositivo

Construir para simulador

Encontrar marcos

Marcos

  • 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)

Crear biblioteca de grasa

Copiar archivos pendientes

Archivos copiados

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.

Añadir referencia nativa

Seleccione .framework

Referencia

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.

Sharpie

Reemplace los contenidos de su proyecto de enlace ApiDefinition.cs con el recién creado. Reemplazar el contenido del archivo

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.

Añadir 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.

Aplicación en ejecución

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

Listar dependencias

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.

Archivo para la publicación

Haga clic en 'Firmar y distribuir' y guardar en disco Firmar y distribuir

Descomprime tu .IPA Abrir la cremallera

Crea la nueva API usando el script antes mencionado. Nueva API

Si descomprime el archivo, este contendrá la carpeta SwiftSupport. introduzca la descripción de la imagen aquí

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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow