Xamarin.iOS
Librerie Swift vincolanti
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
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.
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.
- Una classe rapida deve ereditare da NSObject per essere associata.
- 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.
- In runtime la tua APP deve includere alcune librerie di base rapide accanto al tuo framework binded in una cartella chiamata Frameworks;
- 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. *
Crea per il rilascio per Device and Simulator. *
- 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)
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.
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.
Sostituisci il contenuto del tuo progetto vincolante ApiDefinition.cs con quello appena creato.
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.
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.
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
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.
Fare clic su "Firma e distribuisci" e Salva su disco
Crea il nuovo IPA usando lo script prima menzionato
Se decidi di decomprimere il file, conterrà la cartella SwiftSupport.
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.