最近帮兄弟公司的做支付业务sdk,积累了 sdk 封装的经验!下面我会从零开始把我的 sdk 封装和调试经历分享给大家,希望能给看到这篇文章的人有所帮助!
这边文章我会从以下几个方面来讲述:
Framework怎么集成在主项目里调试
xib 文件和图片怎么生成引用
Pods 第三方库的使用
Framework 的配置与导出
1、新建主项目,主项目的 ProjectName 是 HelloFramework(也就是我们要使用 sdk 业务的主项目)
2、接下来在主项目里创建Framework,就叫MyFramework好了
创建 Framework3、然后我们点开 Project 文件,在Target 列表里选中 MyFramework,Build Settings
a、Architectures→Architectures 配置支持的指令集,这里系统已经默认配置了 arm64和 armv7,所以只要增加一个 armv7s 就可以了
配置指令集以下是指令集对应的设备
armv6
iPhone、iPhone 3G
iPod 1G、iPod 2G
armv7
iPhone 3GS、iPhone 4
iPod 3G、iPod 4G、iPod 5G
iPad、iPad 2、iPad 3、iPad Mini
armv7s
iPhone 5、iPhone 5C
iPad 4
arm64
iPhone 5s iPhone 6iPhone 6P iPhone 6s iPhone 6sP iPhone 7 iPhone 7P
iPad Air, Retina iPad Mini
b、Linking→Mach-O Type 将Dynimic Library 改成 Static Library
配置 Library 类型c、Deployment→iOS Deployment Target 选择你想兼容的最低 iOS 版本
d、新建一个 FrameworkManager,然后再创建好我们要使用的内容,这里创建一个用 Xib 来显示的 UIViewController,以及在里面显示图片
@interface MyFrameworkManager : NSObject
+ (void)showFileVCWithSourceVC:(UIViewController *)VC;
@end
e、接下来可以将 Target 选为 Framework 开始编译了
f、在工程文件列表里找到 Products 文件,右键 MyFramework.framework,show in finder。把所有的 Nib 文件 Copy 出来,接下来会放到另外一个专门存放资源文件的 bundle 里
g、在Build phase→Headers 里面将要暴露出来的.h文件拖放到 Public 目录下
4、创建bundle,放置资源文件(xib 文件,图片)
a、新建一个空文件夹,
b、把图片和3f 步骤里的 nib 文件都放进文件夹
c、然后把文件名改成任何你想要的名字(一般都会与你的 Framework 名字匹配),但是注意,添加.bundle后缀
5、pods 库的引用和调试,同普通的 pods 库应用,直接 pod init ,在 podfile 里添加自己要用的库,pod install 就可以直接在 Framework 里使用 pods 库的东西了
6、第三方库的使用,这里以引入支付宝为例
a、在主工程引入 AlipaySDK.framework 和 AlipaySDK.bundle
b、在主工程的 link binary 添加支付宝 sdk 依赖的库
c、MyFramework 下添加link binary 添加 AlipaySDK.framework
d、编译通过,可以在 Framework 下正常调用
7、接下来就是导出 Framework 了
A、用 shell 脚本自动导出 Framework
a、如果是单 Project
# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
#FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"
b、 如果是 workspace 的话,编译的命令会有些区别,不是配置 Target 而是配置workspace 和 scheme,这两个参数的值可以通过中断 cd 当前项目目录下 xcodebuild -list查看,以下是我根据例子配置了一个
xcodebuild -configuration "Release" -workspace "HelloFramework.xcworkspace" -scheme "MyFramework" -target "${FMK_NAME}" -sdk iphoneos -arch armv7 -arch armv7s -arch arm64 clean build
xcodebuild -configuration "Release" -workspace "HelloFramework.xcworkspace" -scheme "MyFramework" -target "${FMK_NAME}" -sdk iphonesimulator -arch x86_64 -arch i386 clean build
B、在终端手动操作
a、选择模拟器和Generic iOS Device两种设备编译出两个包(为了导出一个兼容模拟器和真机都能用的 Framework)
b、编译完事后,同3f 步骤,在 finder 里找到 iPhoneOS 和 iPhonesimulator 里的两个 framework 包
c、将两个包里的 MyFramework 文件合成一个,命令如下
lipo -create /Users/OuYangTimmy/Library/Developer/Xcode/DerivedData/BBGPaySDK-bahiyajwgypizfascjejguaoiqje/Build/Products/Debug-iphonesimulator/BBGPaySDK.framework/BBGPaySDK /Users/OuYangTimmy/Library/Developer/Xcode/DerivedData/BBGPaySDK-bahiyajwgypizfascjejguaoiqje/Build/Products/Debug-iphoneos/BBGPaySDK.framework/BBGPaySDK -output /Users/OuYangTimmy/Library/Developer/Xcode/DerivedData/BBGPaySDK-bahiyajwgypizfascjejguaoiqje/Build/Products/BBGPaySDK
d、将合成 MyFramework 替换原有的,那么这个 framework 就是我们要的包了
8、最后一步就是编写文档了,作为 sdk 的导出,文档里你的表明自己 build 版本和依赖的库,有 Pods 配置的话,也得注明,系统配置,编译配置等等~More detailed the better!
至此,整个Framework 调试和封装流程就分享完了!希望路过的大牛不要笑话,也热烈欢迎大家指正错误和不足,或者有更好的方式方法我们一起讨论!
文章最后是多谢和感恩!
行文前我阅读过的文章:
网友评论