本文章涉及 Framework 为静态库。
涉及内容:
- SDK工程:指创建并编译 Framework 的工程;
- Demo工程:指测试测试 Framework 的Demo工程;
一、创建工程文件夹
创建一个文件夹 NiceSDK
,用于存放SDK工程,方便管理。
二、创建 SDK 工程
创建SDK工程,存放到上面创建的NiceSDK
中
1、Xcode > File > New > Project
2、iOS > Framework > Next
3、填写工程名 > 修改包名 > 设置使用语言 > Next
后面生成的 framework 文件,就是此处设置的工程名;当然工程名、包名开发过程中都可在Xcode上进行修改。
4、选择存放位置 > Create
此处我选择第一步创建的文件夹 NiceSDK
三、设置 SDK 工程
1、设置支持最小iOS版本和支持设备
2、 设置为静态库类型
Mach-O Type 设置为 Static Library
3、 Other Linker Flags 添加 -ObjC
如果SDK工程有使用分类(Category),则需要添加这个设置
经Xcode12.3上实测,只有当 SDK 工程使用了分类(categories),且 Demo 工程使用了这个 SDK ,Demo 工程才需要添加这个设置。如果 Demo 工程不使用这样的静态库,就算 Demo 工程自己有使用分类(categories), Demo 工程也无需添加这个设置。
4、关于指令值设置
最新版Xcode(我当前Xcode版本12.3)默认支持支持的真机指令集为 arm64 和 armv7,无需额外设置
如图,选择 Any iOS Device 为真机,可构建出真机 Framework;选择 iOS Simulator 中任意一个,为模拟器,可构建出模拟器 Framework。
可以使用 lipo 命令工具对生成的真机 Framework 和模拟器 Framework 进行指令集合并。
5、设置完成,关闭工程。
四、创建 Demo 工程
创建这个 Demo 工程用来测试 SDK。
1、Xcode > File > New > Project
2、iOS > App > Next
3、填写工程名 > 修改包名 > 设置使用语言 > Next
4、选择存放位置 > Create
此处我选择第一步创建的文件夹 NiceSDK
五、设置 Demo 工程
1、移除 SceneDelegate
由于苹果在 iOS13 以上使用 SceneDelegate 来支持应用多场景,因此Xcode11 以上创建 APP工程会默认生成 SceneDelegate。因为我们不需要这个,因此移除。
(1)为 AppDelegate 添加 window 属性:
(2)移除 AppDelegate.m 中这两个方法
(3)移除 SceneDelegate 文件
(4)移除 Info.plist 中的 Application Scene Manifest 项目
2、Other Linker Flags 添加 -ObjC
一般静态库都有使用分类(categories),因此Demo工程需要添加这个设置
3、关闭 Bitcode
因为 NiceSDK 可能会集成其他家的SDK,当其它家的SDK不支持 Bitcode 时,我们就需要将关闭 Bitcode。
4、设置完成,关闭工程。
五、xcworkspace
这两个就是创建的SDK工程和Demo工程,现在创建xcworkspace将他们关联起来,开发的时候就可以联调了。
1、创建 xcworkspace
名字可自由取名,存放放到NiceSDK
下,方便管理
2、关联工程
将 NiceSDK.xcodeproj 和 Demo.xcodeproj 拖进 xcworkspace 目录空间即可:
六、接口开发
1、创建接口文件
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 中即可:
3、编译SDK
根据实际需要,选择好真机类型或模拟器类型,点击三角按钮,即可开始编译
4、测试SDK
将上面生成的 SDK 导入 Demo 工程中,调用 test 接口进行测试。
(1)Demo工程导入SDK
将文件放到 Demo 工程的 SDK 具体文件夹下
将 SDK 文件夹导入
(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)在模拟器上的运行结果:
至此,我们成功创建了SDK工程和Demo工程,并成功测试了第一个SDK接口。
看懂请随手点赞,朋友们!🌹🌹🌹