Files
youle_app_ios/msext/Class/Utils/WechatShareManager.m
joywayer 2296c65974 feat: 重构分享功能 - 将各平台分享逻辑整理到对应Manager中
- 新增 WechatShareManager:封装微信分享逻辑,支持ShareContent对象
- 增强 DouyinShareManager:新增ShareContent支持和分享引导功能
- 优化 QQShareManager:支持截图/纯文本分享类型自动识别
- 重构 SharePanel:简化为UI调度层,移除具体分享实现
- 实现职责分离:各Manager专注自己的平台分享逻辑
- 提升可维护性:修改某平台不影响其他平台
- 增强可扩展性:新增分享平台更容易实现
2025-06-17 19:55:44 +08:00

266 lines
9.2 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// 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