最近看到有很多开发小伙伴苦恼SDK的制作,鉴于之前做了大量的马甲包SDK业务,抽出一点时间来总结一下制作SDK的各种姿势。
一:什么是SDK?
懒得打字, 请直接查看:zh.wikipedia.org/wiki/IOS%E8…
二:准备工作
MAC OS、XCode、Cocoapods、git、GitHub或者Gitee
三:开始制作
1.打开XCode,依次选择File
-> New
- > Project
出现咱们常见的创建选择区:
选择FrameWork
,然后点击Next
,进入完善SDK基础信息页面:
这里咱们给SDK进行一些基础信息设置:
Product Name
设置为:NibilitySDKTeam
设置为NoneBundle ID
设置为:com.NibilitySDK.wwwLanguage
设置为Objective-C(Swift版本的于Objective-C有一些细微的区别,以后有空再写)Test Info
测试,咱们这里为了快速演示SDK的制作,就不过多描述测试相关的了
然后将SDK项目保存到【桌面】
(当然你也可以保存到下载或者文档啥的,哪里方便就保存到哪里),保存后咱们就得到了一个自动打开的工作区:
为了让SDK可以正常的工作,我们需要修改Deployment info
信息。
-
Minimum Deployments
设置为 iOS 11.0,并且移除iPad和Mac的支持。 -
Targets
→Build Settings
→Mach-O Type
为Static Library
-
Targets
→Build Settings
→Build Active Architecture Only
设置为No
-
Build Settings
→Enable Bitcode
设置为No
-
Edit Scheme
→Run
→Info
→Build Configuration
为Release
到此,咱们的SDK就设置完成啦! 接下来准备SDK的开发工作。
- 新建一个
DogManager
类。
2.在DogManager.m
中编写SDK的业务代码。
@implementation DogManager
/// 和猫打架
-(void)fightWithCat {
NSLog(@"和猫猫打架");
}
@end
3.在DogManager.h
中,暴露SDK的方法fightWithCat
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface DogManager : NSObject
/// 和猫打架
-(void)fightWithCat;
@end
NS_ASSUME_NONNULL_END
4.将DogManager
设置为Public
5.然后我们在NibilitySDK.h
文件中,引用DogManager.h
头文件。
就这样,我们一个简单的SDK就制作完成了!
接下来准备编译模拟器&&真机,并合并framework。
然后进入信息设置页面:
Team
设置为NoneProduct Name
设置为:OutPutFrameworkProject
默认选择NibilitySDK
接下来创建Run Script
脚本:
在Shell中输入以下脚本内容:
#!/bin/sh
#要build的target名
TARGET_NAME=${PROJECT_NAME}
if [[ $1 ]]
then
TARGET_NAME=$1
fi
UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}/"
#创建输出目录,并删除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}/Framework"
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/Framework/${TARGET_NAME}.framework"
#分别编译模拟器和真机的Framework
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
#拷贝framework到univer目录
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}/Framework"
lipo "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" -remove arm64 -output "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}"
#合并framework,输出最终的framework到build目录
lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/Framework/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"
#删除编译之后生成的无关的配置文件
dir_path="${UNIVERSAL_OUTPUT_FOLDER}/Framework/${TARGET_NAME}.framework/"
for file in ls $dir_path
do
if [[ ${file} =~ ".xcconfig" ]]
then
rm -f "${dir_path}/${file}"
fi
done
#判断build文件夹是否存在,存在则删除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi
rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"
#打开合并后的文件夹
open "${UNIVERSAL_OUTPUT_FOLDER}/Framework"
输入后:
然后切换Target
,设备选择Any iOS Device
:
设置OutPutFramework
为Release:
四:编译SDK
Command+B,运行项目,你将会得到一个合并完成后的NibilitySDK.framework 然后你就可以把这个SDK导入到其他项目使用啦!
五:使用SDK
......