feat: add WeChat sharing and invite flow
This commit is contained in:
115
suixinkan/Core/WeChat/WeChatShareService.swift
Normal file
115
suixinkan/Core/WeChat/WeChatShareService.swift
Normal file
@ -0,0 +1,115 @@
|
||||
//
|
||||
// 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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user