LKSConfigManager.m 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #ifdef SHOULD_COMPILE_LOOKIN_SERVER
  2. //
  3. // LKSConfigManager.m
  4. // LookinServer
  5. //
  6. // Created by likai.123 on 2023/1/10.
  7. //
  8. #import "LKSConfigManager.h"
  9. #import "NSArray+Lookin.h"
  10. #import "CALayer+LookinServer.h"
  11. @implementation LKSConfigManager
  12. + (NSArray<NSString *> *)collapsedClassList {
  13. NSArray<NSString *> *result = [self queryCollapsedClassListWithClass:[NSObject class] selector:@"lookin_collapsedClassList"];
  14. if (result) {
  15. return result;
  16. }
  17. // Legacy logic. Deprecated.
  18. Class configClass = NSClassFromString(@"LookinConfig");
  19. if (!configClass) {
  20. return nil;
  21. }
  22. NSArray<NSString *> *legacyCodeResult = [self queryCollapsedClassListWithClass:configClass selector:@"collapsedClasses"];
  23. return legacyCodeResult;
  24. }
  25. + (NSArray<NSString *> *)queryCollapsedClassListWithClass:(Class)class selector:(NSString *)selectorName {
  26. SEL selector = NSSelectorFromString(selectorName);
  27. if (![class respondsToSelector:selector]) {
  28. return nil;
  29. }
  30. NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[class methodSignatureForSelector:selector]];
  31. [invocation setTarget:class];
  32. [invocation setSelector:selector];
  33. [invocation invoke];
  34. void *arrayValue;
  35. [invocation getReturnValue:&arrayValue];
  36. id classList = (__bridge id)(arrayValue);
  37. if ([classList isKindOfClass:[NSArray class]]) {
  38. NSArray *validClassList = [((NSArray *)classList) lookin_filter:^BOOL(id obj) {
  39. return [obj isKindOfClass:[NSString class]];
  40. }];
  41. return [validClassList copy];
  42. }
  43. return nil;
  44. }
  45. + (NSDictionary<NSString *, UIColor *> *)colorAlias {
  46. NSDictionary<NSString *, UIColor *> *result = [self queryColorAliasWithClass:[NSObject class] selector:@"lookin_colorAlias"];
  47. if (result) {
  48. return result;
  49. }
  50. // Legacy logic. Deprecated.
  51. Class configClass = NSClassFromString(@"LookinConfig");
  52. if (!configClass) {
  53. return nil;
  54. }
  55. NSDictionary<NSString *, UIColor *> *legacyCodeResult = [self queryColorAliasWithClass:configClass selector:@"colors"];
  56. return legacyCodeResult;
  57. }
  58. + (NSDictionary<NSString *, UIColor *> *)queryColorAliasWithClass:(Class)class selector:(NSString *)selectorName {
  59. SEL selector = NSSelectorFromString(selectorName);
  60. if (![class respondsToSelector:selector]) {
  61. return nil;
  62. }
  63. NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[class methodSignatureForSelector:selector]];
  64. [invocation setTarget:class];
  65. [invocation setSelector:selector];
  66. [invocation invoke];
  67. void *dictValue;
  68. [invocation getReturnValue:&dictValue];
  69. id colorAlias = (__bridge id)(dictValue);
  70. if ([colorAlias isKindOfClass:[NSDictionary class]]) {
  71. NSMutableDictionary *validDictionary = [NSMutableDictionary dictionary];
  72. [(NSDictionary *)colorAlias enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
  73. if ([key isKindOfClass:[NSString class]]) {
  74. if ([obj isKindOfClass:[UIColor class]]) {
  75. [validDictionary setObject:obj forKey:key];
  76. } else if ([obj isKindOfClass:[NSDictionary class]]) {
  77. __block BOOL isValidSubDict = YES;
  78. [((NSDictionary *)obj) enumerateKeysAndObjectsUsingBlock:^(id _Nonnull subKey, id _Nonnull subObj, BOOL * _Nonnull stop) {
  79. if (![subKey isKindOfClass:[NSString class]] || ![subObj isKindOfClass:[UIColor class]]) {
  80. isValidSubDict = NO;
  81. *stop = YES;
  82. }
  83. }];
  84. if (isValidSubDict) {
  85. [validDictionary setObject:obj forKey:key];
  86. }
  87. }
  88. }
  89. }];
  90. return [validDictionary copy];
  91. }
  92. return nil;
  93. }
  94. + (BOOL)shouldCaptureScreenshotOfLayer:(CALayer *)layer {
  95. if (!layer) {
  96. return YES;
  97. }
  98. if (![self shouldCaptureImageOfLayer:layer]) {
  99. return NO;
  100. }
  101. UIView *view = layer.lks_hostView;
  102. if (!view) {
  103. return YES;
  104. }
  105. if (![self shouldCaptureImageOfView:view]) {
  106. return NO;
  107. }
  108. return YES;
  109. }
  110. + (BOOL)shouldCaptureImageOfLayer:(CALayer *)layer {
  111. if (!layer) {
  112. return YES;
  113. }
  114. SEL selector = NSSelectorFromString(@"lookin_shouldCaptureImageOfLayer:");
  115. if ([NSObject respondsToSelector:selector]) {
  116. NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[NSObject methodSignatureForSelector:selector]];
  117. [invocation setTarget:[NSObject class]];
  118. [invocation setSelector:selector];
  119. [invocation setArgument:&layer atIndex:2];
  120. [invocation invoke];
  121. BOOL resultValue = YES;
  122. [invocation getReturnValue:&resultValue];
  123. if (!resultValue) {
  124. return NO;
  125. }
  126. }
  127. SEL selector2 = NSSelectorFromString(@"lookin_shouldCaptureImage");
  128. if ([layer respondsToSelector:selector2]) {
  129. NSInvocation *invocation2 = [NSInvocation invocationWithMethodSignature:[layer methodSignatureForSelector:selector2]];
  130. [invocation2 setTarget:layer];
  131. [invocation2 setSelector:selector2];
  132. [invocation2 invoke];
  133. BOOL resultValue2 = YES;
  134. [invocation2 getReturnValue:&resultValue2];
  135. if (!resultValue2) {
  136. return NO;
  137. }
  138. }
  139. return YES;
  140. }
  141. + (BOOL)shouldCaptureImageOfView:(UIView *)view {
  142. if (!view) {
  143. return YES;
  144. }
  145. SEL selector = NSSelectorFromString(@"lookin_shouldCaptureImageOfView:");
  146. if ([NSObject respondsToSelector:selector]) {
  147. NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[NSObject methodSignatureForSelector:selector]];
  148. [invocation setTarget:[NSObject class]];
  149. [invocation setSelector:selector];
  150. [invocation setArgument:&view atIndex:2];
  151. [invocation invoke];
  152. BOOL resultValue = YES;
  153. [invocation getReturnValue:&resultValue];
  154. if (!resultValue) {
  155. return NO;
  156. }
  157. }
  158. SEL selector2 = NSSelectorFromString(@"lookin_shouldCaptureImage");
  159. if ([view respondsToSelector:selector2]) {
  160. NSInvocation *invocation2 = [NSInvocation invocationWithMethodSignature:[view methodSignatureForSelector:selector2]];
  161. [invocation2 setTarget:view];
  162. [invocation2 setSelector:selector2];
  163. [invocation2 invoke];
  164. BOOL resultValue2 = YES;
  165. [invocation2 getReturnValue:&resultValue2];
  166. if (!resultValue2) {
  167. return NO;
  168. }
  169. }
  170. return YES;
  171. }
  172. @end
  173. #endif /* SHOULD_COMPILE_LOOKIN_SERVER */