Szukaj…


Wprowadzenie

Łatwy do naśladowania przewodnik, który poprowadzi Cię przez proces wiązania plików Swift .framework do użytku w projekcie Xamarin.

Uwagi

  1. Podczas budowania biblioteki w Xcode istnieje możliwość włączenia szybkich bibliotek. Nie! Zostaną one uwzględnione w Twojej ostatecznej aplikacji jako NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib, ale muszą być uwzględnione jako NAME.app/Frameworks/libswift*.dylib

  2. Możesz znaleźć te informacje gdzie indziej, ale warto wspomnieć: Nie dołączaj kodu bitowego do biblioteki. W tej chwili Xamarin nie zawiera kodu bitowego dla iOS, a Apple wymaga, aby wszystkie biblioteki obsługiwały te same architektury.

Wiązanie szybkiej biblioteki w Xamarin.iOS

Wiązanie biblioteki Swift w Xamarin.iOS odbywa się w taki sam sposób dla Objective-C, jak pokazano w https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/ , ale z pewnymi zastrzeżeniami.

  1. Szybka klasa musi dziedziczyć po NSObject, aby mogła zostać powiązana.
  2. Kompilator Swift przetłumaczy nazwy klas i protokołów na coś innego, chyba że użyjesz adnotacji @objc (np. @Objc (MyClass)) w swoich klasach swift, aby określić jawną nazwę celu c.
  3. W środowisku wykonawczym aplikacja musi zawierać kilka szybkich bibliotek podstawowych obok powiązanego frameworka w folderze o nazwie Frameworki;
  4. Gdy aplikacja jest przekazywana do AppStore, musi zawierać folder SwiftSupport obok folderu ładunku. Są w pliku IPA.

Tutaj możesz znaleźć proste przykładowe powiązanie: https://github.com/Flash3001/Xamarin.BindingSwiftLibrarySample

I pełna wiążąca próbka: https://github.com/Flash3001/iOSCharts.Xamarin

Poniżej znajdziesz kroki:

1.1 Przygotuj klasy Swift, które chcesz wyeksportować

Dla każdej klasy Swift, której chcesz użyć, musisz odziedziczyć po NSObject i wyraźnie nadać nazwę Objective-C za pomocą adnotacji objc. W przeciwnym razie kompilator Swift wygeneruje inne nazwy. Poniżej znajduje się przykładowy kod tego, jak mogłaby wyglądać klasa Swift. Zauważ, że nie ma znaczenia, którą klasę dziedziczy, o ile klasa główna dziedziczy po 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 Zbuduj strukturę

Wyłącz kod bitowy. *

Wyłącz kod bitowy

Kompilacja do wydania dla urządzenia i symulatora. * Ustaw jako wersję w schematach Xcode Kompilacja dla urządzenia

Kompilacja dla symulatora

Znajdź ramy

Ramy

  • Nie dotyczy tylko wiązania Swift.

2. Utwórz grubą bibliotekę

Framework zawiera kilka plików, tym, który musi trochę zjeść jest NAME.framework / NAME (bez rozszerzenia).

  • Skopiuj Release-iphoneos / NAME.framework do NAME.framework
  • Utwórz bibliotekę FAT, używając:
    • lipo -tworzenie Release-iphonesimulator / NAME.framework / NAME Release-iphoneos / NAME.framework / NAME -output NAME.framework / NAME
  • Skopiuj pliki z Release-iphonesimulator / NAME.framework / Modules / NAME.swiftmodule do NAME.framework / Modules / NAME.swiftmodule (do tej pory zawierał tylko pliki z iPhoneos)

Utwórz grubą bibliotekę

Skopiuj oczekujące pliki

Pliki zostały skopiowane

3. Zaimportuj bibliotekę

Zakładam, że już utworzyłeś projekt Binding w Plik -> Nowy -> iOS -> Binding Library.

Obsługa Xamarin importowania .frameworks. Wystarczy kliknąć prawym przyciskiem myszy „Natywne odniesienia” i kliknąć „Dodaj natywne odniesienie”. Znajdź nowo utworzony szkielet tłuszczu i dodaj go.

Dodaj natywne odniesienie

Wybierz .framework

Odniesienie

4. Utwórz ApiDefinition na podstawie pliku LIBRARY-Swift.h w nagłówkach.

Możesz to zrobić ręcznie, ale to nie będzie miłe. Możesz użyć Objetive Sharpie. Narzędzie Xamarin używa do wiązania własnych bibliotek.

Jak go używać na https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/

Podstawowe polecenie będzie wyglądało tak: sharpie bind -sdk iphoneos9.3 NAME-Swift.h

Jeśli pojawi się System.Reflection.TargetInvocationException , prawdopodobnie wynika to z zainstalowanej innej wersji zestawu SDK. Uruchom następujące polecenie, aby sprawdzić z zainstalowanym zestawem SDK systemu iPhone OS:

sharpie xcode -sdks

Plik NAME-Swift.h znajduje się w NAME.framework / Headers / NAME-Swift.h

Uwaga: klasy szybkie muszą dziedziczyć po „NSObject”, w przeciwnym razie NAME-Swift.h nie zaimportuje twoich klas, a Objetive Sharpie niczego nie skonwertuje.

Sharpie

Zamień zawartość wiążącego projektu ApiDefinition.cs na nowo utworzony. Zamień zawartość pliku

5. Zmień wszystkie [Protokół] i [BaseType], aby uwzględnić nazwę klasy w środowisku wykonawczym Objective-C.

W przypadku, gdy oryginalna klasa lub protokół Swift nie zawiera adnotacji @objc (MyClass), jak określono w kroku 1.1, zmienione zostaną jej wewnętrzne nazwy Objective-C, więc musisz zmapować ją na właściwą.

Wszystkie nazwy są dostępne w pliku NAME-Swift.h w następującym formacie:

SWIFT_CLASS("_TtC11SwiftSample7MyClass")
@interface MyClass : NSObject

I

SWIFT_PROTOCOL("_TtP6Charts17ChartDataProvider_")
@protocol ChartDataProvider

Aby ustawić nazwę, użyj właściwości BaseTypeAttribute.Name https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#BaseType.Name właściwość dla klas i ProcotolAttribute.Name https: // developer.xamarin.com/api/property/MonoTouch.Foundation.ProtocolAttribute.Name/ dla protokołów.

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

Robienie tego ręcznie nie jest fajne. Możesz użyć tego narzędzia https://github.com/Flash3001/SwiftClassify, aby wstawić wszystkie nazwy. (To praca w toku. Ale to dość proste, wystarczy spojrzeć na kod, aby dowiedzieć się, jak to działa).

6.1 Uwzględnij wszystkie zależności Swift do uruchomienia.

Jeśli spróbujesz użyć biblioteki w aplikacji i spróbujesz ją teraz uruchomić, nastąpi awaria. Błąd wynika z braku libswiftCore.dylib

Coś takiego:

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 nie zapewnia oficjalnego wsparcia dla wiązania biblioteki Swift. Musisz więc ręcznie włączyć szybkie biblioteki podstawowe w folderach Frameworks i SwiftSupport. Pliki do folderu Frameworks są różne dla Simulator i Device. Można je znaleźć w /Applications/Xcode.app/Contents/Developer//XcodeDefault.xctoolchain/usr/lib/swift.Toolchains

Zamiast ręcznie kopiować pliki w folderze Framework, możesz użyć tej biblioteki https://github.com/Flash3001/Xamarin.Swift3.Support . Obejmuje każdą potrzebną zależność Swift 3.1, każdą w jednym pakiecie NuGet.

Dodaj pakiet NuGet

Jak widać, pakiet Nuget jest zawarty w aplikacji konsumenckiej, a nie w samym powiązaniu. Jeśli spróbujesz dołączyć go do powiązania, otrzymasz błędy kompilacji.

Jeśli budujesz pakiet Nuget, możesz poinstruować Nuget, aby uwzględnił go jako zależność.

Aplikacja działa

6.2 Dowiedz się, które zależności Swift należy uwzględnić.

Ważną rzeczą do zrobienia jest ustalenie każdego pakietu, który musisz uwzględnić w swoim projekcie. Proste wiązanie zwykle wymaga:

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

Aby wyświetlić listę każdej zależności, możesz uruchomić następujące polecenie w pliku LibraryName.framework

otool -l -arch armv7 LibraryName | grep libswift

Lista zależności

Nie dołączaj wszystkich pakietów dostępnych w NuGet dla Swift3, ponieważ mogą one zwiększyć rozmiar Twojej aplikacji.

7. Dołącz SwiftSupport, aby wypchnąć aplikację do AppStore.

Apple wymaga wysłania aplikacji z folderem SwiftSupport obok folderu Payload. Oba są w pakiecie IPA.

Możesz użyć tego skryptu https://github.com/bq/ipa-packager, aby wykonać tę pracę za Ciebie.

Ten proces jest jedynym, który konsument biblioteki będzie musiał wykonać ręcznie. Za każdym razem, gdy próbuje przekazać aplikację do AppStore.

Archiwum do publikacji

Kliknij „Podpisz i rozpowszechnij” i Zapisz na dysku Podpisuj i rozpowszechniaj

Rozpakuj .IPA Rozsunąć suwak

Utwórz nowy IPA za pomocą skryptu wcześniej wspomnianego Nowe API

Jeśli rozpakujesz plik, będzie on zawierał folder SwiftSupport. wprowadź opis zdjęcia tutaj

Uwagi

Podczas budowania biblioteki w Xcode istnieje możliwość włączenia szybkich bibliotek. Nie! Zostaną one uwzględnione w Twojej ostatecznej aplikacji jako NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib, ale muszą być uwzględnione jako NAME.app/Frameworks/libswift*.dylib

Możesz znaleźć te informacje gdzie indziej, ale warto wspomnieć: Nie dołączaj kodu bitowego do biblioteki. W tej chwili Xamarin nie zawiera kodu bitowego dla iOS, a Apple wymaga, aby wszystkie biblioteki obsługiwały te same architektury.

Zrzeczenie się

Ten przewodnik został pierwotnie stworzony przez Lucas Teixeira . Wszystkie kredyty należą do niego. Dziękuję, Lucas.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow