Включить заголовок Pod Bridging-Header для настройки параметров цели проекта?

Я создал модуль Objective-C с двумя файлами:

Source/SomeViewController.h
Source/SomeViewController.m

Я также создал связующий заголовок в модуле:

Source/Bridging-Header.h

с содержанием:

#import "SomeViewController.h"

Мой podspec выглядит так:

Pod::Spec.new do |s|
  s.name = 'TestLib'
  s.version = '0.0.1'
  s.license = 'MIT'
  s.ios.deployment_target = '7.0' 
  s.source_files = 'Source/*.{h,m}'
  s.requires_arc = true
  s.xcconfig = { 'SWIFT_OBJC_BRIDGING_HEADER' => 'Source/Bridging-Header.h' } 
end 

Я создал демонстрационный проект, сделал pod init и вставил свой модуль. Затем после pod install я получаю следующий вывод:

Установка TestLib 0.0.1 (была 0.0.1) Генерация проекта Pods Интеграция клиентского проекта

[!] The `TestLibProject [Debug]` target overrides the `SWIFT_OBJC_BRIDGING_HEADER` build setting defined in `Pods/Target Support Files/Pods-TestLibProject/Pods-TestLibProject.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The `TestLibProject [Release]` target overrides the `SWIFT_OBJC_BRIDGING_HEADER` build setting defined in `Pods/Target Support Files/Pods-TestLibProject/Pods-TestLibProject.release.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

Когда я открываю свой файл TestLibProject.xcworkspace, я вижу, что модуль был установлен правильно, но соединительный заголовок из модуля не установлен правильно. В моем проекте Swift я пытался сделать:

let vc: SomeViewController

Это дает ошибку, потому что заголовок моста из пода не установлен.

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


person Community    schedule 02.06.2015    source источник


Ответы (1)


Podspecs создают фреймворки, а фреймворки не могут включать связующие заголовки. Если вы хотите импортировать немодульный код в платформу Swift, вам нужно вместо этого использовать пользовательскую карту модуля, например, в MyLib/module.modulemap:

framework module MyLib {
    umbrella header "MyLib.h"

    // Load an SDK header, e.g. CommonCrypto.h
    header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h"

    export *
    module * { export * }
}

Оказавшись там, вы можете указать пользовательскую карту модуля как в своем проекте Xcode (либо как параметр MODULEMAP_FILE в файле .xcconfig, либо как файл карты модуля вашей цели). Настройки сборки.

Теперь последняя часть головоломки: podspec. Вам нужно установить module_map:

Pod::Spec.new do |s|
  # …
  s.module_map = 'MyLib/module.modulemap'
end

Выше показано, как SQLite.swift распространяется как общая структура и как модуль.


Редактировать: Похоже, я упустил суть исходного вопроса, как выяснилось в этой теме. OP хотел использовать соединительный заголовок фреймворка pod, чтобы автоматически загружать себя в код Swift проекта установки. Это невозможно. Даже если фреймворки Swift действительно поддерживают заголовки мостов, они смогут загружать только код Objective-C/C (т. е. частный код фреймворка) в код Swift фреймворка.

person stephencelis    schedule 03.06.2015
comment
Привет, я попытался добавить файл карты модуля в свою спецификацию модуля, установив настройки s.module_map, но когда я пытаюсь выполнить анализ модуля, я не могу разрешить модуль (находящийся в файле .h). Забавно, потому что он работает отлично работает в Xcode, у вас есть ключ? - person Loegic; 31.08.2015