将Objective-c框架导入Swift框架(Google Analytics + Cocoapod)

Joh*_*ell 8 frameworks google-analytics objective-c cocoapods swift

我正在尝试将常用的Swift代码集中到框架中,部分代码使用Google Analytics.我将Google Analytics作为Cocoapod引入,但是我无法像在原始项目中那样从新框架访问它,因为它是Objective-C并且框架中没有桥接头支持[我使用的是Swift 1.2].

我通常在桥接头中使用的代码行使所有这些工作:

#import <Google/Analytics.h>

我把它放在我的项目中的哪个位置使这一切都像以前在桥接头中那样工作?

我在Apple关于混合Swift和Objective-C的文档中发现是:

从同一框架目标中导入代码

如果您正在编写混合语言框架,则可能需要从Swift访问Objective-C代码并从Objective-C访问Swift代码.

将Objective-C导入Swift

要在与Swift代码相同的框架目标中导入一组Objective-C文件,您需要将这些文件导入到框架的Objective-C伞形标题中.

从同一框架将Objective-C代码导入Swift

在"构建设置"下的"打包"中,确保将该框架目标的"定义模块"设置设置为"是".在您的伞头文件中,导入要向Swift公开的每个Objective-C头.例如:OBJECTIVE-C

import <XYZ/XYZCustomCell.h>

import <XYZ/XYZCustomView.h>

import <XYZ/XYZCustomViewController.h>

我认为最相关的短语是:

您需要将这些文件导入到框架的Objective-C伞头中

但这个文件是什么以及如何创建它?

Apple的文档较早提到(在表中):

Objective-C代码

导入Swift

#import"Header.h"

好吧,我尝试创建一个文件"Header.h"并导入它,但这不起作用.我不知道他们想说什么.我在构建设置中找不到任何"伞".

所以我的问题是,如何在我的Swift项目中导入这个文件(#import <Google/Analytics.h>),以便它可以像普通项目的桥接标题一样看到Google Analytics cocoapod框架?

更新:

我开始相信,Objective-c桥接头可能是与项目同名的.h文件.我现在尝试在那里添加import语句,我得到的错误是:

!在框架模块'JBS'中包含非模块化头

Joh*_*ell 5

对于那些继续问我是否解决了这个问题的人,以下是我如何完成将 KochavaTracker SDK Cocoapod 导入框架的任务。该 SDK 目前是用 Objective-C 编写的。此答案基于 nuKs 提供的答案,包含这些特定步骤。

1)在你的项目文件夹下创建一个名为KochavaTracker的文件夹,即MyFramework/MyFramework/KochavaTracker。

2) 在该文件夹中创建一个名为 module.modulemap 的文件并插入以下内容:

/*
 This is the private module which is used to make private ObjC headers available to Swift code.
 Note how all header files need to be specified with paths relative to this file.

 This file lives inside a folder, and that folder is the actual module. In Xcode the SWIFT_INCLUDE_PATHS needs to include the parent directory to that folder.
 */
module KochavaTracker {
    header "../../Pods/KochavaTrackeriOS/KochavaTrackeriOS/Classes/KochavaTracker.h"
    export *
}
Run Code Online (Sandbox Code Playgroud)

这有效地创建了一个模块,它是 SDK 接口的包装器,Swift 稍后可以像其他 Swift 模块一样导入它。请注意,它依赖于 Pods 文件夹的相对路径。

3) 在构建设置中,修改您的 SWIFT_INCLUDE_PATHS 以包括:

$(SRCROOT)/KochavaTracker
Run Code Online (Sandbox Code Playgroud)

这使您能够导入模块,并将其定位在/作为您在其下创建的 KochavaTracker 文件夹中。

4) 在适当的情况下添加到您的 Swift 代码中:

import KochavaTracker
Run Code Online (Sandbox Code Playgroud)

从那里您应该能够引用 KochavaTracker 模块中的类。


nuK*_*uKs 4

该解决方案并不像应用程序那么简单。我们必须创建一个模块映射。

\n\n

看看这个示例仓库

\n\n
\n

在 Swift 代码中,我们只能导入所谓的模块。诀窍是定义一个模块,该模块又包含我们需要 Swift 代码访问的所有 ObjC 标头。

\n
\n\n

本文的模块图部分也可能对您有帮助。

\n\n
\n

尽管桥接标头很方便,但它有一个关键限制\xe2\x80\x94您不能\xe2\x80\x99在框架项目中使用它。另一种方法是使用模块。

\n\n

为此,请在项目目录中创建一个以要使用的库命名的目录。我在 Xcode\xe2\x80\x99s 之外的 shell 中完成了此操作,并将其命名为 CommonCrypto。在目录内,创建一个封装库设置的 module.map 文件。对于 CommonCrypto,module.map 如下所示:

\n\n

module CommonCrypto [system] {\n header "/usr/include/CommonCrypto/CommonCrypto.h"\n export *\n }

\n\n

现在将新模块添加到项目设置中 Swift Compiler \xe2\x80\x93 Search Paths 下的 Import Paths 中。在模块路径中使用${SRCROOT}(例如${SRCROOT}/CommonCrypto)以确保项目无论在何处签出\xe2\x80\x99s都可以正常工作。

\n\n

这使得在 Swift 文件中导入 CommonCrypto 成为可能。请注意,使用此技术构建的任何框架的使用者也必须将该模块添加到他们的 Swift 搜索路径中。

\n
\n\n

我按照上面文章中的过程进行操作,并以这种方式使其满足我的需要:

\n\n

module Muse {\n header "Muse.framework/Headers/Muse.h"\n export *\n}

\n\n

我删除了[system]lexon(因为它删除了警告),并将框架放在与 module.map 文件相同的文件夹中。

\n\n

另外,不要忘记在框架目标中包含其他libc++.tbd必需的依赖项(在Linked Frameworks and LibrariesGeneral另外,如果需要,

\n