接入微信分享 SDK 并配置 Universal Link。

集成 WechatOpenSDK、www.zhifly.cn/suixinkan/ 通用链接与邀请页分享能力,附带 AASA 部署文件与单元测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-02 15:02:37 +08:00
parent 5d34cda730
commit a528d9b0d7
48 changed files with 5260 additions and 506 deletions

View File

@ -0,0 +1,119 @@
//
// WeChatManager.swift
// suixinkan
//
import Foundation
import WechatOpenSDK
/// SDK URL/Universal Link
@MainActor
final class WeChatManager: NSObject {
static let shared = WeChatManager()
/// UI
private(set) var lastShareResult: WeChatShareResult?
private var shareCompletion: ((WeChatShareResult) -> Void)?
private var isRegistered = false
private override init() {
super.init()
}
/// AppID Universal Link
func registerIfNeeded() {
guard !isRegistered else { return }
guard WeChatConfig.validateUniversalLink(WeChatConfig.universalLink) else {
assertionFailure("WeChat Universal Link 必须以 https 开头并以 / 结尾")
return
}
#if DEBUG
WXApi.startLog(by: WXLogLevel.detail) { log in
print("WeChatSDK: \(log)")
}
#endif
let success = WXApi.registerApp(WeChatConfig.appID, universalLink: WeChatConfig.universalLink)
isRegistered = success
#if DEBUG
if success {
checkUniversalLinkReady()
}
#endif
}
/// URL Scheme
@discardableResult
func handleOpenURL(_ url: URL) -> Bool {
WXApi.handleOpen(url, delegate: self)
}
/// Universal Link
@discardableResult
func handleContinueUserActivity(_ userActivity: NSUserActivity) -> Bool {
WXApi.handleOpenUniversalLink(userActivity, delegate: self)
}
///
func setShareCompletion(_ completion: ((WeChatShareResult) -> Void)?) {
shareCompletion = completion
}
///
func sendShareRequest(_ request: SendMessageToWXReq, completion: ((WeChatShareResult) -> Void)? = nil) {
guard WXApi.isWXAppInstalled() else {
let result = WeChatShareResult.notInstalled
completion?(result)
return
}
guard WXApi.isWXAppSupport() else {
let result = WeChatShareResult.unsupported
completion?(result)
return
}
if let completion {
shareCompletion = completion
}
WXApi.send(request) { success in
if !success {
Task { @MainActor in
self.finishShare(with: .sendFailed(-1))
}
}
}
}
#if DEBUG
/// Universal Link DEBUG
private func checkUniversalLinkReady() {
WXApi.checkUniversalLinkReady { step, result in
print("WeChat UL check step=\(step.rawValue) success=\(result.success) info=\(result.errorInfo ?? "") suggestion=\(result.suggestion ?? "")")
}
}
#endif
private func finishShare(with result: WeChatShareResult) {
lastShareResult = result
shareCompletion?(result)
shareCompletion = nil
}
}
extension WeChatManager: WXApiDelegate {
nonisolated func onReq(_ req: BaseReq) {
//
}
nonisolated func onResp(_ resp: BaseResp) {
guard let shareResp = resp as? SendMessageToWXResp else { return }
let result = WeChatShareResult.fromWXErrorCode(shareResp.errCode)
Task { @MainActor in
self.finishShare(with: result)
}
}
}