iOS8: 自定义 Swift 框架访问在 Objective-C 中编写的外部框架

iOS8: Custom Swift Framework accessing external framework written in Objective-C

我正在尝试在 Swift 中创建一个名为 CouchbaseKit 的自定义框架(Xcode 中的一个新目标)。在我的 CouchbaseKit 中,我需要访问完全用 Obj-C 编写的 CouchBaseLite Framework。我正在使用 Cocoapods 来管理 CouchBaseLite 和其他几个框架。下面是我的播客文件。

播客文件

# Uncomment this line to define a global platform for your project
link_with ['CouchbaseKit']
# platform :ios, '8.0'

use_frameworks!
target 'CouchbaseDB' do
link_with ['CouchbaseKit']

pod 'couchbase-lite-ios'
pod 'SwiftyJSON', '~> 2.2.0'
pod 'Alamofire', '~> 1.2'
pod 'XCGLogger', '~> 2.0'
end

target 'CouchbaseDBTests' do
end

target 'CouchbaseKit' do
end

target 'CouchbaseKitTests' do
end

Pods项目内部:

对于我的 TARGETS 我在 Build Phases 中有以下设置。

定义模块

允许非模块化包含在框架模块中

问题: 当我尝试访问我的 CouchbaseKit(我的自定义框架)中的 CouchbaseLite 框架时,出现错误“没有这样的模块 'CouchbaseLite' 不存在。

尝试过:

  1. 由于项目在 Swift 中,我创建了一个 Objective-C 文件并单击“是否要配置一个 Objective-C ] 桥接头?"

  2. 即使在所有目标中将“允许非模块化包含在框架模块中”设置为“是”,当我尝试在 CouchbaseKit.h#import <CouchbaseLite/CouchbaseLite.h> 时仍然出现错误

这是我的自定义框架的构建阶段的样子 CouchbaseKit

问题:如何在我的自定义 Swift 框架中看到外部 Objective-C 框架 (CouchasebaseLite)?

iOS 上的 CouchbaseLite 是一个静态框架,即它的二进制文件是一个静态库而不是动态库。这意味着它链接到您的应用程序中,就好像它是一个源文件一样。因此,您不使用 Swift 中的 import 来访问它; 类 已经与您应用的 类.

在同一个命名空间中

不幸的是,Cocoapods 0.39 受到 "Transitive Vendor Dynamic Libraries Unsupported" 的影响,您会在最新的 couchbase-lite-ios 版本中看到这一点,包括二进制文件 CouchbaseLite.framework。不幸的是,这个问题让我很难受,我不得不重构一切以使用迦太基,并在我的最终项目中手动管理我的框架。

说到发布的二进制文件 CouchbaseLite.framework 只是缺少模块映射。

添加一个到:CouchbaseLite.framework/Modules/module.modulemap

framework module CouchbaseLite {
  umbrella header "CouchbaseLite.h"

  export *
  module * { export * }
}

然后您将能够将此框架包含到桥接 header 中,并使您的动态框架正确嵌套。但是您可能需要像我一样转而构建您的 CouchbaseKit.framework 以使用 Carthage。

如果你还想使用Cocoapods可以关注this

步骤:

  • 创建一个名为您要在其中使用的框架名称的文件夹 这种情况 CouchbaseLite 并在其中创建模块映射。文件名将是 module.map,其内容将是

模块 CouchbaseLite { header "../Pods/couchbase-lite-ios/CouchbaseLite.framework/Headers/CouchbaseLite.h" 出口 * }

Important Note: Don't add that folder to the project, I don't know why not when done it will not work.

  • 在 Swift 编译器下导入路径 - 在您的项目设置中搜索路径。在模块路径中使用 ${SRCROOT}(例如 ${SRCROOT}/CouchbaseLite) .

  • 然后您可以像导入任何 swift 模块一样导入它。

更新: 它在 Xcode 中会很好地工作,但是当我尝试使用 pod lint 验证 pod 时它仍然会出错,我仍然不知道为什么。