iOS创建与使用SDK (framework)

3,077 阅读4分钟

iOS创建与使用SDK (framework)

开发准备

xcode: 版本14.2 (14C18)

创建SDK

New Project

img.png

选择iOS -> framework

img_1.png

项目名称暂且就叫SDK

img_2.png

选择保存路径

img_3.png

创建成功

img_4.png

新建文件

img_5.png

选择Swift文件, 然后Next

img_6.png

输入文件名index.swift

img_7.png

文件创建成功

img_8.png

在index.swift编写一个sayHello方法, 需要用public

import Foundation


public func sayHello(_ name: String) {
    print("Hello", name)
}

img_9.png

build项目

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

img_10.png

查看build后生成的SDK

img_11.png

img_12.png

SDK.framework目录就是我们需要的SDK, 等会使用SDK的时候会用到这个文件夹

可以看到SDK.framework的前面一个目录是Debug-iphonesimulator, 这说明SDK只能用于模拟器, 不能用于真机, 先暂且不管这些, 跑通整个流程了后面再讲怎么合并真机与模拟器SDK

到此SDK创建成功, 接下来使用SDK

使用SDK

创建一个iOS App项目来使用SDK

继续New Project

img_13.png

选择iOS -> App

img_14.png

项目名称就叫App

img_15.png

选择保存路径

img_16.png

App创建成功

img_17.png

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

img_18.png

在App中导入SDK

找到SDK build后生成的SDK.framework文件夹

按住SDK.framework文件夹, 拖拽到xcode的App项目里面的App文件夹, 如下图位置, 然后松开

img_19.png

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

img_20.png

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

img_21.png

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

img_22.png

将Embed由Do Not Embed改为Embed & Sign

img_23.png

再次点击build, 提示Build Succeeded, 一切正常

调用SDK的方法

先导入SDK, 然后直接调用即可, 控制台成功输出Hello

img_24.png

代码:

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

img_25.png

选第一个

img_26.png

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

img_28.png

在finder中找到SDK项目

img_29.png

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

在finder中选中SDK.xcodeproj

img_27.png

将SDK.xcodeproj拖进App项目

img_30.png

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

img_31.png

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

img_32.png

选择SDK.framework, 点击Add

img_33.png

成功

img_34.png

重新build, 没有报错

img_35.png

修改SDK代码

img_36.png

在App中使用

img_37.png

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

img_38.png

代码:

index.swift

import Foundation

public func sayHello(_ name: String) {
    print("Hello", name)
}

public class MySDK {
    public init () {}
    public func getMessage() -> String {
        return "你好"
    }
}

ContentView.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模式

img_39.png

将其改为release, 操作如下:

img_40.png

img_41.png

改为release, 然后关闭就行

img_42.png

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

img_43.png

合并真机与模拟器SDK

网上很多教程都是用的lipo -create合并的, 例如

lipo -create "Release-iphonesimulator/SDK.framework/SDK" "Release-iphoneos/SDK.framework/SDK" -output "common/SDK.framework/SDK"

但如果模拟器的架构和真机的架构相同, 用这条命令合并就会报错, 更推荐使用xcframework合并

xcframework: Xcode 11.0及以上版本支持

用法

xcodebuild -create-xcframework -framework <path> [-framework <path>...] -output <path>

分别生成模拟器和真机SDK

首先进入到SDK项目根目录(SDK.xcodeproj同级的目录)

生成模拟器SDK, 执行

xcodebuild -scheme SDK -sdk iphonesimulator clean build

img_44.png

生成真机SDK, 执行

xcodebuild -scheme SDK -sdk iphoneos

img_45.png

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

img_46.png

执行:

xcodebuild -create-xcframework -framework ./Release-iphonesimulator/SDK.framework -framework ./Release-iphoneos/SDK.framework -output ./SDK.xcframework

就会在Products目录里面生成SDK.xcframework, 这个就是模拟器和真机都可以使用的SDK

img_49.png

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