前言
最近业务需求需要开发一个SDK集成到友方App中,于是就有了本文中的这些经验(掉坑->爬坑->掉下一个坑)。
前期---代码编写
坑点一:关键框架选型
这个其实不涉及技术问题,但是也需要谨慎,因为我们的SDK属于一个比较完整的业务模块,所以依赖的第三方库还是挺多的,其中就用到了高德地图,(开始我们就用的通用版本,结果友方用的是另一个版本,结果为了能够集成成功,后期不得不更改高德地图版本),所以建议如果是这种明确合作方的SDK这种框架还是需要提前沟通好。
PS:忍不住吐槽一下,高德地图整出一大堆乱七八糟的框架目的是个啥呢,又不能互相兼容,开发者还不知道选择哪个合适。
坑点二:资源类文件的处理
原生App开发,资源文件最多的无非是图片,在平时项目开发中一般会放到asset文件夹中,但是在SDK中,需要创建.bundle文件(建议与项目同名)对资源文件进行管理。
+ (UIImage *)imageWithNamed:(NSString *)name inDirectory:(NSString *)directory {
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:bundle文件名 ofType :@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
/*资源在bundle文件夹中的路径 */
NSString *directoryPath = [NSString stringWithFormat:@"images/%@", directory];
NSString *imagesPath = [bundle pathForResource:name ofType:@"png" inDirectory:directoryPath];
UIImage *img = [UIImage imageWithContentsOfFile:imagesPath];
return img;
}
该方法在项目中使用举例:
UIImage *refreshImg = [UIImage imageWithNamed:@"icon_exchange" inDirectory:@"common"];
中期---生成合格的.framework框架
坑点三:指令集冲突(模拟器包真机包合并时,提示冲突)
简单来说,在生成模拟器.framework中与生成真机.framework时,都存在arm64架构,网上提供的通过后期命令行删除某个arm64的方式始终无法解决该问题。此时需要配置如图选项,大概意思是在模拟器生成的.framework的框架不再添加arm64,后期将模拟器库与真机库合并,各个架构模式就都存在了。
此处参考文章
Xcode12 运行模拟器报building for iOS Simulator, but linking in object file built for iOS, file错误解决方案
tips:
查看打出包,包含哪些架构信息的命令行(在终端直接输入)
lipo -info 打出包所在路径
模拟器包与真机包合并命令行
lipo -create 模拟器包路径 真机包路径 -output 存放合并后包路径/合并包的名字(推荐和SDK名称一致)
后期---远程私有库制作
坑点四:spec文件的配置
制作远程私有库的教程有很多,此处就不展开来仔细说明了。iOS开发: 配置CocoaPods远程私有仓库重点说一下针对非开源的.framework框架,如何去配置spec
设置自己的非开源SDK
s.vendored_frameworks = 'ZDSweepCodeSDK.framework'
设置项目SDK相关的资源文件夹(bundle)
s.resource = 'ZDSweepCodeSDK/ZDSweepCodeSDK.bundle'
坑点五:打包的SDK中的类目文件无法编译
当自己开发的SDK中包含类目文件时,编译就会有提示找不到,此时需要在设置页other_laflags添加'-objc',但是在SDK中无法设置,只能写在spec文件。
s.xcconfig = { "OTHER_LDFLAGS" => "-ObjC", "ENABLE_BITCODE" => "NO"}
坑点六:spec文件验证推送远程库报错
当调用pod lib lint --verbose --use-libraries时报了如下错误:
Ld .../Build/Intermediates.noindex/App.build/Release-iphonesimulator/App.build/Objects-normal/arm64/Binary/App normal arm64
解决方案:
s.pod_target_xcconfig = { 'VALID_ARCHS' => 'x86_64 armv7 arm64' }
后记
经历了整个SDK的完整开发流程,一步步排除问题,最终达到了最终结果。在此感谢一起解决问题的同事--卞老板。