2026-05-02 22:57:55 +08:00
|
|
|
|
# iOS 版本更新接入指南
|
|
|
|
|
|
|
|
|
|
|
|
**模块**:`XuqmUpdate` · **功能**:App 版本检查、App Store 跳转
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 1. 添加依赖
|
|
|
|
|
|
|
|
|
|
|
|
在 `Package.swift` 中按需引入:
|
|
|
|
|
|
|
|
|
|
|
|
```swift
|
|
|
|
|
|
.target(
|
|
|
|
|
|
name: "MyApp",
|
|
|
|
|
|
dependencies: [
|
|
|
|
|
|
.product(name: "XuqmUpdate", package: "XuqmGroup-iOSSDK"),
|
|
|
|
|
|
]
|
|
|
|
|
|
)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 2. 检查更新
|
|
|
|
|
|
|
|
|
|
|
|
```swift
|
|
|
|
|
|
import XuqmUpdate
|
|
|
|
|
|
|
|
|
|
|
|
let appInfo = try await UpdateSDK.shared.checkAppUpdate(currentVersionCode: 1)
|
|
|
|
|
|
if let info = appInfo, info.needsUpdate {
|
|
|
|
|
|
print("发现新版本: \(info.versionName ?? "")")
|
|
|
|
|
|
print("更新日志: \(info.changeLog ?? "")")
|
|
|
|
|
|
|
|
|
|
|
|
if info.forceUpdate == true {
|
|
|
|
|
|
// 强制更新
|
|
|
|
|
|
showForceUpdateAlert(info)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 可选更新
|
|
|
|
|
|
showOptionalUpdateAlert(info)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 3. 跳转 App Store
|
|
|
|
|
|
|
|
|
|
|
|
```swift
|
|
|
|
|
|
if let url = appInfo?.appStoreUrl {
|
|
|
|
|
|
UpdateSDK.shared.openAppStore(url: url)
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
`openAppStore` 会调用 `UIApplication.shared.open()` 打开 App Store 页面,引导用户前往商店更新。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 4. 强制更新处理
|
|
|
|
|
|
|
|
|
|
|
|
当服务端返回 `forceUpdate = true` 时,建议业务层:
|
|
|
|
|
|
|
|
|
|
|
|
1. 弹出 `UIAlertController`,设置 `isUserInteractionEnabled = false` 禁止关闭
|
|
|
|
|
|
2. 只允许用户点击「前往更新」
|
|
|
|
|
|
3. 调用 `UpdateSDK.shared.openAppStore(url:)` 跳转 App Store
|
|
|
|
|
|
|
|
|
|
|
|
```swift
|
|
|
|
|
|
func showForceUpdateAlert(_ info: AppUpdateInfo) {
|
|
|
|
|
|
let alert = UIAlertController(
|
|
|
|
|
|
title: "发现重要更新",
|
|
|
|
|
|
message: "当前版本已不可用,请升级至 \(info.versionName ?? "最新版")",
|
|
|
|
|
|
preferredStyle: .alert
|
|
|
|
|
|
)
|
|
|
|
|
|
alert.addAction(UIAlertAction(title: "前往更新", style: .default) { _ in
|
|
|
|
|
|
if let url = info.appStoreUrl ?? info.downloadUrl {
|
|
|
|
|
|
UpdateSDK.shared.openAppStore(url: url)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
present(alert, animated: true)
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 5. 多模块统一登录
|
|
|
|
|
|
|
|
|
|
|
|
Update 模块与 IM、Push 模块共享同一套登录态:
|
|
|
|
|
|
|
|
|
|
|
|
```swift
|
|
|
|
|
|
// 初始化
|
|
|
|
|
|
XuqmSDK.shared.initialize(config: config)
|
|
|
|
|
|
|
|
|
|
|
|
// 登录(业务登录成功后调用一次)
|
|
|
|
|
|
try await XuqmSDK.shared.login(userId: "user_001", userSig: userSig)
|
2026-05-03 00:11:06 +08:00
|
|
|
|
// UpdateSDK 在 checkAppUpdate 时自动携带 appKey,无需额外登录操作
|
2026-05-02 22:57:55 +08:00
|
|
|
|
```
|
2026-05-03 00:11:06 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 6. 一键打包上传
|
|
|
|
|
|
|
|
|
|
|
|
SDK 提供 Fastlane `xuqm_release` lane,可一键完成 Archive、导出并上传至 XuqmGroup 版本管理服务:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
fastlane xuqm_release
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
`Fastfile` 示例配置:
|
|
|
|
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
|
|
lane :xuqm_release do
|
|
|
|
|
|
gym(
|
|
|
|
|
|
scheme: "MyApp",
|
|
|
|
|
|
export_method: "app-store",
|
|
|
|
|
|
output_directory: "build"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
xuqm_upload(
|
|
|
|
|
|
ipa_path: "build/MyApp.ipa",
|
|
|
|
|
|
release_notes: File.read("CHANGELOG.md"),
|
|
|
|
|
|
force_update: false
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
任务执行流程:
|
|
|
|
|
|
1. 执行 `gym` 构建 Release IPA
|
|
|
|
|
|
2. 自动提取版本号、build 号、更新日志
|
|
|
|
|
|
3. 上传 IPA 到 XuqmGroup 后台
|
|
|
|
|
|
4. 返回发布结果
|