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

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

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

  1. En snabb klass måste ärva från NSObject för att bindas.
  2. 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.
  3. Under runtime måste din APP innehålla några snabba kärnbibliotek längs din bundna ram i en mapp som heter Frameworks;
  4. 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. *

Inaktivera bitkod

Bygg för release för Device and Simulator. * Ställ in det som utgåva i Xcode-scheman Bygg för enhet

Bygg för simulator

Hitta ramar

ramar

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

Skapa fettbibliotek

Kopiera väntande filer

Filer kopierade

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.

Lägg till Native Reference

Välj .framework

Referens

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.

tuschpenna

Byt ut innehållet i ditt bindande projekt ApiDefinition.cs med det nyligen skapade. Byt ut filinnehållet

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.

Lägg till 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.

App kör

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

Lista beroenden

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.

Arkiv för publicering

Klicka på "Signera och distribuera" och spara på disken Signera och distribuera

Packa upp din .IPA Packa upp

Skapa den nya IPA med skriptet som nämnts tidigare Nytt API

Om du packar upp filen vet den, kommer den att innehålla mappen SwiftSupport. ange bildbeskrivning här

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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow