Создание плагина Flutter Rust FFI с XCFramework для macOS/iOS

Обзор

Я пытаюсь:

  • Создайте плагин FFI для Flutter с помощью flutter_rust_bridge
  • Для iOS/macOS используйте XCFramework (похоже, сейчас это лучший вариант по сравнению с универсальными библиотеками)

Короче говоря, мне очень трудно собрать мой примерный проект (с использованием моего плагина flutter ffi).

Что я наделал

  1. Создал один XCFramework из сгенерированных статических библиотек ржавчины (включая статические библиотеки симулятора macOS, iOS и iOS). Уже одно это было настоящей головной болью.
  2. Создал следующий файл flutter_mimir.podspec в моих папках ios и macos:
Pod::Spec.new do |spec|
  spec.name          = 'flutter_mimir'
  spec.version       = '0.0.1'
  spec.license       = { :file => '../LICENSE' }
  spec.homepage      = 'https://github.com/GregoryConrad/mimir'
  spec.authors       = { 'Gregory Conrad' => '[email protected]' }
  spec.summary       = 'Embedded instance of milli'

  spec.ios.deployment_target = '9.0'
  spec.osx.deployment_target = '10.11'

  spec.source = { :path => '.' }
  spec.preserve_paths = 'EmbeddedMilli.xcframework/**/*'
  spec.vendored_frameworks = 'EmbeddedMilli.xcframework'
  spec.xcconfig = { 'OTHER_LDFLAGS' => '-framework EmbeddedMilli' }

  # TODO clean up following (not sure if these are actually needed here?)
  # Flutter.framework does not contain a i386 slice.
  spec.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
  spec.static_framework = true
end
  1. Переместил мои созданные EmbeddedMilli.xcframework в каталоги ios и macos.
  2. pod install работает нормально.

Эта проблема

При сборке для macOS:

Launching lib/main.dart on macOS in debug mode...
lib/main.dart:1
--- xcodebuild: WARNING: Using the first of multiple matching destinations:
{ platform:macOS, arch:arm64, id:00006000-0004695C0C06801E }
{ platform:macOS, arch:x86_64, id:00006000-0004695C0C06801E }
ld: framework not found EmbeddedMilli
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Как я могу изменить настройки сборки podspec/проекта моей библиотеки, чтобы разрешить сборку примера проекта?

Связанный

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ответ на мой вопрос возник из этой ветки GitHub. Вот копия моего комментария:

На случай, если кто-то еще наткнется на это, я заставил FFI работать с моей кросс-платформенной XCFramework, используя ffiPlugin: true (спасибо @leisim за отличный пример с Isar!). Не могу поверить, что я этого не осознавал, но мой XCFramework трясло дерево. Вот как я это исправил (тот же код для macOS и iOS, но, к сожалению, не может быть символически связан):

  • my_package.podspec
Pod::Spec.new do |spec|
  spec.name          = 'my_package'
  spec.version       = '0.0.1'
  spec.license       = { :file => '../LICENSE' }
  spec.homepage      = ''
  spec.authors       = { 'Your Name' => '[email protected]' }
  spec.summary       = 'Some summary'

  spec.source              = { :path => '.' }
  spec.source_files        = 'Classes/**/*'
  spec.public_header_files = 'Classes/**/*.h'
  spec.vendored_frameworks = 'Frameworks/MyPackage.xcframework'

  spec.ios.deployment_target = '11.0'
  spec.osx.deployment_target = '10.11'
end
  • Classes/binding.h
void enforce_binding();
  • Classes/EnforceBinding.swift
public func dummyMethodToEnforceBundling() {
    enforce_binding() // disable tree shaking
}
  • Frameworks/MyPackage.xcframework должна иметь функцию void enforce_binding() {}. Я сделал это в Rust с помощью:
/// Enforce the binding for this library (to prevent tree-shaking)
#[no_mangle]
pub extern "C" fn enforce_binding() {}

Другие вопросы по теме