包括Pod的桥接标题以构建项目目标的设置?

时间:2015-06-02 23:59:57

标签: ios objective-c swift cocoapods

我创建了一个带有两个文件的objective-c pod:

Source/SomeViewController.h
Source/SomeViewController.m

我还在pod中创建了一个桥接标题:

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。然后在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文件时,我发现pod已正确安装,但是pod中的桥接标头未正确安装。我试图做的Swift项目:

let vc: SomeViewController

这会产生错误,因为未安装来自pod的桥接标头。

如何配置podspec以便正确安装pod的桥接标头?

1 个答案:

答案 0 :(得分:1)

Podspecs构建框架,框架不能包含桥接头。如果要将非模块化代码导入Swift框架,则需要使用自定义模块映射,而不是例如 MyLib / module.modulemap :< / p>

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项目中指定自定义模块映射(作为 .xcconfig 文件中的MODULEMAP_FILE设置,或作为模块映射文件目标的构建设置

现在,最后一块拼图:podspec。您需要设置module_map

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

上面是SQLite.swift如何分配自己,作为一般框架和pod。

编辑:似乎我错过了原始问题的重点,正如澄清in this thread。 OP希望使用pod框架的桥接头自动将其自身加载到安装项目的Swift代码中。这是不可能的。即使Swift框架 支持桥接头,它们也只能将Objective-C / C代码(私有框架代码)加载到框架的Swift代码中。