Ricerca…


introduzione

Una guida facile da seguire che ti guiderà attraverso il processo di associazione dei file di file Swift per l'utilizzo in un progetto Xamarin.

Osservazioni

  1. Quando si costruisce una libreria in Xcode, ha un'opzione per includere le librerie swift. Non farlo! Verranno inclusi nell'app finale come NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib ma devono essere inclusi come NAME.app/Frameworks/libswift*.dylib

  2. Puoi trovare queste informazioni altrove, ma vale la pena menzionare: Non includere Bitcode nella libreria. A partire da ora Xamarin non include Bitcode per iOS e Apple richiede che tutte le librerie supportino le stesse architetture.

Associazione di una libreria Swift in Xamarin.iOS

Associare una libreria Swift in Xamarin.iOS segue lo stesso processo per Objective-C come mostrato in https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/ , ma con alcune avvertenze.

  1. Una classe rapida deve ereditare da NSObject per essere associata.
  2. Il compilatore Swift tradurrà i nomi di classi e protocolli in qualcos'altro, a meno che tu non usi l'annotazione @objc (ad esempio @objc (MyClass)) nelle tue classi veloci per specificare il nome c obiettivo oggettivo.
  3. In runtime la tua APP deve includere alcune librerie di base rapide accanto al tuo framework binded in una cartella chiamata Frameworks;
  4. Quando l'app viene inviata all'App Store, deve includere una cartella SwiftSupport accanto alla cartella Payload. Questi sono all'interno del file IPA.

Qui puoi trovare un semplice esempio di associazione: https://github.com/Flash3001/Xamarin.BindingSwiftLibrarySample

E un campione completamente vincolante: https://github.com/Flash3001/iOSCharts.Xamarin

Si prega di trovare i passaggi di seguito:

1.1 Prepara le classi Swift che vuoi esportare

Per qualsiasi classe Swift che si desidera utilizzare, è necessario ereditare da NSObject e rendere esplicito il nome Objective-C utilizzando l'annotazione objc. Altrimenti il ​​compilatore Swift genererà nomi diversi. Di seguito è riportato un codice di esempio su come potrebbe essere una classe Swift. Si noti che non importa quale classe eredita finché la classe radice eredita da 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 Costruisci la struttura

Disabilita il codice bit. *

Disabilita il codice bit

Crea per il rilascio per Device and Simulator. * Impostalo come Release in Xcode Schemes Crea per dispositivo

Build for Simulator

Trova quadri

Frameworks

  • Non correlato solo al binding di Swift.

2. Creare una libreria di grassi

Un framework contiene diversi file, quello che deve mangiare un po 'è NAME.framework / NAME (senza estensione).

  • Copia Release-iphoneos / NAME.framework su NAME.framework
  • Crea la libreria FAT usando:
    • Release-iphone-Iphone / NAME.framework / NAME Release-iphoneos / NAME.framework / NAME -output NAME.framework / NAME
  • Copia i file in Release-iphonesimulator / NAME.framework / Modules / NAME.swiftmodule su NAME.framework / Modules / NAME.swiftmodule (fino ad ora conteneva solo file dall'iPhone)

Crea una libreria grassa

Copia i file in sospeso

File copiati

3. Importare la libreria

Immagino che tu abbia già creato il progetto Binding in File -> Nuovo -> iOS -> Libreria di bind.

Supporto per Xamarin importando .frameworks. Basta fare clic destro 'Riferimenti nativi' e fare clic su 'Aggiungi riferimento nativo'. Trova il nuovo quadro grasso creato e aggiungilo.

Aggiungi riferimento nativo

Seleziona .framework

Riferimento

4. Creare l'ApiDefinition basato sul file LIBRARY-Swift.h all'interno delle intestazioni.

Puoi farlo manualmente, ma non sarà bello. Puoi usare Objetive Sharpie. Lo strumento usato da Xamarin per legare le proprie librerie.

Come usarlo su https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/

Il comando di base sarà qualcosa come: sharpie bind -sdk iphoneos9.3 NAME-Swift.h

Se ottieni System.Reflection.TargetInvocationException probabilmente è perché hai installato una versione diversa dell'SDK. Eseguire il seguente comando per verificare con iPhone OS SDK installato:

sharpie xcode -sdks

Il file NAME-Swift.h si trova in NAME.framework / Headers / NAME-Swift.h

Nota: le classi swift devono ereditare da "NSObject", altrimenti NAME-Swift.h non importerà le tue classi e Objetive Sharpie non convertirà nulla.

Sharpie

Sostituisci il contenuto del tuo progetto vincolante ApiDefinition.cs con quello appena creato. Sostituisci il contenuto del file

5. Cambia tutto [Protocollo] e [BaseType] per includere il nome della classe nel runtime Objective-C.

Nel caso in cui la classe o il protocollo Swift originale non includa l'annotazione @objc (MyClass) come specificato nel passaggio 1.1, i loro nomi Objective-C interni saranno modificati, quindi è necessario associarlo a quello giusto.

Tutti i nomi sono disponibili nel file NOME-Swift.h nel seguente formato:

SWIFT_CLASS("_TtC11SwiftSample7MyClass")
@interface MyClass : NSObject

E

SWIFT_PROTOCOL("_TtP6Charts17ChartDataProvider_")
@protocol ChartDataProvider

Per impostare il nome si utilizza BaseTypeAttribute.Name https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#BaseType.Name proprietà per le classi e ProcotolAttribute.Name https: // developer.xamarin.com/api/property/MonoTouch.Foundation.ProtocolAttribute.Name/ per i protocolli.

[BaseType(typeof(NSObject), Name = "_TtC11SwiftSample7MyClass")]
interface MyClass

Farlo manualmente non è bello. È possibile utilizzare questo strumento https://github.com/Flash3001/SwiftClassify per inserire tutti i nomi. (È un lavoro in corso, ma è abbastanza semplice, basta guardare il codice per capire come funziona).

6.1 Includere tutte le dipendenze Swift per l'esecuzione.

Se si tenta di utilizzare la libreria in un'app e provare a eseguirla in questo momento, si bloccherà. L'errore è dovuto alla mancanza di libswiftCore.dylib

Qualcosa come questo:

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 non fornisce supporto ufficiale per legare una libreria Swift. Quindi devi includere manualmente le librerie di base rapide nelle cartelle Frameworks e SwiftSupport. I file per la cartella Frameworks sono diversi per Simulator e Device. Possono essere trovati in /Applications/Xcode.app/Contents/Developer//XcodeDefault.xctoolchain/usr/lib/swift.Toolchains

Invece di copiare manualmente i file all'interno della cartella Framework è possibile utilizzare questa libreria https://github.com/Flash3001/Xamarin.Swift3.Support . Include ogni singola dipendenza di Swift 3.1, ognuna in un unico pacchetto NuGet.

Aggiungi il pacchetto NuGet

Come puoi vedere, il pacchetto Nuget è incluso nell'app consumer, non nell'associazione stessa. Se si tenta di includerlo nel binding, si otterranno errori di compilazione.

Se stai creando un pacchetto Nuget, puoi istruire Nuget a includerlo come dipendenza.

App in esecuzione

6.2. Scoprire quali dipendenze Swift includere.

Una cosa importante da fare è capire ogni pacchetto che devi includere nel tuo progetto. Di solito è necessario un legame semplice:

     libswiftCore.dylib
     libswiftCoreGraphics.dylib
     libswiftCoreImage.dylib
     libswiftDarwin.dylib
     libswiftDispatch.dylib
     libswiftFoundation.dylib
     libswiftObjectiveC.dylib
     libswiftQuartzCore.dylib
     libswiftUIKit.dylib   

Per elencare ciascuna dipendenza è possibile eseguire il seguente comando all'interno di LibraryName.framework

otool -l -arch armv7 LibraryName | grep libswift

Elenco delle dipendenze

Non includere tutti i pacchetti disponibili in NuGet per Swift3 in quanto potrebbero aumentare le dimensioni dell'app.

7. Includere SwiftSupport per spingere App in AppStore.

Apple richiede che l'app venga inviata con una cartella SwiftSupport accanto alla cartella Payload. Entrambi sono all'interno del tuo pacchetto IPA.

Puoi usare questo script https://github.com/bq/ipa-packager per fare questo lavoro per te.

Questo processo è l'unico che il consumatore della biblioteca dovrà fare manualmente. Ogni volta che tenta di spingere l'app in App Store.

Archivio per la pubblicazione

Fare clic su "Firma e distribuisci" e Salva su disco Iscriviti e distribuisci

Decomprimi il tuo .IPA Unzip

Crea il nuovo IPA usando lo script prima menzionato Nuova API

Se decidi di decomprimere il file, conterrà la cartella SwiftSupport. inserisci la descrizione dell'immagine qui

Osservazioni

Quando si costruisce una libreria in Xcode, ha un'opzione per includere le librerie swift. Non farlo! Verranno inclusi nell'app finale come NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib ma devono essere inclusi come NAME.app/Frameworks/libswift*.dylib

Puoi trovare queste informazioni altrove, ma vale la pena menzionare: Non includere Bitcode nella libreria. A partire da ora Xamarin non include Bitcode per iOS e Apple richiede che tutte le librerie supportino le stesse architetture.

disconoscimento

Questa guida è stata originariamente creata da Lucas Teixeira . Tutti i crediti appartengono a lui. Grazie, Lucas.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow