Как использовать платформу Objective-C в Swift без заголовка моста?

Я разрабатываю плагин Flutter (на Swift), пытаясь обернуть структуру Obj-C. Мне удалось импортировать файлы заголовков в файл MyPlugin.h, но как теперь использовать фреймворк без заголовка моста? Я просто получаю not found in scope.

Если бы мне пришлось сгенерировать заголовок моста, я бы столкнулся с другой ошибкой using bridging headers with framework targets is unsupported

Это мой файл podspec, мне пришлось установить для DEFINES_MODULE значение NO, чтобы построить проект без ошибки Include of non-modular header inside framework module.

Pod::Spec.new do |s|
  s.name             = 'lisnr'
  s.version          = '1.0.0'
  s.summary          = 'Flutter plugin for LISNR'
  s.description      = <<-DESC
  Flutter plugin for LISNR.
                       DESC
  s.homepage         = 'redacted'
  s.license          = { :file => '../LICENSE' }
  s.author           = { 'redacted' => 'redacted' }
  s.source           = { :path => '.' }
  s.source_files = 'Classes/**/*'
  s.dependency 'Flutter'
  s.platform = :ios, '8.0'

  s.preserve_paths = 'radius.framework'
  s.xcconfig = { 'OTHER_LDFLAGS' => '-framework radius' }
  s.vendored_frameworks = 'radius.framework'

  # Flutter.framework does not contain a i386 slice.
  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'NO', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
  s.swift_version = '5.0'
  s.public_header_files = 'Classes/**/*.h'
end

Остальные коды в значительной степени генерируются Flutter CLI.


person Yaobin Then    schedule 10.11.2020    source источник
comment
Включите немодульный заголовок внутри модуля фреймворка. Эта ошибка может быть связана с уровнем доступа ваших заголовков, объявленным во фреймворке. Вы пытались пометить эти заголовки, отображаемые через зонтичный заголовок фреймворка, как общедоступные, а не как проектные / частные?   -  person deathhorse    schedule 10.11.2020
comment
Да, plugin-probe.h общедоступен в заголовках Build Phases Headers. Не знаю, имеет ли это значение, но это в рамках проекта Pods. Кроме того, контейнер фреймворка только папка заголовков, папка модулей не найдена.   -  person Yaobin Then    schedule 10.11.2020


Ответы (1)


Вам нужна карта модуля. Вы можете написать это вручную и поместить во фреймворк или сделать это с помощью скрипта. Узнайте, как мне это удалось, здесь для Spotify SDK, который представляет собой платформу ObjC.

Сценарий для вас будет примерно таким:

#!/bin/sh

MODULE_DIR="MY_PATH/radius.framework" # You framework's path
mkdir -p "${MODULE_DIR}"
printf "module radius {\n\
header \"Headers/radius.h\"\n\
export *\n\
}" > "${MODULE_DIR}/module.map"
person Foti Dim    schedule 10.11.2020
comment
Вот и все! Спасибо! Никогда не знал, что мне просто понадобится карта модуля, я думал, что для этого подойдет зонтик. Большое спасибо! - person Yaobin Then; 11.11.2020
comment
Привет, спасибо за сценарий, но что, если sdk просто предоставляет двоичный файл (radius.a и т. Д.), Как я могу создать module.map в этой ситуации? - person LiuJQ; 01.02.2021
comment
Не имеет значения, является ли это двоичной структурой. Заголовки по-прежнему должны быть общедоступными и видимыми как исходный код. Теперь, если у вас есть только файл «.a», вам не хватает файлов заголовков. Они должны быть предоставлены в файле «.a» от поставщика SDK. - person Foti Dim; 02.02.2021
comment
@FotiDim О, понятно, спасибо - person LiuJQ; 04.02.2021
comment
@LiuJQ, пожалуйста, подумайте о том, чтобы проголосовать за ответ, если он вам помог - person Foti Dim; 05.02.2021
comment
@FotiDim Ага, да. - person LiuJQ; 05.02.2021