- 新增 WechatShareManager:封装微信分享逻辑,支持ShareContent对象 - 增强 DouyinShareManager:新增ShareContent支持和分享引导功能 - 优化 QQShareManager:支持截图/纯文本分享类型自动识别 - 重构 SharePanel:简化为UI调度层,移除具体分享实现 - 实现职责分离:各Manager专注自己的平台分享逻辑 - 提升可维护性:修改某平台不影响其他平台 - 增强可扩展性:新增分享平台更容易实现
266 lines
9.2 KiB
Objective-C
266 lines
9.2 KiB
Objective-C
//
|
||
// 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
|