iOS创建与使用SDK (framework)

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项目即可.

相关推荐
2501_915106321 小时前
App HTTPS 抓包实战解析,从代理调试到真实网络流量观察的完整抓包思路
网络协议·http·ios·小程序·https·uni-app·iphone
要站在顶端2 小时前
iOS自动化测试全流程教程(基于WebDriverAgent+go-ios)
开发语言·ios·golang
2501_916008892 小时前
深入理解 iPhone 文件管理,从沙盒结构到开发调试的多工具协同实践
android·ios·小程序·https·uni-app·iphone·webview
腾讯云qcloud07554 小时前
腾讯位置商业授权iOS 轨迹SDK
macos·ios·cocoa
2501_916007474 小时前
没有 Mac,如何在 Windows 上架 iOS 应用?一套可落地的工程方案
android·macos·ios·小程序·uni-app·iphone·webview
2501_915106324 小时前
uni-app 上架 iOS 的完整实践,从跨端开发到稳定提交的工程路径
android·ios·小程序·uni-app·cocoa·iphone·webview
2501_916007475 小时前
HTTPS工作原理与重要性:全面安全指南
网络协议·安全·ios·小程序·https·uni-app·iphone
函数的彼端1 天前
iOS Model Generator - 让 JSON 转模型变得简单高效
ios·json·cocoa
2501_915918411 天前
HTTPS 端口深度解析,443 并不是唯一入口,理解 TLS 流量行为与抓包策略
网络协议·http·ios·小程序·https·uni-app·iphone
2501_916008891 天前
iOS 开发者工具全景图,构建从编码、调试到性能诊断的多层级工程化工具体系
android·ios·小程序·https·uni-app·iphone·webview