Эх сурвалжийг харах

【FixBug】默认选择主题修复时机问题

xcbosa mbp16 1 жил өмнө
parent
commit
9258b19738

+ 10 - 13
XCTheme/Classes/Impl/XCThemeManager.swift

@@ -50,21 +50,16 @@ public class XCThemeManager: NSObject {
         block?(self.selectedTheme)
     }
     
-    private var themes: [String : XCThemeSpec]
     private var prepareThemeBlocks = [PrepareThemeBlock]()
     
-    override init() {
-        self.themes = [:]
-        super.init()
-        
-        guard let path = Bundle.main.path(forResource: "ThemeResources", ofType: nil) else {
+    private var loaded = false
+    
+    @objc
+    public func loadManagerIfNeeded() {
+        if (loaded) {
             return
         }
-        for dir in (try? FileManager.default.contentsOfDirectory(atPath: path)) ?? [] {
-            if let theme = XCThemeSpec(themeId: dir) {
-                self.themes[dir] = theme
-            }
-        }
+        loaded = true
         
         if let defaultThemeBlock = self.defaultThemeBlock,
             let defaultTheme = defaultThemeBlock() {
@@ -77,10 +72,12 @@ public class XCThemeManager: NSObject {
     }
     
     private func theme(forId id: String) -> XCThemeSpec? {
-        return self.themes[id]
+        return XCThemeSpec(themeId: id)
     }
     
-    public func forceLoad() { }
+    public func forceLoad() {
+        self.loadManagerIfNeeded()
+    }
     
     public var currentUserInterfaceStyle: UIUserInterfaceStyle {
         if let theme = self.selectedTheme {

+ 22 - 0
XCTheme/Classes/Impl/XCThemeService.m

@@ -32,6 +32,7 @@
 
 - (void)setDefaultThemeBlock:(NSString * _Nullable (^)(void))defaultThemeBlock {
     XCThemeManager.shared.defaultThemeBlock = defaultThemeBlock;
+    [XCThemeManager.shared loadManagerIfNeeded];
 }
 
 - (NSArray<XCThemeSpecModel *> *)fetchBundleSpecs {
@@ -52,6 +53,13 @@
             }
         }
     }
+    for (XCThemeSpecModel *spec in specs) {
+        NSString *localBannerIconPath = [spec.containerPath stringByAppendingString:@"/banner.png"];
+        if ([NSFileManager.defaultManager fileExistsAtPath:localBannerIconPath]) {
+            NSURL *fakeURL = [NSURL fileURLWithPath:localBannerIconPath];
+            spec.businessBannerImage = [fakeURL absoluteString];
+        }
+    }
     return [specs copy];
 }
 
@@ -72,6 +80,13 @@
             }
         }
     }
+    for (XCThemeSpecModel *spec in specs) {
+        NSString *localBannerIconPath = [spec.containerPath stringByAppendingString:@"/banner.png"];
+        if ([NSFileManager.defaultManager fileExistsAtPath:localBannerIconPath]) {
+            NSURL *fakeURL = [NSURL fileURLWithPath:localBannerIconPath];
+            spec.businessBannerImage = [fakeURL absoluteString];
+        }
+    }
     return [specs copy];
 }
 
@@ -79,6 +94,13 @@
     NSMutableArray *specs = [NSMutableArray new];
     [specs addObjectsFromArray:[self fetchBundleSpecs]];
     [specs addObjectsFromArray:[self fetchDownloadedSpecs]];
+    for (XCThemeSpecModel *spec in specs) {
+        NSString *localBannerIconPath = [spec.containerPath stringByAppendingString:@"/banner.png"];
+        if ([NSFileManager.defaultManager fileExistsAtPath:localBannerIconPath]) {
+            NSURL *fakeURL = [NSURL fileURLWithPath:localBannerIconPath];
+            spec.businessBannerImage = [fakeURL absoluteString];
+        }
+    }
     return [specs copy];
 }
 

+ 1 - 1
XCTheme/Classes/Module/XCThemeProtocol.h

@@ -31,7 +31,7 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, copy, nullable) void (^downloadBlock)(NSString *themeId, NSString *writeToPath, void (^)(BOOL success, NSString *reason));
 
 /// block will called when theme engine loaded, should return a default theme identifier
-/// @discussion should be set on `+[NSObject load]`, the block will called after main framework prepared
+/// @discussion should be set on `moduleLoadedWithArgs:`, the block will called after main framework prepared
 @property (nonatomic, copy, nullable) NSString * _Nullable (^defaultThemeBlock)(void);
 
 /// Fetch specs from bundle, not mutable

+ 2 - 0
XCTheme/Classes/Module/XCThemeSpecModel.h

@@ -28,6 +28,8 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, copy, readonly, nullable) NSString *titleEnglish;
 @property (nonatomic, assign, readonly) BOOL useSystemAppearance;
 
+@property (nonatomic, copy, nullable) NSString *businessBannerImage;
+
 - (nullable instancetype)initWithWrappedObject:(id)object;
 
 @end

+ 3 - 0
XCTheme/Classes/Module/XCThemeSpecModel.m

@@ -71,6 +71,9 @@
 }
 
 - (NSString *)bannerImage {
+    if (self.businessBannerImage) {
+        return self.businessBannerImage;
+    }
     return self.wrappedObject.bannerImage;
 }