[iOS] SDK开发

iOS库的区别

常见的自建iOS库分为两种形式,一种是xxx.a,还有一种是xxx.framework。这两种库有什么区别呢?

  1. .a库只能是静态库,只支持OC/Swift,只能使用静态链接的方式来引入库,调用时需要.h头文件,资源文件通常自建.bundle来管理,也就是最后交付使用的SDK通常包含3个文件,.a文件,.h文件和.bundle文件。

  2. .framework可以是静态库或动态库,支持OC和Swift,可以选择静态链接和动态链接的方式来使用库,.framework其实是一个头文件+可执行文件+资源文件的合集

动手创建一个工程

  1. 创建 YSStaticLibrary 静态库工程。
  2. 创建 YSDymicLibrary 动态库工程。
  3. 创建 Demo 工程。
  4. 创建 Demo.xcworkspace 工程文件。
  5. 分别在 两个工程中添加测试代码及工程目录如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  6. 点开 Demo.xcworkspace,右下角分别添加两个 SDK 工程成功后如下:
    在这里插入图片描述
  7. 目前为止准备工作已经做完了。
  8. 在主工程中修改相关配置如下:
    在这里插入图片描述
    在这里插入图片描述
  9. 然后工程就可以运行了。
  10. 调用方法
import YSStaticLibrary
import YSDymicLibrary
class SdkTest {
	static func test() {
	 	YSStaticLibrary.test()
        DynamicTest.test()
	}
}

遇见的问题

一. 编译库报错 image not found xxxx
原因:一般是使用的动态、静态库没有找到链接文件。
解决方法:
1. 可能是setting中Always Embed Swift Standard Libraries没有选成YES。
2. 可能是Swift的库版本不对应,需要重新出Swift库。

二. 混编 Swift OC C++ C 所用语言混编

  1. 直接将要调用的OC的头文件设置成public,然后在head文件中import这个OC头文件,这样就可以让swift文件来调用,但是这样不仅对库暴露了头文件,也会对外部工程暴露头文件,这种方式显然不尽人意。
  2. 我们可以使用module来实现混编,原理大概就是利用了Swift的模块系统,把OC文件当做一个模块来调用。我们先建立一个module.modulemap文件,在里面添加需要混编的OC头文件支持。想让这个modulemap文件生效,需要前往Build Settings下的Swift Compiler - Search paths,在import paths 里面添加module.modulemap所在文件夹路径。设置完毕后,即可在.swift文件中import头文件后调用。
  3. 写 sdk 的时候推荐使用第二种方式。

module.modulemap 的使用

  • 工程目录
    在这里插入图片描述
  • 相关代码

module.modulemap

module CustomxM [system][extern_c] {
    header "include/customx.h"
    export *
}

custom.h

#ifndef Customx_h
#define Customx_h

#include <stdio.h>

int bubble_sort(int len);

#endif /* Customx_h */

custom.c

#include "include/customx.h"
#include <stdio.h>

int bubble_sort(int len) {
    return len + len;
}
  • 重要配置
    在这里插入图片描述
  • 调用方法
import CustomxM
class Test {
	static func test() {
		let l = bubble_sort(Int32(99))
        print("\(l)::\(s)")
	}
}

打包库的方法

  1. 想要同时支持真机和模拟器,需要先单独编译库再使用命令合并库,合并.a库命令为lipo -create xxx.a xxx.a -output xxx.a
  2. 如果是合并.framework库,则把xxx.a替换成可执行文件就行了。当合并Swift库的时候还需要注意合并xxx.framework/Modules/xxx.swiftmodule下的内容。
  3. 顺带一提如果想要拆分库,可以使用lipo xxx -thin armv7 -output xxx命令

Demo

链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值