【问题标题】:iOS8: Custom Swift Framework accessing external framework written in Objective-CiOS8:自定义 Swift 框架访问用 Objective-C 编写的外部框架
【发布时间】:2015-10-19 17:16:23
【问题描述】:

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

Podfile

# 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

项目内的 Pod:

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

定义模块

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

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

试过了:

  1. 由于项目使用 Swift,我创建了一个 Objective-C 文件并点击“您想配置一个 Objective-C 桥接头吗?

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

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

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

【问题讨论】:

  • 试试看this repo,看看你能不能从中得到任何线索。

标签: ios8 frameworks xcode6 couchbase-lite


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    不幸的是,Cocoapods 0.39 存在“不支持传递供应商动态库”的问题 您将在最新的 couchbase-lite-ios 版本中看到这一点,包括二进制 CouchbaseLite.framework。这个不幸的问题让我很难受,我不得不重构一切以使用 Carthage,并在我的最终项目中手动管理我的框架。

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

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

    framework module CouchbaseLite {
      umbrella header "CouchbaseLite.h"
    
      export *
      module * { export * }
    }
    

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

    【讨论】:

    • @Jens-Alfke 我注意到你提到它在其他 cmets 的 swift 全局命名空间中默认可用,但是我发现它没有出现在那里,而是我不得不将它添加到桥接头中并且由于对于缺少的模块映射,您会收到“没有这样的模块”错误。这是在 Xcode 7.1 beta 4 中,所以也许在之前的 Xcode 版本中你可能是正确的。
    • @orti Carthage 如何为您工作?是“我再也不会回到可可足”了吗?
    • Carthage 有一个很好的目的,但现在(2015 年 11 月 7 日)围绕 Xcode 7 的开发空间和框架从静态库切换到所有动态库有很多混乱。所以有一半的时间依赖是行不通的。 Xcode 7 正在建立一个新的标准,最终我们都会采用动态框架。 Carthage 的价值在于快速整合依赖项并使它们保持最新。 Cocoapods 对 OSS 的整体工作做得更好,但对于在具有私有代码依赖项的客户端项目中部署代码则更差。
    【解决方案3】:

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

    步骤:

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

    模块 CouchbaseLite { 标题“../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 时,它仍然报错,我仍然不知道为什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 2017-01-27
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多