SDK开发
一般分静态库和动态库
静态库:1.模块化,分工合作。2.避免少量改动经常导致大量的重复编译链接。3.也可以重用,注意不是共享使用。( .a和.framework)
动态库:1.使用动态库,可以将最终可执行文件体积缩小。2.使用动态库,多个应用程序共享内存中得同一份库文件,节省资源。3.使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。 (.dylib和.framework)
静态库分两种,一个是 Framework,一个是Static Library(.a)
(1)Static Library的产出物只是一个.a文件,为二进制执行文件。分享给别人的时候,头文件、静态资源文件需要另外提供。
(2)Framework为一站式分享方案,其实是一个文件夹,其中包含代码签名、头文件、二进制执行文件、静态资源文件等。
本文讲的是Framework
创建
-
新建Framework 选择framework
-
命名为TestSDK
修改配置
-
更改 Info -> development target 到目标系统版本
-
确认 Target -> Build Settings -> Mach-O Type 为 Static Library
-
更改 Target -> Build Settings -> Build Active Architchture Only 为 NO。该编译项用于设置是否只编译当前使用的设备对应的arm指令集。
-
添加Other Linker Flags -ObjC ,在静态库中使用分类,那静态库里和使用该静态库的项目都要添加-ObjC。
-
更改 Edit scheme -> Run -> Build Configuration 为 Release
创建类文件
- 创建类ShowMessage
.h文件
@interface ShowMessage : NSObject
/*
* 展示消息
* message 消息
*/
+ (void)showWithMsg:(NSString *)message;
@end
.m文件
#import "ShowMessage.h"
@implementation ShowMessage
+ (void)showWithMsg:(NSString *)message {
NSLog(@"%@",message);
}
@end
-
设置需要公开的ShowMessage.h 为 public
-
在 TestSDK.h 文件中引入公开的头文件
生成SDK
-
选择模拟器 command+B
-
然后打开编译生成的模拟器架构的SDK目录
-
同理切换真机 command+B
-
最后生成的两个不同架构的SDK文件如下,可以看到一个是iphoneos,一个是iphonesimulator
创建demo工程
-
创建 Demo 工程,并将生成的模拟器架构的framework拷进来
-
在ViewController里调用 TestSDK的测试代码
-
查看打印,成功了。如果你要真机,那你就换那个真机架构的framework
合并framework
- 上面讲到我们现在有两个framework,使用肯定是不方便的。那我们需要合并它们为一个,先使用lipo -info分别查看一下它们的架构信息
先 cd 到framework文件夹里,去lipo -info 那个TestSDK文件。(其实我们就是合并TestSDK文件)
lipo -info TestSDK
-
真机架构
-
模拟器架构
- 使用(lipo -create 真机架构SDK路径 模拟器架构SDK路径 -output 输出路径 )合并,记得有空格
lipo -create xx/iphoneos/TestSDK.framework/TestSDK xx/iphonesimulator/TestSDK.framework/TestSDK -output xx/TestSDK

-
生成结果如下
-
查看一下架构,发现已经支持模拟器和真机了,但是体积也相应的变大了。这个时候只要将这个文件 随便放到之前生成的真机或者模拟器的framework里替换一下就可以了
脚本
上述合并是比较麻烦的 如果用脚本是可以直接command+B 直接生成
-
在之前的SDK工程里,添加New Run Script Phase
- 将如下脚本拷入
TARGET_NAME=${PROJECT_NAME}
OUTPUT_DIR=${SRCROOT}/Products/${TARGET_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework
if [ -d "${OUTPUT_DIR}" ]
then
rm -rf "${OUTPUT_DIR}"
fi
mkdir -p "${OUTPUT_DIR}"
cp -R "${DEVICE_DIR}/" "${OUTPUT_DIR}/"
lipo -create "${DEVICE_DIR}/${TARGET_NAME}" "${SIMULATOR_DIR}/${TARGET_NAME}" -output "${OUTPUT_DIR}/${TARGET_NAME}"
open "${SRCROOT}/Products"

-
command+b 后生成
-
lipo -info查看确认一下
网友评论