集成 WechatOpenSDK、www.zhifly.cn/suixinkan/ 通用链接与邀请页分享能力,附带 AASA 部署文件与单元测试。 Co-authored-by: Cursor <cursoragent@cursor.com>
116 lines
3.9 KiB
Swift
116 lines
3.9 KiB
Swift
//
|
||
// WeChatShareService.swift
|
||
// suixinkan
|
||
//
|
||
|
||
import UIKit
|
||
import WechatOpenSDK
|
||
|
||
/// 微信分享服务,封装文本、网页、图片分享能力(不含支付)。
|
||
enum WeChatShareService {
|
||
/// 是否已安装微信且支持 Open SDK。
|
||
static var isWeChatAvailable: Bool {
|
||
WXApi.isWXAppInstalled() && WXApi.isWXAppSupport()
|
||
}
|
||
|
||
/// 分享纯文本到微信。
|
||
@MainActor
|
||
static func shareText(
|
||
_ payload: WeChatTextSharePayload,
|
||
scene: WeChatShareScene,
|
||
completion: ((WeChatShareResult) -> Void)? = nil
|
||
) {
|
||
let trimmed = payload.text.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
guard !trimmed.isEmpty else {
|
||
completion?(.invalidPayload("分享文本不能为空"))
|
||
return
|
||
}
|
||
|
||
let request = SendMessageToWXReq()
|
||
request.bText = true
|
||
request.text = trimmed
|
||
request.scene = scene.wxSceneValue
|
||
WeChatManager.shared.sendShareRequest(request, completion: completion)
|
||
}
|
||
|
||
/// 分享网页链接到微信。
|
||
@MainActor
|
||
static func shareWebPage(
|
||
_ payload: WeChatWebPageSharePayload,
|
||
scene: WeChatShareScene,
|
||
thumbImage: UIImage? = nil,
|
||
completion: ((WeChatShareResult) -> Void)? = nil
|
||
) {
|
||
let title = payload.title.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
let url = payload.url.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
guard !title.isEmpty else {
|
||
completion?(.invalidPayload("分享标题不能为空"))
|
||
return
|
||
}
|
||
guard !url.isEmpty else {
|
||
completion?(.invalidPayload("分享链接不能为空"))
|
||
return
|
||
}
|
||
|
||
let webpageObject = WXWebpageObject()
|
||
webpageObject.webpageUrl = url
|
||
|
||
let message = WXMediaMessage()
|
||
message.title = title
|
||
message.description = payload.description
|
||
message.mediaObject = webpageObject
|
||
if let thumbImage, let thumbData = WeChatThumbImageProcessor.makeThumbData(from: thumbImage) {
|
||
message.thumbData = thumbData
|
||
}
|
||
|
||
let request = SendMessageToWXReq()
|
||
request.bText = false
|
||
request.message = message
|
||
request.scene = scene.wxSceneValue
|
||
WeChatManager.shared.sendShareRequest(request, completion: completion)
|
||
}
|
||
|
||
/// 分享图片到微信。
|
||
@MainActor
|
||
static func shareImage(
|
||
_ payload: WeChatImageSharePayload,
|
||
scene: WeChatShareScene,
|
||
thumbImage: UIImage? = nil,
|
||
completion: ((WeChatShareResult) -> Void)? = nil
|
||
) {
|
||
guard !payload.imageData.isEmpty else {
|
||
completion?(.invalidPayload("分享图片不能为空"))
|
||
return
|
||
}
|
||
|
||
let imageObject = WXImageObject()
|
||
imageObject.imageData = payload.imageData
|
||
|
||
let message = WXMediaMessage()
|
||
message.mediaObject = imageObject
|
||
if let thumbImage, let thumbData = WeChatThumbImageProcessor.makeThumbData(from: thumbImage) {
|
||
message.thumbData = thumbData
|
||
} else if let image = UIImage(data: payload.imageData),
|
||
let thumbData = WeChatThumbImageProcessor.makeThumbData(from: image) {
|
||
message.thumbData = thumbData
|
||
}
|
||
|
||
let request = SendMessageToWXReq()
|
||
request.bText = false
|
||
request.message = message
|
||
request.scene = scene.wxSceneValue
|
||
WeChatManager.shared.sendShareRequest(request, completion: completion)
|
||
}
|
||
|
||
/// 获取 App 图标,用作分享缩略图兜底。
|
||
static func defaultThumbImage() -> UIImage? {
|
||
guard let icons = Bundle.main.infoDictionary?["CFBundleIcons"] as? [String: Any],
|
||
let primary = icons["CFBundlePrimaryIcon"] as? [String: Any],
|
||
let iconFiles = primary["CFBundleIconFiles"] as? [String],
|
||
let iconName = iconFiles.last else {
|
||
return nil
|
||
}
|
||
return UIImage(named: iconName)
|
||
}
|
||
}
|