iOS创建与使用SDK (framework)
开发准备
xcode: 版本14.2 (14C18)
创建SDK
New Project

选择iOS -> framework

项目名称暂且就叫SDK

选择保存路径

创建成功

新建文件

选择Swift文件, 然后Next

输入文件名index.swift

文件创建成功

在index.swift编写一个sayHello方法, 需要用public
swift
import Foundation
public func sayHello(_ name: String) {
print("Hello", name)
}

build项目
按 command + b
或者点击build按钮
build成功后就会生成SDK

查看build后生成的SDK


SDK.framework目录就是我们需要的SDK, 等会使用SDK的时候会用到这个文件夹
可以看到SDK.framework的前面一个目录是Debug-iphonesimulator, 这说明SDK只能用于模拟器, 不能用于真机, 先暂且不管这些, 跑通整个流程了后面再讲怎么合并真机与模拟器SDK
到此SDK创建成功, 接下来使用SDK
使用SDK
创建一个iOS App项目来使用SDK
继续New Project

选择iOS -> App

项目名称就叫App

选择保存路径

App创建成功

点击build, 就会启动iPhone 14 Pro模拟器

在App中导入SDK
找到SDK build后生成的SDK.framework文件夹
按住SDK.framework文件夹, 拖拽到xcode的App项目里面的App文件夹, 如下图位置, 然后松开

会弹出一个框, 勾选Copy items if needed
, 然后点击Finish

然后可以看到目录里面多了一个SDK.framework

在App配置里面也可以看到成功引入了SDK

将Embed由Do Not Embed
改为Embed & Sign

再次点击build, 提示Build Succeeded
, 一切正常
调用SDK的方法
先导入SDK, 然后直接调用即可, 控制台成功输出Hello

代码:
swift
import SwiftUI
import SDK
struct ContentView: View {
let msg: () = sayHello("ZP")
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
Text("Hello, world!")
}
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
整个创建与使用SDK的流程结束了
但是还有一个问题, 在开发SDK的时候每次改动SDK的代码, 就要重新build一次并且在App中重新导入一次, 很麻烦, 所以在开发中可以直接导入SDK源码, 这样的话修改SDK代码后, build App的时候会自动把SDK build一次并且使用最新的SDK代码
将SDK源码添加到App, 方便开发
先删除现在已经导入的SDK

选第一个

重新build, 报错说明删除成功

在finder中找到SDK项目

然后在xcode中关闭SDK项目, 一定要在xcode中关闭SDK项目才能做下一步操作!
在finder中选中SDK.xcodeproj

将SDK.xcodeproj拖进App项目

在App项目中双击SDK.xcodeproj, 如果能看到这个界面就说明成功了

但还差一步, 按如下操作把SDK加入App中

选择SDK.framework, 点击Add

成功

重新build, 没有报错

修改SDK代码

在App中使用

重新build就可以看到效果了, 屏幕中多了"你好"两个字, 这两个字来自SDK函数的返回值

代码:
index.swift
swift
import Foundation
public func sayHello(_ name: String) {
print("Hello", name)
}
public class MySDK {
public init () {}
public func getMessage() -> String {
return "你好"
}
}
ContentView.swift
swift
import SwiftUI
import SDK
let sdk = MySDK()
struct ContentView: View {
let msg: () = sayHello("ZP")
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
Text("Hello, world!")
Text(sdk.getMessage())
}
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
将SDK由debug改为release
打开SDK build后的目录, 现在是debug模式

将其改为release, 操作如下:


改为release, 然后关闭就行

重新build一次, 现在就是release了

合并真机与模拟器SDK
网上很多教程都是用的lipo -create
合并的, 例如
shell
lipo -create "Release-iphonesimulator/SDK.framework/SDK" "Release-iphoneos/SDK.framework/SDK" -output "common/SDK.framework/SDK"
但如果模拟器的架构和真机的架构相同, 用这条命令合并就会报错, 更推荐使用xcframework合并
xcframework: Xcode 11.0及以上版本支持
用法
shell
xcodebuild -create-xcframework -framework <path> [-framework <path>...] -output <path>
分别生成模拟器和真机SDK
首先进入到SDK项目根目录(SDK.xcodeproj同级的目录)
生成模拟器SDK, 执行
shell
xcodebuild -scheme SDK -sdk iphonesimulator clean build

生成真机SDK, 执行
shell
xcodebuild -scheme SDK -sdk iphoneos

现在模拟器和真机SDK都有了, 命令行进入到Products目录, 开始合并

执行:
shell
xcodebuild -create-xcframework -framework ./Release-iphonesimulator/SDK.framework -framework ./Release-iphoneos/SDK.framework -output ./SDK.xcframework
就会在Products目录里面生成SDK.xcframework, 这个就是模拟器和真机都可以使用的SDK

使用方法也很简单, 和使用framework一样, 将SDK.xcframework文件夹拖进App项目即可.