feat: 重构分享功能 - 将各平台分享逻辑整理到对应Manager中

- 新增 WechatShareManager:封装微信分享逻辑,支持ShareContent对象
- 增强 DouyinShareManager:新增ShareContent支持和分享引导功能
- 优化 QQShareManager:支持截图/纯文本分享类型自动识别
- 重构 SharePanel:简化为UI调度层,移除具体分享实现
- 实现职责分离:各Manager专注自己的平台分享逻辑
- 提升可维护性:修改某平台不影响其他平台
- 增强可扩展性:新增分享平台更容易实现
This commit is contained in:
joywayer
2025-06-17 19:55:44 +08:00
parent 1666d6cf24
commit 2296c65974
13 changed files with 3730 additions and 2 deletions

View File

@@ -0,0 +1,265 @@
//
// WechatShareManager.m
// msext
//
// Created on 2025/06/17.
// Copyright © 2025. All rights reserved.
//
#import "WechatShareManager.h"
#import "WXApiManager.h"
#import "WXApiRequestHandler.h"
#import "FuncPublic.h"
@implementation WechatShareManager
#pragma mark - Public Methods
+ (BOOL)isWechatInstalled {
return [WXApi isWXAppInstalled];
}
+ (void)shareWithContent:(id)shareContent
completion:(void (^ _Nullable)(BOOL success))completion {
NSLog(@"🔍 [WechatShareManager] 开始微信分享");
//
if (![self isWechatInstalled]) {
NSLog(@"❌ [WechatShareManager] 微信未安装");
if (completion) {
completion(NO);
}
return;
}
// ShareContent
if (!shareContent) {
NSLog(@"❌ [WechatShareManager] ShareContent对象为空");
if (completion) {
completion(NO);
}
return;
}
// KVCShareContent
NSString *title = nil;
NSString *description = nil;
NSString *webpageUrl = nil;
NSString *type = nil;
NSString *sharefriend = nil;
@try {
if ([shareContent respondsToSelector:@selector(valueForKey:)]) {
title = [shareContent valueForKey:@"title"];
description = [shareContent valueForKey:@"desc"];
webpageUrl = [shareContent valueForKey:@"webpageUrl"];
type = [shareContent valueForKey:@"type"];
sharefriend = [shareContent valueForKey:@"sharefriend"];
}
NSLog(@"🔍 [WechatShareManager] 从ShareContent提取参数:");
NSLog(@"🔍 - 标题: %@", title ?: @"(无)");
NSLog(@"🔍 - 描述: %@", description ?: @"(无)");
NSLog(@"🔍 - 链接: %@", webpageUrl ?: @"(无)");
NSLog(@"🔍 - 类型: %@", type ?: @"(无)");
NSLog(@"🔍 - 分享目标: %@", sharefriend ?: @"(无)");
} @catch (NSException *exception) {
NSLog(@"❌ [WechatShareManager] 解析ShareContent时发生异常: %@", exception.reason);
if (completion) {
completion(NO);
}
return;
}
//
enum WXScene currentScene;
if ([sharefriend intValue] == 1) {
currentScene = WXSceneSession; //
NSLog(@"🔍 [WechatShareManager] 分享目标: 微信好友");
} else {
currentScene = WXSceneTimeline; //
NSLog(@"🔍 [WechatShareManager] 分享目标: 微信朋友圈");
}
//
UIImage *thumbImage = [self getAppIconImage];
//
BOOL isScreenshotShare = [type intValue] == 2;
if (isScreenshotShare) {
//
NSLog(@"🔍 [WechatShareManager] 执行截图分享");
UIImage *screenImage = [FuncPublic getImageWithFullScreenshot];
if (screenImage) {
NSData *imageData = UIImageJPEGRepresentation(screenImage, 0.6);
[WXApiRequestHandler sendImageData:imageData
TagName:[NSString stringWithFormat:@"%@游戏截图分享", @"进贤聚友棋牌"]
MessageExt:description ?: @""
Action:@"share_action"
ThumbImage:thumbImage
InScene:currentScene];
NSLog(@"✅ [WechatShareManager] 截图分享请求已发送");
} else {
NSLog(@"❌ [WechatShareManager] 截图获取失败");
if (completion) {
completion(NO);
}
return;
}
} else {
//
NSLog(@"🔍 [WechatShareManager] 执行链接分享");
[WXApiRequestHandler sendLinkURL:webpageUrl ?: @""
TagName:[NSString stringWithFormat:@"%@游戏分享", @"进贤聚友棋牌"]
Title:title ?: @""
Description:description ?: @""
ThumbImage:thumbImage
InScene:currentScene];
NSLog(@"✅ [WechatShareManager] 链接分享请求已发送");
}
// AppDelegate
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"✅ [WechatShareManager] 分享完成");
if (completion) {
completion(YES);
}
});
}
+ (void)shareLinkToWechat:(NSString *)url
title:(NSString * _Nullable)title
description:(NSString * _Nullable)description
thumbImage:(UIImage * _Nullable)thumbImage
scene:(WechatScene)scene
completion:(void (^ _Nullable)(BOOL success))completion {
//
if (![self isWechatInstalled]) {
NSLog(@"❌ [WechatShareManager] 微信未安装");
if (completion) {
completion(NO);
}
return;
}
enum WXScene wxScene = (scene == WechatSceneSession) ? WXSceneSession : WXSceneTimeline;
[WXApiRequestHandler sendLinkURL:url ?: @""
TagName:@"游戏分享"
Title:title ?: @""
Description:description ?: @""
ThumbImage:thumbImage ?: [self getAppIconImage]
InScene:wxScene];
//
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (completion) {
completion(YES);
}
});
}
+ (void)shareImageToWechat:(UIImage *)image
tagName:(NSString * _Nullable)tagName
messageExt:(NSString * _Nullable)messageExt
thumbImage:(UIImage * _Nullable)thumbImage
scene:(WechatScene)scene
completion:(void (^ _Nullable)(BOOL success))completion {
//
if (![self isWechatInstalled]) {
NSLog(@"❌ [WechatShareManager] 微信未安装");
if (completion) {
completion(NO);
}
return;
}
if (!image) {
NSLog(@"❌ [WechatShareManager] 图片为空");
if (completion) {
completion(NO);
}
return;
}
enum WXScene wxScene = (scene == WechatSceneSession) ? WXSceneSession : WXSceneTimeline;
NSData *imageData = UIImageJPEGRepresentation(image, 0.6);
[WXApiRequestHandler sendImageData:imageData
TagName:tagName ?: @"图片分享"
MessageExt:messageExt ?: @""
Action:@"share_action"
ThumbImage:thumbImage ?: [self getAppIconImage]
InScene:wxScene];
//
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (completion) {
completion(YES);
}
});
}
+ (UIImage *)getAppIconImage {
//
UIImage *appIcon = nil;
// 1: Info.plist
NSDictionary *infoPlist = [[NSBundle mainBundle] infoDictionary];
NSArray *iconFiles = infoPlist[@"CFBundleIconFiles"];
if (iconFiles && iconFiles.count > 0) {
NSString *iconFileName = [iconFiles lastObject]; //
appIcon = [UIImage imageNamed:iconFileName];
}
// 2:
if (!appIcon) {
NSArray *commonIconNames = @[@"Icon-180", @"Icon180", @"AppIcon60x60@3x", @"AppIcon"];
for (NSString *iconName in commonIconNames) {
appIcon = [UIImage imageNamed:iconName];
if (appIcon) break;
}
}
// 3: SharePanelsharelogo
if (!appIcon) {
appIcon = [UIImage imageNamed:@"sharelogo"];
}
// :
if (!appIcon) {
//
UIGraphicsBeginImageContextWithOptions(CGSizeMake(60, 60), NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
//
CGContextSetFillColorWithColor(context, [UIColor colorWithRed:0.2 green:0.6 blue:1.0 alpha:1.0].CGColor);
CGContextFillEllipseInRect(context, CGRectMake(0, 0, 60, 60));
//
NSString *text = @"游戏";
NSDictionary *attributes = @{
NSFontAttributeName: [UIFont boldSystemFontOfSize:16],
NSForegroundColorAttributeName: [UIColor whiteColor]
};
CGSize textSize = [text sizeWithAttributes:attributes];
CGPoint textPoint = CGPointMake((60 - textSize.width) / 2, (60 - textSize.height) / 2);
[text drawAtPoint:textPoint withAttributes:attributes];
appIcon = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
return appIcon;
}
@end