Поиск…


Вступление

Легко следовать руководству, которое приведет вас к процессу связывания файлов Swift .framework для использования в проекте Xamarin.

замечания

  1. При создании библиотеки в Xcode у нее есть возможность включить быстрые библиотеки. Не надо! Они будут включены в ваше окончательное приложение как NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib, но они должны быть включены как NAME.app/Frameworks/libswift*.dylib

  2. Вы можете найти эту информацию в другом месте, но стоит упомянуть: не включать Bitcode в библиотеку. На данный момент Xamarin не включает Bitcode для iOS, и Apple требует, чтобы все библиотеки поддерживали одни и те же архитектуры.

Связывание быстрой библиотеки в Xamarin.iOS

Связывание быстрой библиотеки в Xamarin.iOS следует тому же процессу для Objective-C, как показано на https://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/ , но с некоторыми оговорками.

  1. Быстрый класс должен наследовать от NSObject, который должен быть привязан.
  2. Компилятор Swift будет переводить имена классов и протоколов во что-то другое, если вы не используете аннотацию @objc (например, @objc (MyClass)) в своих быстрых классах, чтобы указать явное имя цели c.
  3. Во время выполнения ваш APP должен включать некоторые быстрые основные библиотеки вместе с вашей привязанной инфраструктурой в папке под названием Frameworks;
  4. Когда приложение загружается в 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 Построение структуры

Отключить биткод. *

Отключить биткод

Сборка для выпуска для устройства и симулятора. * Установите его как выпуск в схемах Xcode Создание устройства

Построить для симулятора

Найти фреймворки

Каркасы

  • Не относится только к привязке 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. Просто щелкните правой кнопкой мыши «Родные ссылки» и нажмите «Добавить собственную ссылку». Найдите новую структуру жира и добавьте ее.

Добавить исходную ссылку

Выберите .framework

Ссылка

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, вы можете указать 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 расстегнуть молнию

Создайте новый IPA, используя сценарий, Новый API

Если вы разблокируете файл, он будет содержать папку SwiftSupport. введите описание изображения здесь

замечания

При создании библиотеки в Xcode у нее есть возможность включить быстрые библиотеки. Не надо! Они будут включены в ваше окончательное приложение как NAME.app/Frameworks/LIBRARY.framework/Frameworks/libswift*.dylib, но они должны быть включены как NAME.app/Frameworks/libswift*.dylib

Вы можете найти эту информацию в другом месте, но стоит упомянуть: не включать Bitcode в библиотеку. На данный момент Xamarin не включает Bitcode для iOS, и Apple требует, чтобы все библиотеки поддерживали одни и те же архитектуры.

отказ

Это руководство создано Lucas Teixeira . Все кредиты принадлежат ему. Спасибо, Лукас.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow