CustomJitsiLogger.m 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. //
  2. // CustomJitsiLogger.m
  3. // AIIM
  4. //
  5. // Created by qitewei on 2025/6/6.
  6. //
  7. #import "CustomJitsiLogger.h"
  8. @implementation CustomJitsiLogger{
  9. BOOL _remoteReportingEnabled;
  10. BOOL _debugLoggingEnabled;
  11. }
  12. + (instancetype)sharedHandler {
  13. static CustomJitsiLogger *sharedInstance = nil;
  14. static dispatch_once_t onceToken;
  15. dispatch_once(&onceToken, ^{
  16. sharedInstance = [[self alloc] init];
  17. sharedInstance.criticalErrors = [NSMutableArray array];
  18. });
  19. return sharedInstance;
  20. }
  21. #pragma mark - 配置方法
  22. - (void)enableRemoteReporting:(BOOL)enabled {
  23. _remoteReportingEnabled = enabled;
  24. }
  25. - (void)enableDebugLogging:(BOOL)enabled {
  26. _debugLoggingEnabled = enabled;
  27. }
  28. #pragma mark - 日志处理方法
  29. - (void)logVerbose:(NSString *)msg {
  30. if (_debugLoggingEnabled) {
  31. NSLog(@"[JitsiMeet][VERBOSE] %@", msg);
  32. }
  33. }
  34. - (void)logDebug:(NSString *)msg {
  35. if (_debugLoggingEnabled) {
  36. NSLog(@"[JitsiMeet][DEBUG] %@", msg);
  37. }
  38. }
  39. - (void)logInfo:(NSString *)msg {
  40. NSLog(@"[JitsiMeet][INFO] %@", msg);
  41. }
  42. - (void)logWarn:(NSString *)msg {
  43. NSLog(@"[JitsiMeet][WARN] %@", msg);
  44. [self checkPotentialIssues:msg];
  45. }
  46. - (void)logError:(NSString *)msg {
  47. NSLog(@"[JitsiMeet][ERROR] %@", msg);
  48. self.errorCount++;
  49. // 关键错误处理
  50. if ([self isCriticalError:msg]) {
  51. [self.criticalErrors addObject:msg];
  52. [self handleCriticalError:msg];
  53. }
  54. // 远程上报
  55. if (_remoteReportingEnabled) {
  56. [self reportErrorToAnalytics:msg];
  57. }
  58. }
  59. #pragma mark - 私有方法
  60. - (BOOL)isCriticalError:(NSString *)error {
  61. NSArray *criticalKeywords = @[@"disconnect", @"timeout", @"failed", @"exception", @"error"];
  62. for (NSString *keyword in criticalKeywords) {
  63. if ([error.lowercaseString containsString:keyword]) {
  64. return YES;
  65. }
  66. }
  67. return NO;
  68. }
  69. - (void)handleCriticalError:(NSString *)error {
  70. dispatch_async(dispatch_get_main_queue(), ^{
  71. if ([error containsString:@"Websocket error"]) {
  72. !self.WebsocketErrorBlock ?:self.WebsocketErrorBlock();
  73. }
  74. });
  75. }
  76. - (void)reportErrorToAnalytics:(NSString *)error {
  77. // Firebase Crashlytics 上报
  78. NSError *reportError = [NSError errorWithDomain:@"JitsiMeetErrorDomain"
  79. code:-1
  80. userInfo:@{NSLocalizedDescriptionKey: error}];
  81. }
  82. - (void)checkPotentialIssues:(NSString *)warning {
  83. if ([warning containsString:@"bandwidth"]) {
  84. NSLog(@"[JitsiMeet] 检测到带宽问题警告");
  85. }
  86. }
  87. @end