iOS SDK框架开发中的那些坑

前言

    最近业务需求需要开发一个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,后期将模拟器库与真机库合并,各个架构模式就都存在了。

解决指令集冲突.png

此处参考文章
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

配置spec.png

设置自己的非开源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的完整开发流程,一步步排除问题,最终达到了最终结果。在此感谢一起解决问题的同事--卞老板。

你可能感兴趣的:(iOS SDK框架开发中的那些坑)