Phase 4.F:微信截图分享 type=2 / 远端图分享 type=其它

按 msext gameController.m:637-678 字面行为,WechatShare 按 content.type
分发:
- type=1 → shareLink(已有)
- type=2 → captureScreenshot → JPEG 0.6 + thumb 0.4x → shareImage
- type=其它 → downloadRemote(URL) → JPEG 0.9 + thumb 0.4x → shareImage

新增:
- ImageProvider.scaledThumb(_:scale:):等价 msext FuncPublic
  imageByScalingAndCroppingForSize 0.4x 缩放;微信 SDK setThumbImage:
  内部再压到 32KB
- WeChatManager.ShareImage 结构 + shareImage(_:scene:) 异步包装
  (WXImageObject + WXMediaMessage.setThumbImage,FIFO 串行复用 sharePending)

契约:与 type=1 一致,调成功 → sharesuccess 反向 callback(success/cancelled
都发);errCode=-2 → cancelled;其它 errCode → failed。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
joywayer
2026-06-23 01:33:17 +08:00
co-authored by Claude Opus 4.7
parent d9d9554d9f
commit 8e4c36d1c8
3 changed files with 96 additions and 11 deletions
+38 -11
View File
@@ -9,6 +9,7 @@
//
import Foundation
import UIKit
#if canImport(WechatOpenSDK)
import WechatOpenSDK
@@ -37,18 +38,44 @@ public final class WechatShare: SharePlatform {
return .notInstalled(platform: name)
}
let wxScene: WeChatManager.ShareScene = (scene == .timeline) ? .timeline : .session
// type == "1" SDK / Phase 4.F
// WXImageObject + WXMediaMessage.thumbData
do {
try await WeChatManager.shared.shareLink(
.init(
url: content.webpageUrl,
title: content.title,
desc: content.desc,
thumbnailURL: nil // type=2/3 Phase 4.F
),
scene: wxScene
)
switch content.type {
case "1":
// msext gameController.m:613-635
try await WeChatManager.shared.shareLink(
.init(
url: content.webpageUrl,
title: content.title,
desc: content.desc,
thumbnailURL: nil
),
scene: wxScene
)
case "2":
// msext gameController.m:637-658
let shot = try ImageProvider.captureScreenshot()
guard let imageData = shot.jpegData(compressionQuality: 0.6) else {
return .failed(reason: "screenshot JPEG encode failed")
}
let thumb = ImageProvider.scaledThumb(shot)
try await WeChatManager.shared.shareImage(
.init(imageData: imageData, thumb: thumb),
scene: wxScene
)
default:
// msext gameController.m:659-680type URL
let remote = try await ImageProvider.downloadRemote(content.webpageUrl)
// msext data UIImage decode
// jpegData
guard let imageData = remote.jpegData(compressionQuality: 0.9) else {
return .failed(reason: "remote image JPEG encode failed")
}
let thumb = ImageProvider.scaledThumb(remote)
try await WeChatManager.shared.shareImage(
.init(imageData: imageData, thumb: thumb),
scene: wxScene
)
}
return .success
} catch let WeChatError.shareFailed(errCode) {
if errCode == -2 { return .cancelled }