使用Xcode 5创建Framework

本文详细介绍如何使用Xcode5创建适用于iOS项目的自定义Framework,包括配置架构、编译设置及头文件公开等步骤。

在做了一定数量的项目或写了一定量的代码以后,不知不觉我们会积累了很多常用的方法,函数等,这个时候应该把它们从项目中抽离出来,从而在日后的项目中提高开发的效率,为此框架应运而生。本文就说下我参照网上的一些文章,自己使用Xcode 5建立一个自己的框架的过程。环境是Mac OS X 10.9,Xcode 5.0.2。

1.打开Xcode新建一个工程,模板如下:



2.然后是工程名,路径等。

3.工程目录结构如下:



把JuliaCoreFramework,JuliaCoreFrameworkTests删掉(Move to trash,不用纠结了),再把两个Target移除,如下:


这个时候会有个对话框弹出来,先不用理会它,Cancel。

删除后目录结构如下(清爽多了):



4.把之前的Scheme删掉,操作如下:




5.现在Add Target,操作如下:



可以看到和刚才相同的对话框弹了出来,选择Bundle模板:

然后是工程名等常规设置。

完成后,工程目录见下图,可以看到之前被删除的小伙伴都回来了:



打开预编译文件,将其中的代码全部注释掉:



6.下面来到最麻烦的阶段,因为要进行一系列的设置。

在Targets中点击JuliaCore,打开Build Phases选项卡。

首先是Architectures:

(1)将JuliaCore Target下(这里有Resolved,JuliaCore,JuliaCoreFramework和iOS Default等几项,只需要设置JuliaCore该列就可以了,下同)的Architectures修改为armv7,armv7s,如果选择了下面的armv64,那么后面的编译或者是导入类库使用的编译都会出现问题,博主之前就被卡在这里了。还是上张图:



(2)将Base SDK改为Latest iOS(iOS 7.0)

完成后如下图:



接着是Deployment:

(1)将OS X Deployment Target设置为Compiler Default

(2)将Targeted Device Family设置为iPhone/iPad

(3)将iOS Deploment Target设置为你想要的版本,这里貌似设置的是要求的最低版本吧,博主就设了个6.0

完成后如下图:



再到Linking:

(1)将Dead Code Stripping设置为NO

(2)将Link With Standard Libraries设置为NO

(3)将Mach-O Type设置为Relocatable Object File

完成后如下图:



然后是Packaging,将Wrapper Extension设置为framework:




打开Info选项卡,将Bundle OS Type Code设置为FMWK:



7.现在可以深呼吸一口气了,因为终于恶心完了。现在我们可以真正地往框架中添加属于我们的代码了。例如,新建一个JCIdentifier类,记住选中Target:


8.然后写一些方法,实际上就是我们要留给外部调用的接口。例如:



9.再次打开Julia Core Target的Build Phases,通过Xcode菜单添加一个Phases,操作如下:



在Copy Headers中的Project中添加JCIdentifier.h:



再将JCIdentifier.h拖到上面的Public中,这就是我们向外界公开的头文件。


10.终于配置好了,各种蛋疼啊。

下面选中iOS Device或模拟器,注意不要选择真机(否则你Build出来的框架只能在该机子中跑),然后是Command + B,Build成功后可以看到Products下面的JuliaCore.framework变成白色了。

如果还是红色,就换一种设备,例如将iOS Device换成模拟器,或把模拟器换成iOS Device,再Build一次。

如无意外,我们的产品就出来了,在Finder中打开它,如:



用多列视图来观察下其目录:



可以看到有两个文件夹Debug-iphoneos和Debug-iphonesimulator,两个文件夹下都有对应的JuliaCore.framework文件,也就是刚刚我们打包的产品(注意要分别在iOS Device和iOS Simulator的情况下Build一次),然后选择对应的文件,例如如果想在真机跑将拷贝iphoneos下的framework文件,如果想在模拟器中跑就拷贝iphonesimulator中的文件。


11.最后?当然是使用我们自己的framework给出的接口啦。

新建一个工程,然后将我们的framework导入到工程中。导入头文件,例如:

#import <JuliaCore/JCIdentifier.h>

调用头文件中的接口,例如:

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    JCIdentifier *jcObject = [[JCIdentifier alloc] init];
    NSString     *jcID     = [jcObject frameworkIdentifier];
    NSString     *message  = [NSString stringWithFormat:@"This is my %@", jcID];

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Hey"
                                                        message:message
                                                       delegate:nil
                                              cancelButtonTitle:@"That's cool" otherButtonTitles:nil, nil];
    [alertView show];
}

Run,终于成功了:



等等,编译出错了,用的是64位的iPhone模拟器。对了,还要保持工程中Architectures中的设置和原来的框架保持一致呢,设置一下吧,armv7和armv7s:



Run,无错通过,大功告成。

其实博主以前在用64位的iPhone模拟器跑lame库的时候也出现了编译错误,而32位的iPhone模拟器无错通过,解决方法就在于此。


可能还有读者担心真机跑是否会成功,博主在自己的iPhone 5上跑过(记得将framework文件改成iphoneos文件夹下的对应文件),没问题,至于64位的设备,由于博主没有设备,所以无法给出一个确切的答案。


拥有自己的Framework怎么说都是件很酷的事,更何况它还是我们提高开发效率的忠实小伙伴呢,好好壮大并加以利用吧。


后记:

1.合并模拟器和真机的Framework文件

首先找到Debug-iphoneos和Debug-iphonesimulator文件夹下的两个framework文件,在新标签页中打开后可以看到一个无后缀的文件:



然后打开终端输入下列形式的命令:

lipo -create [iphoneos文件夹下框架文件的路径] [iphonesimulator文件夹下框架文件的路径] -output [生成文件的路径]


例如:

$ lipo -create ./os/JuliaCore.framework/JuliaCore ./simulator/JuliaCore.framework/JuliaCore -output ./JuliaCore

然后将新生成的文件替换原来框架中的文件。



参考文章:

IOS7开发~Xcode5制作framework

<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、付费专栏及课程。

余额充值