Suche…


Einführung

Eine einfach zu befolgende Anleitung, die Sie durch den Prozess der Bindung von Swift .framework-Dateien für die Verwendung in einem Xamarin-Projekt führt.

Bemerkungen

  1. Wenn Sie eine Bibliothek in Xcode erstellen, haben Sie die Möglichkeit, die schnellen Bibliotheken einzubinden. Nicht! Sie werden in Ihre endgültige App als NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib aufgenommen, müssen jedoch als NAME.app/Frameworks/libswift*.dylib enthalten sein

  2. Sie finden diese Informationen an anderer Stelle, aber es ist erwähnenswert: Fügen Sie Bitcode nicht in die Bibliothek ein. Im Moment enthält Xamarin Bitcode für iOS nicht und Apple erfordert, dass alle Bibliotheken die gleichen Architekturen unterstützen.

Binden einer schnellen Bibliothek in Xamarin.iOS

Das Binden einer schnellen Bibliothek in Xamarin.iOS erfolgt für Objective-C auf dieselbe Weise wie in https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/ beschrieben , jedoch mit einigen Vorbehalten.

  1. Eine schnelle Klasse muss von NSObject erben, um gebunden zu werden.
  2. Der Swift-Compiler übersetzt Klassen- und Protokollnamen in etwas anderes, sofern Sie nicht die @objc- Annotation (z. B. @objc (MyClass)) in Ihren Swift-Klassen verwenden, um den expliziten Ziel-c-Namen anzugeben.
  3. Zur Laufzeit muss Ihre APP neben Ihrem gebundenen Framework einige schnelle Kernbibliotheken in einem Ordner namens Frameworks enthalten.
  4. Wenn die App in AppStore gepusht wird, muss sie neben Ihrem Payload-Ordner einen SwiftSupport-Ordner enthalten. Diese befinden sich in der IPA-Datei.

Hier finden Sie eine einfache Musterbindung: https://github.com/Flash3001/Xamarin.BindingSwiftLibrarySample

Und ein vollständiges Bindungsbeispiel: https://github.com/Flash3001/iOSCharts.Xamarin

Schritte finden Sie unten:

1.1 Bereiten Sie die Swift-Klassen vor, die Sie exportieren möchten

Für jede Swift-Klasse, die Sie verwenden möchten, müssen Sie entweder von NSObject erben und den Objective-C-Namen mithilfe der objc-Annotation explizit machen. Andernfalls generiert der Swift-Compiler andere Namen. Unten ist ein Beispielcode, wie eine Swift-Klasse aussehen könnte. Beachten Sie, dass es egal ist, welche Klasse er übernimmt, solange die Stammklasse von NSObject erbt.

//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 Bauen Sie den Rahmen auf

Bitcode deaktivieren *

Bitcode deaktivieren

Zur Veröffentlichung für Gerät und Simulator vorgesehen. * Legen Sie es in Xcode Schemes als Freigabe fest Bauen für Gerät

Build für Simulator

Finde Frameworks

Frameworks

  • Nicht nur mit Swift-Bindung verbunden.

2. Erstellen Sie eine Fettbibliothek

Ein Framework enthält mehrere Dateien. Diejenige, die etwas essen muss, ist NAME.framework / NAME (ohne Erweiterung).

  • Kopieren Sie Release-iphoneos / NAME.framework in NAME.framework
  • Erstellen Sie die FAT-Bibliothek mit:
    • lipo -create Release-iphonesimulator / NAME.framework / NAME Release-iphoneos / NAME.framework / NAME -out NAME.framework / NAME
  • Kopieren Sie die Dateien unter Release-iphonesimulator / NAME.framework / Modules / NAME.swiftmodule in NAME.framework / Modules / NAME.swiftmodule (bisher enthielten sie nur Dateien aus dem iphoneos).

Erstellen Sie eine fette Bibliothek

Kopieren Sie ausstehende Dateien

Dateien kopiert

3. Importieren Sie die Bibliothek

Ich gehe davon aus, dass Sie das Bindungsprojekt bereits in Datei -> Neu -> iOS -> Bindungsbibliothek erstellt haben.

Xamarin unterstützt den Import von .frameworks. Klicken Sie einfach mit der rechten Maustaste auf "Native References" und klicken Sie auf "Native Reference hinzufügen". Finden Sie das neu erstellte Fat Framework und fügen Sie es hinzu.

Native Referenz hinzufügen

Wählen Sie .framework aus

Referenz

4. Erstellen Sie die ApiDefinition basierend auf der Datei LIBRARY-Swift.h in den Kopfzeilen.

Sie können es manuell tun, aber es ist nicht schön. Sie können Objetive Sharpie verwenden. Das Tool, mit dem Xamarin seine eigenen Bibliotheken bindet.

Verwendung unter https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/

Der Basisbefehl lautet etwa: sharpie bind -sdk iphoneos9.3 NAME-Swift.h

Wenn Sie eine System.Reflection.TargetInvocationException , liegt dies wahrscheinlich daran, dass Sie eine andere SDK-Version installiert haben. Führen Sie den folgenden Befehl aus, um das installierte iPhone OS SDK zu überprüfen:

sharpie xcode -sdks

Die Datei NAME-Swift.h befindet sich in NAME.framework / Headers / NAME-Swift.h

Hinweis: Die schnellen Klassen müssen von "NSObject" erben. Andernfalls importiert NAME-Swift.h Ihre Klassen nicht und Objetive Sharpie konvertiert nichts.

Sharpie

Ersetzen Sie den Inhalt Ihres Bindungsprojekts ApiDefinition.cs durch das neu erstellte. Ersetzen Sie den Inhalt der Datei

5. Ändern Sie alle [Protocol] und [BaseType], um den Klassennamen in die Objective-C-Laufzeit aufzunehmen.

Wenn die ursprüngliche Swift-Klasse oder das ursprüngliche Protokoll nicht die @objc-Annotation (MyClass) wie in Schritt 1.1 angegeben enthält, werden die internen Objective-C-Namen geändert. Sie müssen also die richtige Zuordnung vornehmen.

Alle Namen sind in der Datei NAME-Swift.h im folgenden Format verfügbar:

SWIFT_CLASS("_TtC11SwiftSample7MyClass")
@interface MyClass : NSObject

Und

SWIFT_PROTOCOL("_TtP6Charts17ChartDataProvider_")
@protocol ChartDataProvider

Um den Namen festzulegen, verwenden Sie BaseTypeAttribute.Name https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#BaseType.Name-Eigenschaft für Klassen und ProcotolAttribute.Name https: // developer.xamarin.com/api/property/MonoTouch.Foundation.ProtocolAttribute.Name/ für Protokolle.

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

Manuell zu tun ist nicht cool. Sie können dieses Tool https://github.com/Flash3001/SwiftClassify verwenden , um alle Namen einzufügen. (Es wird gerade gearbeitet. Aber es ist ziemlich einfach, wenn Sie sich nur den Code ansehen, erfahren Sie, wie er funktioniert.)

6.1 Alle Swift-Abhängigkeiten einschließen.

Wenn Sie versuchen, die Bibliothek in einer App zu verbrauchen und sie sofort auszuführen, stürzt sie ab. Der Fehler ist auf das Fehlen von libswiftCore.dylib zurückzuführen

Etwas wie das:

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 unterstützt die Bindung einer Swift-Bibliothek nicht offiziell. Daher müssen Sie die schnellen Kernbibliotheken manuell in die Ordner Frameworks und SwiftSupport aufnehmen. Die Dateien für den Ordner "Frameworks" unterscheiden sich für Simulator und Gerät. Sie können in /Applications/Xcode.app/Contents/Developer//XcodeDefault.xctoolchain/usr/lib/swift.Toolchains gefunden werden

Anstatt die Dateien innerhalb des Framework-Ordners manuell zu kopieren, können Sie die Bibliothek https://github.com/Flash3001/Xamarin.Swift3.Support verwenden . Es enthält alle Abhängigkeiten, die Swift 3.1 benötigt, und jede in einem einzigen NuGet-Paket.

Fügen Sie das NuGet-Paket hinzu

Wie Sie sehen, ist das Nuget-Paket in der Consumer-App enthalten, nicht in der Bindung selbst. Wenn Sie versuchen, es in die Bindung einzubinden, werden Kompilierungsfehler angezeigt.

Wenn Sie ein Nuget-Paket erstellen, können Sie Nuget anweisen, es als Abhängigkeit hinzuzufügen.

App läuft

6.2. Herausfinden, welche Swift-Abhängigkeiten enthalten sind.

Es ist wichtig, jedes Paket herauszufinden, das Sie in Ihr Projekt aufnehmen müssen. Eine einfache Bindung benötigt normalerweise:

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

Um jede Abhängigkeit aufzulisten, können Sie den folgenden Befehl in Ihrem LibraryName.framework ausführen

otool -l -arch armv7 LibraryName | grep libswift

Abhängigkeiten auflisten

Schließen Sie nicht jedes Paket ein, das in NuGet für Swift3 verfügbar ist, da dies Ihre App-Größe erhöhen könnte.

7. Fügen Sie SwiftSupport hinzu, um die App in den AppStore zu verschieben.

Apple verlangt, dass Ihre App zusammen mit Ihrem Payload-Ordner mit einem SwiftSupport-Ordner gesendet wird. Beide befinden sich in Ihrem IPA-Paket.

Sie können dieses Skript https://github.com/bq/ipa-packager verwenden , um diese Arbeit für Sie auszuführen.

Dieser Prozess ist der einzige, den der Konsument der Bibliothek manuell durchführen muss. Jedes Mal, wenn er versucht, die App in den AppStore zu verschieben.

Archiv für die Veröffentlichung

Klicken Sie auf "Signieren und Verteilen" und auf Festplatte speichern Unterschreiben und verteilen

Entpacken Sie Ihre .IPA Entpacken

Erstellen Sie den neuen IPA mit dem zuvor genannten Skript Neue API

Wenn Sie die Datei entpacken, wird sie den SwiftSupport-Ordner enthalten. Geben Sie hier die Bildbeschreibung ein

Bemerkungen

Wenn Sie eine Bibliothek in Xcode erstellen, haben Sie die Möglichkeit, die schnellen Bibliotheken einzubinden. Nicht! Sie werden in Ihre endgültige App als NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib aufgenommen, müssen jedoch als NAME.app/Frameworks/libswift*.dylib enthalten sein

Sie finden diese Informationen an anderer Stelle, aber es ist erwähnenswert: Fügen Sie Bitcode nicht in die Bibliothek ein. Im Moment enthält Xamarin Bitcode für iOS nicht und Apple erfordert, dass alle Bibliotheken die gleichen Architekturen unterstützen.

Haftungsausschluss

Dieses Handbuch wurde ursprünglich von Lucas Teixeira erstellt . Alle Credits gehören ihm. Vielen Dank, Lucas.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow