123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- #ifdef SHOULD_COMPILE_LOOKIN_SERVER
- //
- // LKSConfigManager.m
- // LookinServer
- //
- // Created by likai.123 on 2023/1/10.
- //
- #import "LKSConfigManager.h"
- #import "NSArray+Lookin.h"
- #import "CALayer+LookinServer.h"
- @implementation LKSConfigManager
- + (NSArray<NSString *> *)collapsedClassList {
- NSArray<NSString *> *result = [self queryCollapsedClassListWithClass:[NSObject class] selector:@"lookin_collapsedClassList"];
- if (result) {
- return result;
- }
-
- // Legacy logic. Deprecated.
- Class configClass = NSClassFromString(@"LookinConfig");
- if (!configClass) {
- return nil;
- }
- NSArray<NSString *> *legacyCodeResult = [self queryCollapsedClassListWithClass:configClass selector:@"collapsedClasses"];
- return legacyCodeResult;
- }
- + (NSArray<NSString *> *)queryCollapsedClassListWithClass:(Class)class selector:(NSString *)selectorName {
- SEL selector = NSSelectorFromString(selectorName);
- if (![class respondsToSelector:selector]) {
- return nil;
- }
- NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[class methodSignatureForSelector:selector]];
- [invocation setTarget:class];
- [invocation setSelector:selector];
- [invocation invoke];
- void *arrayValue;
- [invocation getReturnValue:&arrayValue];
- id classList = (__bridge id)(arrayValue);
-
- if ([classList isKindOfClass:[NSArray class]]) {
- NSArray *validClassList = [((NSArray *)classList) lookin_filter:^BOOL(id obj) {
- return [obj isKindOfClass:[NSString class]];
- }];
- return [validClassList copy];
- }
- return nil;
- }
- + (NSDictionary<NSString *, UIColor *> *)colorAlias {
- NSDictionary<NSString *, UIColor *> *result = [self queryColorAliasWithClass:[NSObject class] selector:@"lookin_colorAlias"];
- if (result) {
- return result;
- }
-
- // Legacy logic. Deprecated.
- Class configClass = NSClassFromString(@"LookinConfig");
- if (!configClass) {
- return nil;
- }
- NSDictionary<NSString *, UIColor *> *legacyCodeResult = [self queryColorAliasWithClass:configClass selector:@"colors"];
- return legacyCodeResult;
- }
- + (NSDictionary<NSString *, UIColor *> *)queryColorAliasWithClass:(Class)class selector:(NSString *)selectorName {
- SEL selector = NSSelectorFromString(selectorName);
- if (![class respondsToSelector:selector]) {
- return nil;
- }
- NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[class methodSignatureForSelector:selector]];
- [invocation setTarget:class];
- [invocation setSelector:selector];
- [invocation invoke];
- void *dictValue;
- [invocation getReturnValue:&dictValue];
- id colorAlias = (__bridge id)(dictValue);
-
- if ([colorAlias isKindOfClass:[NSDictionary class]]) {
- NSMutableDictionary *validDictionary = [NSMutableDictionary dictionary];
- [(NSDictionary *)colorAlias enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
- if ([key isKindOfClass:[NSString class]]) {
- if ([obj isKindOfClass:[UIColor class]]) {
- [validDictionary setObject:obj forKey:key];
-
- } else if ([obj isKindOfClass:[NSDictionary class]]) {
- __block BOOL isValidSubDict = YES;
- [((NSDictionary *)obj) enumerateKeysAndObjectsUsingBlock:^(id _Nonnull subKey, id _Nonnull subObj, BOOL * _Nonnull stop) {
- if (![subKey isKindOfClass:[NSString class]] || ![subObj isKindOfClass:[UIColor class]]) {
- isValidSubDict = NO;
- *stop = YES;
- }
- }];
- if (isValidSubDict) {
- [validDictionary setObject:obj forKey:key];
- }
- }
- }
- }];
- return [validDictionary copy];
- }
- return nil;
- }
- + (BOOL)shouldCaptureScreenshotOfLayer:(CALayer *)layer {
- if (!layer) {
- return YES;
- }
- if (![self shouldCaptureImageOfLayer:layer]) {
- return NO;
- }
- UIView *view = layer.lks_hostView;
- if (!view) {
- return YES;
- }
- if (![self shouldCaptureImageOfView:view]) {
- return NO;
- }
- return YES;
- }
- + (BOOL)shouldCaptureImageOfLayer:(CALayer *)layer {
- if (!layer) {
- return YES;
- }
- SEL selector = NSSelectorFromString(@"lookin_shouldCaptureImageOfLayer:");
- if ([NSObject respondsToSelector:selector]) {
- NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[NSObject methodSignatureForSelector:selector]];
- [invocation setTarget:[NSObject class]];
- [invocation setSelector:selector];
- [invocation setArgument:&layer atIndex:2];
- [invocation invoke];
- BOOL resultValue = YES;
- [invocation getReturnValue:&resultValue];
- if (!resultValue) {
- return NO;
- }
- }
- SEL selector2 = NSSelectorFromString(@"lookin_shouldCaptureImage");
- if ([layer respondsToSelector:selector2]) {
- NSInvocation *invocation2 = [NSInvocation invocationWithMethodSignature:[layer methodSignatureForSelector:selector2]];
- [invocation2 setTarget:layer];
- [invocation2 setSelector:selector2];
- [invocation2 invoke];
- BOOL resultValue2 = YES;
- [invocation2 getReturnValue:&resultValue2];
- if (!resultValue2) {
- return NO;
- }
- }
- return YES;
- }
- + (BOOL)shouldCaptureImageOfView:(UIView *)view {
- if (!view) {
- return YES;
- }
-
- SEL selector = NSSelectorFromString(@"lookin_shouldCaptureImageOfView:");
- if ([NSObject respondsToSelector:selector]) {
- NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[NSObject methodSignatureForSelector:selector]];
- [invocation setTarget:[NSObject class]];
- [invocation setSelector:selector];
- [invocation setArgument:&view atIndex:2];
- [invocation invoke];
- BOOL resultValue = YES;
- [invocation getReturnValue:&resultValue];
- if (!resultValue) {
- return NO;
- }
- }
-
- SEL selector2 = NSSelectorFromString(@"lookin_shouldCaptureImage");
- if ([view respondsToSelector:selector2]) {
- NSInvocation *invocation2 = [NSInvocation invocationWithMethodSignature:[view methodSignatureForSelector:selector2]];
- [invocation2 setTarget:view];
- [invocation2 setSelector:selector2];
- [invocation2 invoke];
- BOOL resultValue2 = YES;
- [invocation2 getReturnValue:&resultValue2];
- if (!resultValue2) {
- return NO;
- }
- }
- return YES;
- }
- @end
- #endif /* SHOULD_COMPILE_LOOKIN_SERVER */
|