xcode 如何在包括Swift的iOS中创建开发框架?

iq3niunx  于 2023-01-21  发布在  Swift
关注(0)|答案(2)|浏览(169)

我的目标是创建一个iOS框架,它结合了Swift和Objective-C,我可以在我的开发项目中使用。这个框架的本质是框架本身正在开发中。所以,每次我使用这个框架构建项目时,这一点很重要(我将使用框架的项目称为“使用”项目,因为没有更好的术语),我想确保框架本身是重新构建的。我希望这是一个框架,因为我有一些应用程序,我想在它们之间使用相同的框架代码。今天我已经为此奋斗了很长一段时间。浪费了很多时间在一些至少在我看来应该更简单的事情上。所以,我将分享我的过程。

h79rfbju

h79rfbju1#

首先要注意的是(这当然不是我第一次注意到!),你 * 不能 * 在iOS下使用静态库。Xcode不会让你在静态框架中使用Swift。试试吧。Xcode会拒绝你的愿望!
这是我最终的流程,我必须处理的两个主要问题是:(i)使Xcode链接到using项目中的框架而不出错,(ii)访问using项目中框架的头文件,在苹果开明的观点中,这两个问题是分开的,注意讽刺。).
1)使用Xcode创建一个Cocoa Touch Framework。我相信这可以在Xcode6和Xcode7中使用。使用:
文件〉新建〉项目〉iOS〉框架和库〉Cocoa Touch框架
我碰巧正在使用Xcode7。(不要制作Cocoa Touch Static Library--就像我上面说的,Xcode不会让您将Swift合并到静态库中)。
2)对于Swift类,确保成员和函数是 * public * 的。我没有做过这样的实验,但似乎public属性对于成员和函数对框架用户可见是必要的。
3)添加任何你想要的Swift类(和Objective-C)到你的框架。
4)关闭那个框架项目(同一个项目不能在Xcode中打开两次,接下来需要将框架合并到using项目中)。
5)在Xcode中打开你的using项目。对我来说,这是一个现有的通用应用项目。你可能正在创建一个新的using项目。无论如何,在Finder中将框架项目的. xcodeproj文件拖到你的using项目中。
6)在using项目中,打开框架项目,将框架文件拖到构建阶段的Embed Frameworks中(当我第一次开始我的实验时,构建阶段中没有Embed Frameworks部分,我还不知道是什么魔法导致它出现!)。

到目前为止,这些步骤应该可以让您在不实际集成库代码的情况下进行构建和链接(我使用https://github.com/RadiusNetworks/swift-framework-example进行了一些测试)。
7)现在是致命一击:在Build Settings下,搜索Framework Search Paths。然后添加:

${TARGET_BUILD_DIR}/YourFrameworkName.framework

(It似乎您 * 不必 * 将其标记为递归)。
8)在使用框架的Swift代码文件中,您需要在每个文件的顶部添加一个导入:

import YourFrameworkName

现在您应该可以使用新库进行构建和链接了!
9)还有一个问题:请确保您的框架Deployment Target与目标项目匹配。例如,如果您使用的项目构建版本适用于iOS7,请确保您的框架构建版本适用于iOS7或更早版本。
10)第二个问题(2015年10月23日):我刚刚了解到我的框架必须有"App-Swift. h"(我使用的名称)作为构建设置中的Objective-C生成的接口头名称。当我把这个(Objective-C生成的接口头)去掉(试图修复另一个问题)时,我在App-Swift. h中遇到了一些有趣的问题。这些问题看起来像:"Cannot find interface declaration for NSObject"?
11)第三个问题(2015年10月29日):当我尝试将我的第一个应用程序上传到使用此框架的iTunes Connect时,我收到了一个上传错误。错误如下:
错误ITMS-90206:"无效的捆绑包。位于" Your.app/Frameworks/YourFramework.framework "的捆绑包包含不允许的文件" Frameworks'。"
各种SO和其他帖子都遇到过这种错误,对我来说,技巧是在构建设置中为Framework目标将"嵌入内容包含Swift代码"设置为NO。(我的应用构建设置已经将此标志设置为NO)。
https://github.com/crspybits/CocoaTouchFramework.git上的示例项目完成了其中的大部分步骤

4smxwvx5

4smxwvx52#

Swift消费者-〉Swift动态框架

Xcode版本10.2.1

创建Swift框架

创建框架项目或创建框架目标

File -> New -> Project... -> Cocoa Touch Framework
//or
Project editor -> Add a Target -> Cocoa Touch Framework

将生成两个文件:
1.一个月一个月-一个月一个月

  1. <product_name>.h-Build Phases -> Headers,为伞状头文件About(https://stackoverflow.com/a/57481319/4770877)
    添加文件.swift
Select `.swift` file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files

构建库-Command + B或Product -> Build
注意:确保您构建的框架与客户机代码的流程架构相同。
查找生成的输出Build location(https://stackoverflow.com/a/57512068/4770877)

Products group -> <product_name>.framework -> Show in Finder

该框架包括

  • Info.plist
  • ModulesAbout(https://stackoverflow.com/a/59213694/4770877)文件夹,带有:
  • module.modulemap
  • <product_name>.swiftmodule
  • .swiftdoc
  • x1米11米1x
  • Headers文件夹,带有:
  • Headers节中的文件。存在公共接口/定义
  • <product_name>-Swift.h-Xcode生成的头文件About(https://stackoverflow.com/a/59217701/4770877)

使用Swift框架的Swift消费者

Drag and dropAbout(https://stackoverflow.com/a/59216377/4770877)将二进制文件导入Xcode项目
Embed dynamic binary(或不嵌入||链接静态二进制文件)Link vs Embed(https://stackoverflow.com/a/59216858/4770877) Library not loaded(https://stackoverflow.com/a/59216681/4770877)

//Xcode 11
Project editor -> select a target -> General -> Frameworks, Libraries, and Embedded Content -> path to `<product_name>.framework` -> Embed

//pre Xcode 11
Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework`

加上Framework Search paths(FRAMEWORK_SEARCH_PATHS)Module not found(https://stackoverflow.com/a/59216466/4770877) Recursive path(https://stackoverflow.com/a/57516845/4770877)

Project editor -> select a target -> Build Settings -> Search Paths -> Framework Search paths -> add path to the parent of `<product_name>.framework` file

将模块导入Swift客户端代码module_name(https://stackoverflow.com/a/57517400/4770877)

import module_name

More examples here

相关问题