Xamarin.iOS
Bindande snabba bibliotek
Sök…
Introduktion
En lätt att följa guide som leder dig genom processen att binda Swift .framework-filer för användning i ett Xamarin-projekt.
Anmärkningar
När du bygger ett bibliotek i Xcode har det ett alternativ att inkludera snabba bibliotek. Gör det inte! De kommer att inkluderas i din slutliga app som NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib men de måste inkluderas som NAME.app/Frameworks/libswift*.dylib
Du kan hitta den här informationen någon annanstans, men det är värt att nämna: Ta inte med bitkod i biblioteket. Just nu inkluderar Xamarin inte Bitcode för iOS och Apple kräver att alla bibliotek stöder samma arkitekturer.
Binding a Swift Library i Xamarin.iOS
Binding a Swift Library i Xamarin.iOS följer samma process för Objekt-C som visas på https://developer.xamarin.com/guides/ios/advanced_topics/binding_objekt-c/ , men med vissa varningar.
- En snabb klass måste ärva från NSObject för att bindas.
- Swift-kompilator översätter klass- och protokollnamn till något annat om du inte använder @objc- anteckningen (t.ex. @objc (MyClass)) i dina snabba klasser för att ange det uttryckliga objektiva c-namnet.
- Under runtime måste din APP innehålla några snabba kärnbibliotek längs din bundna ram i en mapp som heter Frameworks;
- När appen skjuts till AppStore måste den inkludera en SwiftSupport-mapp längs med din nyttolastmapp. De finns i IPA-filen.
Här kan du hitta en enkel provbindning: https://github.com/Flash3001/Xamarin.BindingSwiftLibrarySample
Och ett fullständigt bindande prov: https://github.com/Flash3001/iOSCharts.Xamarin
Vänligen hitta stegen nedan:
1.1 Förbered de Swift-klasser som du vill exportera
För alla Swift-klasser du vill använda måste du antingen ärva från NSObject och göra Objekt-C-namnet uttryckligt med hjälp av objc-anteckningen. Annars genererar Swift-kompilatorn olika namn. Nedan följer ett exempel på hur en Swift-klass kan se ut. Observera att det spelar ingen roll vilken klass den ärver så länge rotklassen ärver från 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 Bygg ramverket
Inaktivera bitkod. *
Bygg för release för Device and Simulator. *
- Inte relaterat endast till Swift-bindning.
2. Skapa ett fettbibliotek
Ett ramverk innehåller flera filer, den som behöver äta lite är NAME.framework / NAME (utan förlängning).
- Kopiera Release-iphoneos / NAME.framework till NAME.framework
- Skapa FAT-biblioteket med:
- lipo-skapa Release-iphonesimulator / NAME.framework / NAME Release-iphoneos / NAME.framework / NAME -output NAME.framework / NAME
- Kopiera filerna i Release-iphonesimulator / NAME.framework / Modules / NAME.swiftmodule till NAME.framework / Modules / NAME.swiftmodule (fram till nu innehöll den bara filer från iphoneos)
3. Importera biblioteket
Jag antar att du redan har skapat bindande projektet i File -> New -> iOS -> Binding Library.
Xamarin stödjer import .frameworks. Högerklicka bara på "Naturliga referenser" och klicka på "Lägg till referens". Hitta det nyskapade fettramverket och lägg till det.
4. Skapa ApiDefinition baserat på LIBRARY-Swift.h-filen inuti rubriker.
Du kan göra det manuellt, men det kommer inte att vara trevligt. Du kan använda Objetive Sharpie. Verktyget Xamarin använder för att binda sina egna bibliotek.
Hur man använder det på https://developer.xamarin.com/guides/cross-platform/macios/binding/objekt-sharpie/
Det grundläggande kommandot kommer att vara något liknande: Sharpie bind -sdk iphoneos9.3 NAME-Swift.h
Om du får en System.Reflection.TargetInvocationException
det antagligen på att du har en annan SDK-version installerad. Kör följande kommando för att kontrollera med iPhone OS SDK som du har installerat:
sharpie xcode -sdks
Filen NAME-Swift.h finns i NAME.framework / Headers / NAME-Swift.h
Obs: De snabba klasserna måste ärva från "NSObject", annars importerar inte NAME-Swift.h dina klasser och Objetive Sharpie konverterar ingenting.
Byt ut innehållet i ditt bindande projekt ApiDefinition.cs med det nyligen skapade.
5. Ändra alla [Protokoll] och [BaseType] för att inkludera klassens namn i Objekt-C runtime.
Om den ursprungliga Swift-klassen eller protokollet inte inkluderar @objc (MyClass) -anteckningen som anges i steg 1.1 kommer de att ändra sina interna Objekt-C-namn, så du måste kartlägga den till rätt.
Alla namn är tillgängliga i filen NAME-Swift.h i följande format:
SWIFT_CLASS("_TtC11SwiftSample7MyClass")
@interface MyClass : NSObject
Och
SWIFT_PROTOCOL("_TtP6Charts17ChartDataProvider_")
@protocol ChartDataProvider
För att ställa in namnet använder du BaseTypeAttribute.Name https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#BaseType.Name-egenskapen för klasser och ProcotolAttribute.Name https: // Developer.xamarin.com/api/property/MonoTouch.Foundation.ProtocolAttribute.Name/ för protokoll.
[BaseType(typeof(NSObject), Name = "_TtC11SwiftSample7MyClass")]
interface MyClass
Att göra det manuellt är inte coolt. Du kan använda det här verktyget https://github.com/Flash3001/SwiftClassify för att infoga alla namn. (Det pågår arbete. Men det är ganska enkelt, bara genom att titta på koden får du hur det fungerar).
6.1 Inkludera alla snabba beroenden som ska köras.
Om du försöker konsumera biblioteket i en app och försöker köra det just nu kommer det att krascha. Felet beror på bristen på libswiftCore.dylib
Något som det här:
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 ger inte officiellt stöd för att binda ett Swift-bibliotek. Så du måste manuellt inkludera de snabba kärnbiblioteken i mapparna Frameworks och SwiftSupport. Filerna för mappen Frameworks är olika för simulator och enhet. De kan hittas i /Applications/Xcode.app/Contents/Developer //XcodeDefault.xctoolchain/usr/lib/swift.Toolchains
Istället för att manuellt kopiera filerna i rammappen kan du använda detta bibliotek https://github.com/Flash3001/Xamarin.Swift3.Support . Det inkluderar varje enskilt beroende som Swift 3.1 behöver, var och en i ett enda NuGet-paket.
Som ni kan se ingår Nuget-paketet i konsument-appen, inte i bindningen. Om du försöker inkludera det i bindningen får du sammanställningsfel.
Om du bygger ett Nuget-paket kan du instruera Nuget att inkludera det som ett beroende.
6,2. Ta reda på vilka Swift-beroenden som ska inkluderas.
En viktig sak att göra är att ta reda på varje paket du behöver inkludera i ditt projekt. En enkel bindning behöver vanligtvis:
libswiftCore.dylib
libswiftCoreGraphics.dylib
libswiftCoreImage.dylib
libswiftDarwin.dylib
libswiftDispatch.dylib
libswiftFoundation.dylib
libswiftObjectiveC.dylib
libswiftQuartzCore.dylib
libswiftUIKit.dylib
För att lista varje beroende kan du köra följande kommando i ditt LibraryName.framework
otool -l -arch armv7 LibraryName | grep libswift
Ta inte med alla paket som finns tillgängliga i NuGet för Swift3 eftersom de kan öka din appstorlek.
7. Inkludera SwiftSupport för att driva App till AppStore.
Apple kräver att din app skickas med en SwiftSupport-mapp tillsammans med din Payload-mapp. Båda finns i ditt IPA-paket.
Du kan använda detta skript https://github.com/bq/ipa-packager för att göra det här arbetet åt dig.
Denna process är den enda bibliotekskonsumenten måste göra manuellt. Varje gång han / hon försöker driva appen till AppStore.
Klicka på "Signera och distribuera" och spara på disken
Skapa den nya IPA med skriptet som nämnts tidigare
Om du packar upp filen vet den, kommer den att innehålla mappen SwiftSupport.
Anmärkningar
När du bygger ett bibliotek i Xcode har det ett alternativ att inkludera snabba bibliotek. Gör det inte! De kommer att inkluderas i din slutliga app som NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib men de måste inkluderas som NAME.app/Frameworks/libswift*.dylib
Du kan hitta den här informationen någon annanstans, men det är värt att nämna: Ta inte med bitkod i biblioteket. Just nu inkluderar Xamarin inte Bitcode för iOS och Apple kräver att alla bibliotek stöder samma arkitekturer.
varning
Denna guide är ursprungligen skapad av Lucas Teixeira . Alla poäng tillhör honom. Tack, Lucas.