iOS SDK(一):工程创建 & 接口测试
本文章涉及 Framework 为静态库。
涉及内容:
- SDK工程:指创建并编译 Framework 的工程;
- Demo工程:指测试测试 Framework 的Demo工程;
一、创建工程文件夹
创建一个文件夹 NiceSDK
,用于存放SDK工程,方便管理。
![](https://img.haomeiwen.com/i1237662/021e990300a39bc7.png)
二、创建 SDK 工程
创建SDK工程,存放到上面创建的NiceSDK
中
1、Xcode > File > New > Project
![](https://img.haomeiwen.com/i1237662/e46d48a406436028.png)
2、iOS > Framework > Next
![](https://img.haomeiwen.com/i1237662/cb153eeaeac5a9fe.png)
3、填写工程名 > 修改包名 > 设置使用语言 > Next
后面生成的 framework 文件,就是此处设置的工程名;当然工程名、包名开发过程中都可在Xcode上进行修改。
![](https://img.haomeiwen.com/i1237662/8eff0d92e8d6c4c5.png)
4、选择存放位置 > Create
此处我选择第一步创建的文件夹 NiceSDK
![](https://img.haomeiwen.com/i1237662/e56d0a616e3ef10f.png)
三、设置 SDK 工程
1、设置支持最小iOS版本和支持设备
![](https://img.haomeiwen.com/i1237662/7f85a8e89b4dc39e.png)
2、 设置为静态库类型
Mach-O Type 设置为 Static Library
![](https://img.haomeiwen.com/i1237662/0ec01736a0ad42c4.png)
3、 Other Linker Flags 添加 -ObjC
如果SDK工程有使用分类(Category),则需要添加这个设置
经Xcode12.3上实测,只有当 SDK 工程使用了分类(categories),且 Demo 工程使用了这个 SDK ,Demo 工程才需要添加这个设置。如果 Demo 工程不使用这样的静态库,就算 Demo 工程自己有使用分类(categories), Demo 工程也无需添加这个设置。
![](https://img.haomeiwen.com/i1237662/75f19eb7e13e20d3.png)
4、关于指令值设置
最新版Xcode(我当前Xcode版本12.3)默认支持支持的真机指令集为 arm64 和 armv7,无需额外设置
![](https://img.haomeiwen.com/i1237662/c1b5d43a9d76962b.png)
如图,选择 Any iOS Device 为真机,可构建出真机 Framework;选择 iOS Simulator 中任意一个,为模拟器,可构建出模拟器 Framework。
![](https://img.haomeiwen.com/i1237662/73c10c5109014ceb.png)
可以使用 lipo 命令工具对生成的真机 Framework 和模拟器 Framework 进行指令集合并。
5、设置完成,关闭工程。
四、创建 Demo 工程
创建这个 Demo 工程用来测试 SDK。
1、Xcode > File > New > Project
![](https://img.haomeiwen.com/i1237662/e46d48a406436028.png)
2、iOS > App > Next
![](https://img.haomeiwen.com/i1237662/b4ca3f5d8c09a498.png)
3、填写工程名 > 修改包名 > 设置使用语言 > Next
![](https://img.haomeiwen.com/i1237662/b4b33e8d7abacf07.png)
4、选择存放位置 > Create
此处我选择第一步创建的文件夹 NiceSDK
![](https://img.haomeiwen.com/i1237662/969263c794d53c7f.png)
五、设置 Demo 工程
1、移除 SceneDelegate
由于苹果在 iOS13 以上使用 SceneDelegate 来支持应用多场景,因此Xcode11 以上创建 APP工程会默认生成 SceneDelegate。因为我们不需要这个,因此移除。
(1)为 AppDelegate 添加 window 属性:
![](https://img.haomeiwen.com/i1237662/9fc8feeb86674e63.png)
(2)移除 AppDelegate.m 中这两个方法
![](https://img.haomeiwen.com/i1237662/fbb2b1ffb2748277.png)
(3)移除 SceneDelegate 文件
![](https://img.haomeiwen.com/i1237662/99aaa2f1d285d5f4.png)
(4)移除 Info.plist 中的 Application Scene Manifest 项目
![](https://img.haomeiwen.com/i1237662/40a8a04343a9deee.png)
2、Other Linker Flags 添加 -ObjC
一般静态库都有使用分类(categories),因此Demo工程需要添加这个设置
![](https://img.haomeiwen.com/i1237662/e05bc5fee88fffba.png)
3、关闭 Bitcode
因为 NiceSDK 可能会集成其他家的SDK,当其它家的SDK不支持 Bitcode 时,我们就需要将关闭 Bitcode。
![](https://img.haomeiwen.com/i1237662/3836001ca168fd1c.png)
4、设置完成,关闭工程。
五、xcworkspace
这两个就是创建的SDK工程和Demo工程,现在创建xcworkspace将他们关联起来,开发的时候就可以联调了。
![](https://img.haomeiwen.com/i1237662/e8a2b631af686aaa.png)
1、创建 xcworkspace
![](https://img.haomeiwen.com/i1237662/75af3437a5f47dec.png)
名字可自由取名,存放放到NiceSDK
下,方便管理
![](https://img.haomeiwen.com/i1237662/f7f48cb8b2878fbe.png)
2、关联工程
将 NiceSDK.xcodeproj 和 Demo.xcodeproj 拖进 xcworkspace 目录空间即可:
![](https://img.haomeiwen.com/i1237662/2bd0f6acdc1f3ff0.png)
六、接口开发
1、创建接口文件
![](https://img.haomeiwen.com/i1237662/13d1a89aa647d18a.png)
![](https://img.haomeiwen.com/i1237662/ff1381166f8a2504.png)
![](https://img.haomeiwen.com/i1237662/74151cd35141b5ac.png)
![](https://img.haomeiwen.com/i1237662/8fa5ab1ac4b7752f.png)
2、创建接口
为方便管理,这里使用单例模式。
创建一个 test 接口,用来测试 SDK。
NiceSDKAPI.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface NiceSDKAPI : NSObject
+ (instancetype)shareInstance;
- (void)test;
@end
NS_ASSUME_NONNULL_END
NiceSDKAPI.m
#import "NiceSDKAPI.h"
@implementation NiceSDKAPI
+ (instancetype)shareInstance{
static NiceSDKAPI *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[NiceSDKAPI alloc]init];
});
return instance;
}
- (instancetype)init
{
self = [super init];
if (self) {
}
return self;
}
- (void)test{
NSLog(@"NiceSDK test interface");
}
@end
2、头文件暴露
对外暴露头文件,用于外部使用 SDK 的接口
1、我们将 NiceSDK.h 当做SDK对外的总的.h 文件,因此新创建的需要对外暴露的 .h 文件,可以将 import 写这里,这样外部在调用时,只需要 import NiceSDK.h 这个文件。
NiceSDK.h
#import <Foundation/Foundation.h>
// SDK 对外暴露的 .h 写这里
#import "NiceSDKAPI.h"
//! Project version number for NiceSDK.
FOUNDATION_EXPORT double NiceSDKVersionNumber;
//! Project version string for NiceSDK.
FOUNDATION_EXPORT const unsigned char NiceSDKVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <NiceSDK/PublicHeader.h>
2、工程设置需要暴露的头文件
只需要将需要对外暴露的 .h 文件添加到 public 中即可:
![](https://img.haomeiwen.com/i1237662/b45b87a2e35d9fef.png)
3、编译SDK
根据实际需要,选择好真机类型或模拟器类型,点击三角按钮,即可开始编译
![](https://img.haomeiwen.com/i1237662/c1418991aa491612.png)
4、测试SDK
将上面生成的 SDK 导入 Demo 工程中,调用 test 接口进行测试。
(1)Demo工程导入SDK
将文件放到 Demo 工程的 SDK 具体文件夹下
![](https://img.haomeiwen.com/i1237662/e01cd159529a7c7e.png)
将 SDK 文件夹导入
![](https://img.haomeiwen.com/i1237662/fd8ab0d0c3e2e76c.png)
![](https://img.haomeiwen.com/i1237662/f140c46fb7af1662.png)
(2)调用SDK代码
ViewController.m
#import "ViewController.h"
// 导入 NiceSDK
#import <NiceSDK/NiceSDK.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// 调用 SDK test 接口
[[NiceSDKAPI shareInstance]test];
}
(3)在模拟器上的运行结果:
![](https://img.haomeiwen.com/i1237662/e155ce1c0a138be3.png)
至此,我们成功创建了SDK工程和Demo工程,并成功测试了第一个SDK接口。
看懂请随手点赞,朋友们!🌹🌹🌹