将Objective-c框架导入Swift框架(谷歌分析和Cocoapod)

将Objective-c框架导入Swift框架(谷歌分析和Cocoapod),objective-c,swift,google-analytics,frameworks,cocoapods,Objective C,Swift,Google Analytics,Frameworks,Cocoapods,我正试图将我常用的Swift代码集中到一个框架中,其中一部分代码使用Google Analytics。我将Google Analytics作为Cocoapod引入,但我不能像在原始项目中那样从新框架中访问它,因为它是Objective-C,并且框架中没有桥接头支持[我使用的是Swift 1.2] 我通常在桥接头中的代码行使所有这些工作正常进行: #进口 我应该把它放在我的项目中的什么地方,让它像以前在桥接头中那样工作 我发现的是: 从同一框架目标中导入代码 如果您正在编写混合语言框架,则可能需要

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

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

#进口

我应该把它放在我的项目中的什么地方,让它像以前在桥接头中那样工作

我发现的是:

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

如果您正在编写混合语言框架,则可能需要访问 Swift提供的目标-C代码和目标-C提供的Swift代码

将Objective-C导入Swift

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

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

在“生成设置”下的“打包”中,确保定义了模块 该框架目标的设置设置为“是”。在你的伞里 头文件,导入要公开的每个Objective-C头 敏捷的例如:OBJECTIVE-C 导入 导入 进口

我认为最相关的一句话是:

您需要将这些文件导入到 用于框架的Objective-C伞形标题

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

苹果的文档在前面提到(在表格中):

目标-C代码导入Swift#导入“Header.h”

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

所以我的问题是,我如何在我的Swift项目中导入这个文件(#import),这样它就可以像我通常在普通项目的桥接头中一样看到Google Analytics CoCoCoaPod框架

更新:

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

!在框架模块“JBS”中包含非模块化标头。


桥接头文件是将Objective-C文件用于Swift框架的特定头文件

有关桥接的更多信息,请访问:

Xcode将创建头文件以及您正在创建的文件,并根据您的产品模块名称将其命名,然后添加“-bridgeing header.h”。(稍后,您将在命名产品模块中了解有关产品模块名称的更多信息。)

因此,您唯一需要做的就是通过选择

文件>新建>文件>(iOS、watchOS、tvOS或OSX)>源文件>头文件。

如果框架的名称为ABC,则头文件的名称应为:

例:ABC桥接头.h

您可以将它放在框架项目中您想要的地方


希望这能帮助别人

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

看一看

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

的模块映射部分也可能对您有所帮助

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

为此,请在项目目录中创建一个以要使用的库命名的目录。我是在外壳中做的,在Xcode的支持下,命名为CommonCrypto。在目录中,创建封装库设置的module.map文件。对于CommonCrypto,module.map如下所示:

模块CommonCrypto[系统]{
标题“/usr/include/CommonCrypto/CommonCrypto.h”
出口*
}

现在添加新模块以导入Swift编译器下的路径–在项目设置中搜索路径。在模块路径中使用${SRCROOT}(例如${SRCROOT}/CommonCrypto),以确保项目无论在何处签出都能正常工作

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

我遵循上述文章中的程序,通过以下方式满足我的需要:

模块Muse{
标题“Muse.framework/Headers/Muse.h”
出口*
}

为了安全起见,我删除了
[system]
lexon(因为它删除了警告),并将框架放在module.map文件所在的文件夹中


另外,如果您需要,请不要忘记在您的框架目标中包括
libc++.tbd
和其他必需的依赖项(在
General
选项卡的
链接框架和库
部分),下面是我如何完成将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 *
}
这将有效地创建一个作为包装器的模块
$(SRCROOT)/KochavaTracker
import KochavaTracker