feat: 重构分享功能 - 将各平台分享逻辑整理到对应Manager中
- 新增 WechatShareManager:封装微信分享逻辑,支持ShareContent对象 - 增强 DouyinShareManager:新增ShareContent支持和分享引导功能 - 优化 QQShareManager:支持截图/纯文本分享类型自动识别 - 重构 SharePanel:简化为UI调度层,移除具体分享实现 - 实现职责分离:各Manager专注自己的平台分享逻辑 - 提升可维护性:修改某平台不影响其他平台 - 增强可扩展性:新增分享平台更容易实现
This commit is contained in:
265
msext/Class/Utils/WechatShareManager.m
Normal file
265
msext/Class/Utils/WechatShareManager.m
Normal 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;
|
||||
}
|
||||
|
||||
// 通过KVC从ShareContent对象中提取参数
|
||||
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: 从SharePanel中查找sharelogo
|
||||
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
|
||||
Reference in New Issue
Block a user