Xamarin.iOS
Связывание скоростных библиотек
Поиск…
Вступление
Легко следовать руководству, которое приведет вас к процессу связывания файлов Swift .framework для использования в проекте Xamarin.
замечания
При создании библиотеки в Xcode у нее есть возможность включить быстрые библиотеки. Не надо! Они будут включены в ваше окончательное приложение как NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib, но они должны быть включены как NAME.app/Frameworks/libswift*.dylib
Вы можете найти эту информацию в другом месте, но стоит упомянуть: не включать Bitcode в библиотеку. На данный момент Xamarin не включает Bitcode для iOS, и Apple требует, чтобы все библиотеки поддерживали одни и те же архитектуры.
Связывание быстрой библиотеки в Xamarin.iOS
Связывание быстрой библиотеки в Xamarin.iOS следует тому же процессу для Objective-C, как показано на https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/ , но с некоторыми оговорками.
- Быстрый класс должен наследовать от NSObject, который должен быть привязан.
- Компилятор Swift будет переводить имена классов и протоколов во что-то другое, если вы не используете аннотацию @objc (например, @objc (MyClass)) в своих быстрых классах, чтобы указать явное имя цели c.
- Во время выполнения ваш APP должен включать некоторые быстрые основные библиотеки вместе с вашей привязанной инфраструктурой в папке под названием Frameworks;
- Когда приложение загружается в AppStore, оно должно содержать папку SwiftSupport вместе с папкой «Полезная нагрузка». Они находятся внутри файла IPA.
Здесь вы можете найти простой пример привязки: https://github.com/Flash3001/Xamarin.BindingSwiftLibrarySample
И полный пример привязки: https://github.com/Flash3001/iOSCharts.Xamarin
Ниже приведены шаги:
1.1. Подготовьте классы Swift, которые хотите экспортировать.
Для любого класса Swift, который вы хотите использовать, вам нужно либо наследовать из NSObject, либо сделать имя Objective-C явным, используя аннотацию objc. В противном случае компилятор Swift будет генерировать разные имена. Ниже приведен пример кода, как выглядит класс Swift. Обратите внимание, что не имеет значения, какой класс он наследует, если корневой класс наследуется от 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 Построение структуры
Отключить биткод. *
Сборка для выпуска для устройства и симулятора. *
- Не относится только к привязке Swift.
2. Создайте жировую библиотеку
Рамка содержит несколько файлов, один из которых нужно немного поесть - NAME.framework / NAME (без расширения).
- Копировать релиз-iphoneos / NAME.framework в NAME.framework
- Создайте библиотеку FAT, используя:
- lipo -create Release-iphonesimulator / NAME.framework / NAME Release-iphoneos / NAME.framework / NAME -output NAME.framework / NAME
- Скопируйте файлы в Release-iphonesimulator / NAME.framework / Modules / NAME.swiftmodule в NAME.framework / Modules / NAME.swiftmodule (до сих пор он содержал только файлы из iphoneos)
3. Импортируйте библиотеку
Предположим, вы уже создали проект Binding в File -> New -> iOS -> Binding Library.
Поддержка Xamarin по импорту .frameworks. Просто щелкните правой кнопкой мыши «Родные ссылки» и нажмите «Добавить собственную ссылку». Найдите новую структуру жира и добавьте ее.
4. Создайте ApiDefinition на основе файла LIBRARY-Swift.h внутри заголовков.
Вы можете сделать это вручную, но это будет нехорошо. Вы можете использовать Objetive Sharpie. Инструмент Xamarin использует для связывания своих собственных библиотек.
Как использовать его на https://developer.xamarin.com/guides/cross-platform/macios/binding/objective-sharpie/
Основная команда будет выглядеть примерно так: sharpie bind -sdk iphoneos9.3 NAME-Swift.h
Если вы получаете System.Reflection.TargetInvocationException
это, вероятно, потому, что у вас установлена другая версия SDK. Выполните следующую команду для проверки с установленным вами SDK iPhone OS:
sharpie xcode -sdks
Файл NAME-Swift.h находится в NAME.framework / Headers / NAME-Swift.h
Примечание. Быстрые классы должны унаследовать от «NSObject», иначе NAME-Swift.h не будет импортировать ваши классы, а Objetive Sharpie ничего не преобразит.
Замените содержимое вашего проекта привязки ApiDefinition.cs новым созданным.
5. Измените все [Protocol] и [BaseType], чтобы включить имя класса в среду выполнения Objective-C.
Если исходный класс или протокол Swift не содержит аннотацию @objc (MyClass), как указано в шаге 1.1, они будут иметь свои внутренние имена Objective-C, поэтому вам нужно будет сопоставить их с правильными.
Все имена доступны в файле NAME-Swift.h в следующем формате:
SWIFT_CLASS("_TtC11SwiftSample7MyClass")
@interface MyClass : NSObject
А также
SWIFT_PROTOCOL("_TtP6Charts17ChartDataProvider_")
@protocol ChartDataProvider
Чтобы установить имя, вы используете свойство BaseTypeAttribute.Name https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#BaseType.Name для классов и ProcotolAttribute.Name https: // developer.xamarin.com/api/property/MonoTouch.Foundation.ProtocolAttribute.Name/ для протоколов.
[BaseType(typeof(NSObject), Name = "_TtC11SwiftSample7MyClass")]
interface MyClass
Делать это вручную не круто. Вы можете использовать этот инструмент https://github.com/Flash3001/SwiftClassify, чтобы вставить все имена. (Это незавершенное производство, но это довольно просто, просто просмотрев код, который вы получите, как он работает).
6.1 Включите все зависимости Swift для запуска.
Если вы попытаетесь использовать библиотеку в приложении и попытаетесь запустить ее прямо сейчас, она сработает. Ошибка связана с отсутствием libswiftCore.dylib
Что-то вроде этого:
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 не предоставляет официальную поддержку для привязки библиотеки Swift. Поэтому вы должны вручную включить быстрые основные библиотеки в папки Frameworks и SwiftSupport. Файлы для папки Frameworks отличаются для Simulator и Device. Их можно найти в /Applications/Xcode.app/Contents/Developer//XcodeDefault.xctoolchain/usr/lib/swift.Toolchains
Вместо ручного копирования файлов внутри папки Framework вы можете использовать эту библиотеку https://github.com/Flash3001/Xamarin.Swift3.Support . Он включает в себя каждую отдельную потребность Swift 3.1, каждый из которых находится в одном пакете NuGet.
Как вы можете видеть, пакет Nuget включен в потребительское приложение, а не в самом привязке. Если вы попытаетесь включить его в привязку, вы получите ошибки компиляции.
Если вы создаете пакет Nuget, вы можете указать Nuget включить его в качестве зависимости.
6.2. Определение зависимостей Swift.
Важно, чтобы выяснить, какой пакет необходимо включить в свой проект. Обычно требуется простая привязка:
libswiftCore.dylib
libswiftCoreGraphics.dylib
libswiftCoreImage.dylib
libswiftDarwin.dylib
libswiftDispatch.dylib
libswiftFoundation.dylib
libswiftObjectiveC.dylib
libswiftQuartzCore.dylib
libswiftUIKit.dylib
Чтобы перечислить каждую зависимость, вы можете запустить следующую команду внутри вашего LibraryName.framework
otool -l -arch armv7 LibraryName | grep libswift
Не включайте все пакеты, доступные в NuGet для Swift3, так как они могут увеличить размер вашего приложения.
7. Включите SwiftSupport, чтобы отправить приложение в AppStore.
Apple требует, чтобы ваше приложение отправлялось вместе с папкой SwiftSupport вместе с папкой Payload. Оба находятся внутри вашего пакета IPA.
Вы можете использовать этот скрипт https://github.com/bq/ipa-packager, чтобы выполнить эту работу за вас.
Этот процесс является единственным, который должен выполнять пользователь библиотеки. Каждый раз, когда он пытается нажать приложение в AppStore.
Нажмите «Подписать и распространить» и «Сохранить на диск».
Создайте новый IPA, используя сценарий,
Если вы разблокируете файл, он будет содержать папку SwiftSupport.
замечания
При создании библиотеки в Xcode у нее есть возможность включить быстрые библиотеки. Не надо! Они будут включены в ваше окончательное приложение как NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib, но они должны быть включены как NAME.app/Frameworks/libswift*.dylib
Вы можете найти эту информацию в другом месте, но стоит упомянуть: не включать Bitcode в библиотеку. На данный момент Xamarin не включает Bitcode для iOS, и Apple требует, чтобы все библиотеки поддерживали одни и те же архитектуры.
отказ
Это руководство создано Lucas Teixeira . Все кредиты принадлежат ему. Спасибо, Лукас.