Xamarin.iOS
Binden Sie schnelle Bibliotheken
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
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.
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.
- Eine schnelle Klasse muss von NSObject erben, um gebunden zu werden.
- 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.
- Zur Laufzeit muss Ihre APP neben Ihrem gebundenen Framework einige schnelle Kernbibliotheken in einem Ordner namens Frameworks enthalten.
- 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 *
Zur Veröffentlichung für Gerät und Simulator vorgesehen. *
- 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).
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.
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.
Ersetzen Sie den Inhalt Ihres Bindungsprojekts ApiDefinition.cs durch das neu erstellte.
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.
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.
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
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.
Klicken Sie auf "Signieren und Verteilen" und auf Festplatte speichern
Erstellen Sie den neuen IPA mit dem zuvor genannten Skript
Wenn Sie die Datei entpacken, wird sie den SwiftSupport-Ordner enthalten.
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.