169 lines
4.7 KiB
Objective-C
169 lines
4.7 KiB
Objective-C
//
|
||
// XPTurboModeTipsManager.m
|
||
// YuMi
|
||
//
|
||
// Created by AI Assistant
|
||
// Copyright © 2024 YuMi. All rights reserved.
|
||
//
|
||
|
||
#import "XPTurboModeTipsManager.h"
|
||
#import "XPTurboModeTipsView.h"
|
||
|
||
@interface XPTurboModeTipsManager ()
|
||
|
||
@property (nonatomic, strong) XPTurboModeTipsView *currentTipsView;
|
||
@property (nonatomic, assign) BOOL isMonitoring;
|
||
@property (nonatomic, assign) BOOL hasShownTipsInCurrentSession;
|
||
|
||
@end
|
||
|
||
@implementation XPTurboModeTipsManager
|
||
|
||
#pragma mark - Singleton
|
||
|
||
+ (instancetype)sharedManager {
|
||
static XPTurboModeTipsManager *instance = nil;
|
||
static dispatch_once_t onceToken;
|
||
dispatch_once(&onceToken, ^{
|
||
instance = [[XPTurboModeTipsManager alloc] init];
|
||
});
|
||
return instance;
|
||
}
|
||
|
||
- (instancetype)init {
|
||
self = [super init];
|
||
if (self) {
|
||
_isMonitoring = NO;
|
||
_hasShownTipsInCurrentSession = NO;
|
||
[self setupNotifications];
|
||
}
|
||
return self;
|
||
}
|
||
|
||
#pragma mark - Public Methods
|
||
|
||
- (void)startTipsMonitoringInRoom {
|
||
if (self.isMonitoring) {
|
||
NSLog(@"🎮 XPTurboModeTipsManager 已经在监听中");
|
||
return;
|
||
}
|
||
|
||
self.isMonitoring = YES;
|
||
self.hasShownTipsInCurrentSession = NO;
|
||
NSLog(@"🎮 XPTurboModeTipsManager 开始在房间中监听卡顿");
|
||
}
|
||
|
||
- (void)stopTipsMonitoring {
|
||
if (!self.isMonitoring) {
|
||
return;
|
||
}
|
||
|
||
self.isMonitoring = NO;
|
||
NSLog(@"🎮 XPTurboModeTipsManager 停止监听卡顿");
|
||
}
|
||
|
||
- (void)showTipsManually {
|
||
[self showTipsWithReason:@"手动触发"];
|
||
}
|
||
|
||
#pragma mark - Private Methods
|
||
|
||
- (void)setupNotifications {
|
||
// 监听卡顿检测通知
|
||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||
selector:@selector(handleLagDetection:)
|
||
name:@"BuglyManagerDidDetectLag"
|
||
object:nil];
|
||
|
||
// 监听房间退出通知
|
||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||
selector:@selector(handleRoomExit:)
|
||
name:@"RoomDidExit"
|
||
object:nil];
|
||
}
|
||
|
||
- (void)handleLagDetection:(NSNotification *)notification {
|
||
if (!self.isMonitoring) {
|
||
NSLog(@"🎮 XPTurboModeTipsManager 未在监听状态,跳过卡顿处理");
|
||
return;
|
||
}
|
||
|
||
if (self.hasShownTipsInCurrentSession) {
|
||
NSLog(@"🎮 XPTurboModeTipsManager 当前会话已显示过 Tips,跳过");
|
||
return;
|
||
}
|
||
|
||
NSDictionary *userInfo = notification.userInfo;
|
||
NSTimeInterval duration = [userInfo[@"duration"] doubleValue];
|
||
NSString *stackTrace = userInfo[@"stackTrace"];
|
||
|
||
NSLog(@"🎮 XPTurboModeTipsManager 收到卡顿通知 - 持续时间: %.2f秒", duration);
|
||
|
||
// 延迟显示 Tips,避免在卡顿期间立即显示
|
||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||
[self showTipsWithReason:[NSString stringWithFormat:@"检测到卡顿 (%.1fs)", duration]];
|
||
});
|
||
}
|
||
|
||
- (void)handleRoomExit:(NSNotification *)notification {
|
||
NSLog(@"🎮 XPTurboModeTipsManager 房间退出,停止监听");
|
||
[self stopTipsMonitoring];
|
||
|
||
// 关闭当前 Tips 弹窗
|
||
if (self.currentTipsView) {
|
||
[self.currentTipsView dismiss];
|
||
self.currentTipsView = nil;
|
||
}
|
||
}
|
||
|
||
- (void)showTipsWithReason:(NSString *)reason {
|
||
NSLog(@"🎮 XPTurboModeTipsManager 显示 Tips - 原因: %@", reason);
|
||
|
||
// 获取当前窗口来显示弹窗
|
||
UIWindow *window = [UIApplication sharedApplication].keyWindow;
|
||
if (!window) {
|
||
// 尝试获取其他窗口
|
||
NSArray *windows = [UIApplication sharedApplication].windows;
|
||
for (UIWindow *w in windows) {
|
||
if (w.isKeyWindow) {
|
||
window = w;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!window) {
|
||
NSLog(@"🎮 XPTurboModeTipsManager 无法获取窗口,Tips 弹窗显示失败");
|
||
return;
|
||
}
|
||
|
||
// 创建并显示 Tips
|
||
self.currentTipsView = [XPTurboModeTipsView showInView:window];
|
||
self.currentTipsView.delegate = self;
|
||
|
||
// 标记已显示
|
||
self.hasShownTipsInCurrentSession = YES;
|
||
|
||
NSLog(@"🎮 Tips 弹窗创建成功,已添加到窗口");
|
||
}
|
||
|
||
#pragma mark - XPTurboModeTipsViewDelegate
|
||
|
||
- (void)turboModeTipsViewDidTapUnderstand {
|
||
NSLog(@"🎮 XPTurboModeTipsManager 用户点击了 'I understand' 按钮");
|
||
|
||
// 关闭 Tips 弹窗
|
||
if (self.currentTipsView) {
|
||
[self.currentTipsView dismiss];
|
||
self.currentTipsView = nil;
|
||
}
|
||
}
|
||
|
||
#pragma mark - Dealloc
|
||
|
||
- (void)dealloc {
|
||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||
}
|
||
|
||
@end
|