Xcode5制作Framework

本文深入解析了 Mac OS X 的 Framework 功能,包括资源共享、资源类型、创建流程以及 API 提供方法。并通过步骤指导,详细介绍了如何创建和使用 Framework,最后提供了常见问题解答。

Mac OS X 扩展了 Framework 的功能,让我们能够利用它来共享代码和资源。通过 Framework 我们可以共享所有形式的资源,如动态共享库,nib 文件,图像字符资源以及文档等。系统会在需要的时候将Framework 载入内存中,多个应用程序可以同时使用同一个 Framework,而内存中的拷贝只有一份。一个 Framework 同时也是一个 Bundle,我们可以在 Finder 里浏览其内容,也可以在代码中通过 NSBundle 访问它。利用 Framework 我们可以实现动态或静态库的功能。


1.创建一个名为PersonFramework 模板选择“Cocoa Touch Static Library”

2.填写项目名称

3.清理工程无用文件( Target 、  PersionFramework、 PersionFrameworkTests

4.删除旧的Target的编译设置:

5.我们把Target删除后 需要添加一个新的Target

6.修改新的Target编译配置

a. Architectures 改为 Standard architectures (armv7, armv7s)根据需要修改

b.在 Deployment 下,将 “Mac OS X Deployment Target”改为”Compiler Default”,将 “Targeted Device Family”改为需要的,此处改成了”iPhone/iPad”,同时可以根据需要修改 “iOS Deployment Target”,此处改为了 “iOS 7.1”(更具需求来,你需要支持到最低系统版本是多少就选多少):

c.在 Linking 中,将 “Dead Code Stripping” 改为 “NO”,将 “Link with Standard Libraries” 改为 “NO”,将 “Mac-O Type” 改为 “Relocatable Object File”:

d. Packaging 中,将 “Wrapper Extention” 改为“framework”:

e.修改 Info,将 “Bundle OS Type Code” 改为 “FMWK”(Framework )

f.修改预编译头文件,注释其中代码

到此为止,基本的配置就算完成了,可以看到现在的 Products中的文件为 DemoFrame.Framework,这个就是其它项目需要使用的Framwwork,但在这之前首先编写一些 DemoLibrary.framework 中的内容,然后把接口提供给其它工程。

7.给调用该Framework的项目提供API

首先建一个名叫FrameDemo的Class

不要忘记选Target

导出头文件

20

开始添加

21

选中.h文件

22

添加后效果

23

 

到这里,大功告成,但这个地方有一个细节要注意,当前选择Build生成的Framework要选择iOS Device,不要选择你当前链接的真机,否则会出现在打包的Framework在别的机器上使用时出错。

24

另外,当前的Framework适合真机,如果要做模拟器的Framework,要修改成模拟器版本

25

好了,现在可以Build  FrameworkHome 工程了

26

我们要的FrameWork出现了

如果要模拟器的 讲运行环境设置为模拟器 在编译就好了

其中Debug-iphoneos中的framework就是真机版本的,下边的文件夹就是模拟器版本的。

 

测试Framework

新建一个iOS项目

导入Framework

编写代码:

QQ20140510-1

有没有看到效果?

好了 制作Framework的教程完成了。

补充

1.读取文件

Framework中的代码就要这样读取文件了,当然还有其他的初始化路径方法,有需要的可以以后补充。

示例代码如下:

NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@”Resource” withExtension:@”bundle”]];

UIImage *img = [UIImage imageWithContentsOfFile:[bundle pathForResource:@"testImg" ofType:@"png"]];

[viewCtr.view addSubview:[[UIImageView alloc] initWithImage:img]];

2.建立一个真机和模拟器通用的Framework

首先用Finder找到Framework所在的位置

然后找到Framework中的文件,例如这里的 Kalagame-library,并且纪录其路径 os_frame_path

同样方法打开另一个文件夹,纪录其中库的路径,simulator_frame_path

然后打开控制台,输入 lipo -create os_frame_path simulator_frame_path -output newframe

这样就完成了模拟器和真机版本framework的合并,用finder找到这个newframe,然后把newframe改名字,并放回到framework文件夹中,替换原来的文件就可以了。

3.错误1

在制作framework或者lib的时候,如果使用了category ,则使用该FMWK的程序运行时会crash,此时需要在该工程中 other linker flags 添加两个参数  -ObjC -all_load

4.警告

编译出Framework是,需要把 GenerateDebugSymbols =NO,project与target都要设置下,否则会出现很多 warning:

类似

warning: (armv6) /Users/myuser/Library/Developer/Xcode/DerivedData/ ….build/Objects-normal/armv6/ImageRequest.o unable to open object file

 转自Anselz's Blog


<think>我们正在回答用户关于“如何使用Xcode创建框架”的问题。根据提供的引用和系统指令,我们需要构建一个清晰的步骤指南,并确保使用正确的中文和LaTeX格式。同时,在回答末尾生成相关问题。 步骤: 1. 理解框架:在Xcode中,框架(Framework)是一种将代码、资源(如图片、本地化字符串)和头文件打包在一起的方式,以便于在多个项目中共享和重用。 2. 创建框架项目:在Xcode中,我们可以通过选择“Framework & Library”模板来创建框架。 3. 配置框架:设置框架的版本、支持的平台(iOS、macOS等)以及公开的头文件。 4. 编写代码:在框架中添加类和功能。 5. 构建框架:编译框架,生成.framework文件。 6. 使用框架:在其他项目中导入并使用该框架。 详细步骤: ### 1. 创建新项目 - 打开Xcode,选择“File” > “New” > “Project...”。 - 在模板选择器中,选择“Framework” (位于iOS或macOS的“Framework & Library”部分)。 - 输入产品名称(例如:MyFramework),选择语言(Objective-C或Swift),然后点击“Next”。 - 选择保存位置,点击“Create”。 ### 2. 配置框架 - 在项目设置中,可以设置框架的版本号(Current Project Version)和营销版本(Marketing Version)。 - 在“Build Phases”中,确保将需要公开的头文件添加到“Headers”的“Public”部分(对于Swift,则使用`public`或`open`修饰符)。 - 如果需要支持多平台,可以在“General”的“Deployment Info”中调整目标平台。 ### 3. 添加代码和资源 - 在项目中添加新的类或文件。例如,创建一个Swift类`MyClass.swift`: ```swift public class MyClass { public init() { } public func sayHello() { print("Hello from MyFramework!") } } ``` 注意:使用`public`修饰符使类和方法对外可见。 - 如果需要添加资源(如图片、音频等),可以创建一个资源包(Bundle)或者直接放在框架中(对于Swift框架,可以使用Asset Catalog)。 ### 4. 构建框架 - 选择目标设备(Generic iOS Device或模拟器),然后按Command+B构建。 - 构建成功后,可以在Products目录下找到生成的.framework文件(右键点击,选择“Show in Finder”)。 ### 5. 使用框架 - 将.framework文件拖到其他项目中。 - 在项目设置的“General”选项卡中,将框架添加到“Embedded Binaries”和“Linked Frameworks and Libraries”。 - 在代码中导入框架并使用: ```swift import MyFramework let myObject = MyClass() myObject.sayHello() ``` ### 注意事项 - 如果框架包含资源(如图片),需要确保资源被正确打包。一种推荐的方式是创建资源包(Bundle)[^2]。 - 对于Swift框架,确保在导入到其他项目时,目标项目的Swift版本兼容。 - 如果框架需要支持模拟器和真机(即通用框架),可以使用“lipo”工具合并架构[^1]。 ### 示例:创建通用框架 有时我们需要一个同时支持模拟器和真机的框架(称为Fat Framework),可以通过以下步骤: 1. 分别构建模拟器和真机版本。 2. 使用终端命令合并: ```bash lipo -create path/to/simulator_framework path/to/device_framework -output path/to/universal_framework ``` 但是注意,Xcode 12及以上版本已经支持使用xcframework来更好地管理多平台框架[^3]。 ### 引用说明 根据提供的引用,我们参考了以下内容: - 引用[1]提到了在Xcode 4上创建通用静态库的方法,我们借鉴了合并架构的思想[^1]。 - 引用[2]提到构建静态库项目并将其转换为框架,以及如何打包资源[^2]。 - 引用[3]提醒不要同时在多个Xcode窗口中打开同一个项目[^3]。 - 引用[4]提到了在Qt项目中转到Xcode进行打包的经验,但我们这里主要关注纯Xcode框架创建[^4]。 - 引用[5]强调了框架在代码重用中的优势[^5]。 §§相关问题§§ 1. 如何为框架添加资源文件(如图片、本地化字符串)? 2. 如何创建支持多个平台(如iOS和macOS)的XCFramework? 3. 如何对框架进行单元测试? 4. 框架与静态库(Static Library)有什么区别?</think>### 如何使用 Xcode 创建框架 在 Xcode 中创建框架(Framework)是将可重用代码模块化的标准方法。以下是详细步骤: --- #### 步骤 1:创建框架项目 1. 打开 Xcode → 选择 **File > New > Project...** 2. 在模板选择器中: - 选择 **Framework**(位于 *iOS/macOS > Framework & Library* 下) - 输入产品名称(如 `MyFramework`) - 选择语言(Swift/Objective-C) - 取消勾选 *Include Tests*(可选) 3. 点击 **Create** 生成项目模板 > 框架项目会自动配置正确的构建设置和目录结构[^2]。 --- #### 步骤 2:添加公共代码 1. 在项目导航器中添加新文件(类/结构体/工具函数) 2. **关键设置**: - Swift:使用 `public` 或 `open` 修饰符暴露接口 ```swift public class DataProcessor { public static func process() { ... } } ``` - Objective-C:在 **Headers** 的 **Public** 区域添加头文件 ![](https://docs-assets.developer.apple.com/published/9ea5c0d3b6/rendered2x-1611672002.png) --- #### 步骤 3:配置构建设置 1. 在 **Build Settings** 中: - 设置 `Mach-O Type` 为 **Dynamic Library** - 调整 `iOS Deployment Target` 兼容最低系统版本 - 启用 `Build Libraries for Distribution`(支持二进制兼容) 2. 在 **Build Phases** 中: - 添加资源文件(图片/本地化文件等)到 **Copy Bundle Resources** - 确保公开头文件在 **Headers > Public** 区域 --- #### 步骤 4:构建框架 1. 选择目标设备: - 模拟器 → 生成 **x86_64** 架构 - 真机 → 生成 **arm64** 架构 2. 按 **⌘ + B** 编译 3. 生成的文件位置: - 右键 **Products > MyFramework.framework** → **Show in Finder** - 路径示例:`Build/Products/Debug-iphoneos/` > 如需通用框架(Fat Framework),使用 `lipo` 合并架构: > ```bash > lipo -create path/to/simulator_framework path/to/device_framework -output universal_framework > ``` --- #### 步骤 5:在其他项目中使用 1. 将 `.framework` 文件拖入目标工程 2. 在项目设置中: - **General** → 添加到 **Frameworks, Libraries, and Embedded Content** - **Build Settings** → 添加框架路径到 **Framework Search Paths** 3. 代码中导入: ```swift import MyFramework DataProcessor.process() ``` --- #### 高级技巧 1. **资源打包**: - 创建独立资源包(Bundle)存放图片/本地化文件[^2] - 通过 `Bundle(for: Self.self)` 加载资源 2. **XCFramework**(跨平台): ```bash xcodebuild -create-xcframework \ -framework device_framework_path \ -framework simulator_framework_path \ -output MyFramework.xcframework ``` 3. **模块稳定性**: - 在 `Package.swift` 添加 `// swift-tools-version:5.5` - 启用 `BUILD_LIBRARY_FOR_DISTRIBUTION`[^5] > 框架可显著提升代码复用率,特别适合组件化架构[^5]。避免同一项目在多个 Xcode 窗口打开以防配置冲突[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值