// // QQAppIDValidator.m // msext // // Created on 2025/06/16. // Copyright © 2025年. All rights reserved. // #import #import #import "QQShareManager.h" /** * QQ AppID配置验证工具 * 用于验证无SDK方式的QQ分享配置是否正确 */ @interface QQAppIDValidator : NSObject /** * 执行完整的QQ分享配置检查 * 包括AppID、URL Schemes、回调配置等 */ + (void)performCompleteValidation; /** * 显示配置检查结果 */ + (void)showValidationResults; /** * 生成QQ分享测试URL用于调试 */ + (NSString *)generateTestQQShareURL; @end @implementation QQAppIDValidator + (void)performCompleteValidation { NSLog(@"\n🔍 开始QQ分享配置验证...\n"); // 1. 检查QQ安装状态 BOOL isQQInstalled = [QQShareManager isQQInstalled]; NSLog(@"1️⃣ QQ安装检查: %@", isQQInstalled ? @"✅ 已安装" : @"❌ 未安装"); // 2. 检查AppID配置 BOOL isAppIDValid = [QQShareManager validateQQAppIDConfiguration]; NSString *appID = [QQShareManager getCurrentQQAppID]; NSLog(@"2️⃣ AppID配置检查: %@", isAppIDValid ? [NSString stringWithFormat:@"✅ 有效 (%@)", appID] : @"❌ 无效"); // 3. 检查URL Schemes配置 [self validateURLSchemes]; // 4. 检查回调配置 [self validateCallbackConfiguration]; // 5. 生成测试URL NSString *testURL = [self generateTestQQShareURL]; NSLog(@"5️⃣ 测试分享URL: %@", testURL); NSLog(@"\n✅ QQ分享配置验证完成\n"); } + (void)validateURLSchemes { NSArray *requiredSchemes = @[@"mqqapi", @"mqq", @"mqqOpensdkSSoLogin", @"mqqopensdkapiV2", @"mqqopensdkapiV3", @"mqqopensdkapiV4", @"wtloginmqq2", @"mqzone"]; BOOL allSchemesConfigured = YES; NSMutableArray *missingSchemes = [NSMutableArray array]; for (NSString *scheme in requiredSchemes) { NSString *testURLString = [NSString stringWithFormat:@"%@://test", scheme]; NSURL *testURL = [NSURL URLWithString:testURLString]; if (![[UIApplication sharedApplication] canOpenURL:testURL]) { allSchemesConfigured = NO; [missingSchemes addObject:scheme]; } } if (allSchemesConfigured) { NSLog(@"3️⃣ URL Schemes配置: ✅ 完整"); } else { NSLog(@"3️⃣ URL Schemes配置: ❌ 缺少 %@", [missingSchemes componentsJoinedByString:@", "]); NSLog(@" 请在Info.plist的LSApplicationQueriesSchemes中添加缺少的schemes"); } } + (void)validateCallbackConfiguration { // 检查msext回调scheme是否配置 NSURL *callbackURL = [NSURL URLWithString:@"msext://test"]; NSBundle *mainBundle = [NSBundle mainBundle]; NSDictionary *infoPlist = [mainBundle infoDictionary]; NSArray *urlTypes = infoPlist[@"CFBundleURLTypes"]; BOOL callbackConfigured = NO; for (NSDictionary *urlType in urlTypes) { NSArray *schemes = urlType[@"CFBundleURLSchemes"]; if ([schemes containsObject:@"msext"]) { callbackConfigured = YES; break; } } NSLog(@"4️⃣ 回调配置检查: %@", callbackConfigured ? @"✅ 正确" : @"❌ 缺失msext scheme"); if (!callbackConfigured) { NSLog(@" 请在Info.plist的CFBundleURLTypes中添加msext scheme配置"); } } + (NSString *)generateTestQQShareURL { NSString *appID = [QQShareManager getCurrentQQAppID]; if (!appID) { return @"❌ 无法生成测试URL:AppID未配置"; } // 构建基础的QQ分享测试URL NSMutableString *testURL = [NSMutableString stringWithString:@"mqqapi://share/to_fri?"]; [testURL appendString:@"version=1"]; [testURL appendString:@"&cflag=0"]; [testURL appendString:@"&src_type=app"]; [testURL appendString:@"&sdkv=2.9.0"]; [testURL appendString:@"&sdkp=i"]; [testURL appendFormat:@"&appid=%@", appID]; [testURL appendString:@"&app_name=进贤聚友棋牌"]; [testURL appendString:@"&callback_type=scheme"]; [testURL appendString:@"&callback_name=msext"]; [testURL appendString:@"&req_type=0"]; [testURL appendString:@"&title=测试标题"]; [testURL appendString:@"&description=测试描述"]; return testURL; } + (void)showValidationResults { dispatch_async(dispatch_get_main_queue(), ^{ UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"QQ分享配置验证" message:@"请查看控制台日志以获取详细的验证结果" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *validateAction = [UIAlertAction actionWithTitle:@"重新验证" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [self performCompleteValidation]; }]; UIAlertAction *testAction = [UIAlertAction actionWithTitle:@"测试分享" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [self performTestShare]; }]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"关闭" style:UIAlertActionStyleCancel handler:nil]; [alert addAction:validateAction]; [alert addAction:testAction]; [alert addAction:cancelAction]; UIViewController *rootVC = [UIApplication sharedApplication].keyWindow.rootViewController; UIViewController *topVC = [self topViewController:rootVC]; [topVC presentViewController:alert animated:YES completion:nil]; }); } + (void)performTestShare { NSLog(@"🧪 开始QQ分享测试..."); [QQShareManager shareToQQFriend:QQShareTypeText title:@"QQ分享配置测试" description:@"如果您看到这条消息,说明QQ分享配置正确" thumbImage:nil url:nil image:nil completion:^(BOOL success) { NSLog(@"🧪 QQ分享测试结果: %@", success ? @"✅ 成功" : @"❌ 失败"); dispatch_async(dispatch_get_main_queue(), ^{ NSString *message = success ? @"QQ分享测试成功!配置正确。" : @"QQ分享测试失败!请检查配置。"; UIAlertController *resultAlert = [UIAlertController alertControllerWithTitle:@"测试结果" message:message preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]; [resultAlert addAction:okAction]; UIViewController *rootVC = [UIApplication sharedApplication].keyWindow.rootViewController; UIViewController *topVC = [self topViewController:rootVC]; [topVC presentViewController:resultAlert animated:YES completion:nil]; }); }]; } + (UIViewController *)topViewController:(UIViewController *)rootViewController { if (rootViewController.presentedViewController == nil) { return rootViewController; } if ([rootViewController.presentedViewController isKindOfClass:[UINavigationController class]]) { UINavigationController *navigationController = (UINavigationController *)rootViewController.presentedViewController; UIViewController *lastViewController = [[navigationController viewControllers] lastObject]; return [self topViewController:lastViewController]; } if ([rootViewController.presentedViewController isKindOfClass:[UITabBarController class]]) { UITabBarController *tabBarController = (UITabBarController *)rootViewController.presentedViewController; UIViewController *selectedViewController = tabBarController.selectedViewController; return [self topViewController:selectedViewController]; } return [self topViewController:rootViewController.presentedViewController]; } @end // 便捷调用方法 void validateQQShareConfiguration(void) { [QQAppIDValidator performCompleteValidation]; } void showQQShareValidationDialog(void) { [QQAppIDValidator showValidationResults]; }