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

相关推荐
小江村儿的文杰8 小时前
UE4 iOS Package的过程与XCode工程中没有游戏Content的原因
macos·ios·ue4·xcode
__WanG11 小时前
Flutter将应用打包发布到App Store
前端·flutter·ios
安和昂15 小时前
【iOS】bug调试技巧
ios·bug·cocoa
emperinter15 小时前
WordCloudStudio Now Supports AliPay for Subscriptions !
人工智能·macos·ios·信息可视化·中文分词
AirDroid_cn16 小时前
iPhone或iPad接收的文件怎么找?怎样删除?
ios·iphone·ipad·文件传输
Swift社区1 天前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
#摩斯先生1 天前
Swift从0开始学习 对象和类 day3
ios·xcode·swift
没头脑的ht1 天前
Swift内存访问冲突
开发语言·ios·swift
#摩斯先生1 天前
Swift从0开始学习 并发性 day4
ios·xcode·swift
没头脑的ht1 天前
Swift闭包的本质
开发语言·ios·swift