From b4158769cd8a05c18b8edbee7ea90179b8e15e51 Mon Sep 17 00:00:00 2001 From: wwwcg Date: Mon, 24 Mar 2025 21:36:10 +0800 Subject: [PATCH] fix(ios): add protection when setting unsupported prop for component (#4237) --- renderer/native/ios/renderer/HippyUIManager.mm | 16 +++++++++++++--- .../renderer/component/view/HippyViewManager.mm | 3 +++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/renderer/native/ios/renderer/HippyUIManager.mm b/renderer/native/ios/renderer/HippyUIManager.mm index 9a55074de..4e6cd74a8 100644 --- a/renderer/native/ios/renderer/HippyUIManager.mm +++ b/renderer/native/ios/renderer/HippyUIManager.mm @@ -548,7 +548,12 @@ NSString *const HippyFontChangeTriggerNotification = @"HippyFontChangeTriggerNot view.rootTag = rootTag; view.hippyShadowView = shadowView; view.uiManager = self; - [componentData setProps:props forView:view]; // Must be done before bgColor to prevent wrong default + @try { + [componentData setProps:props forView:view]; // Must be done before bgColor to prevent wrong default + } @catch (NSException *exception) { + HippyLogError(@"Exception while setting props for view (%@ of %@), %@", view.class, view.hippyTag, props); + } + } } return view; @@ -574,7 +579,11 @@ NSString *const HippyFontChangeTriggerNotification = @"HippyFontChangeTriggerNot // Note: viewRegistry may be modified in the block, and it may be stored internally as NSMapTable // so to ensure that it is up-to-date, it can only be retrieved each time. NSDictionary *viewRegistry = [self.viewRegistry componentsForRootTag:shadowView.rootTag]; - block(viewRegistry, nil); + @try { + block(viewRegistry, nil); + } @catch (NSException *exception) { + HippyLogError(@"Exception while executing blocks when create list! %@", shadowView); + } } } [self.viewRegistry clearTempCacheAfterAcquireAllStoredWeakComponentsForRootTag:shadowView.rootTag]; @@ -744,6 +753,7 @@ NSString *const HippyFontChangeTriggerNotification = @"HippyFontChangeTriggerNot #pragma mark Schedule Block - (void)addUIBlock:(HippyViewManagerUIBlock)block { + HippyAssertNotMainQueue(); if (!block || !_viewRegistry) { return; } @@ -778,7 +788,7 @@ NSString *const HippyFontChangeTriggerNotification = @"HippyFontChangeTriggerNot // Note: viewRegistry may be modified in the block, and it may be stored internally as NSMapTable // so to ensure that it is up-to-date, it can only be retrieved each time. NSDictionary* viewReg = [strongSelf.viewRegistry componentsForRootTag:@(rootTag)]; - block(strongSelf, viewReg); + if (block) block(strongSelf, viewReg); } @catch (NSException *exception) { HippyLogError(@"Exception thrown while executing UI block: %@", exception); } diff --git a/renderer/native/ios/renderer/component/view/HippyViewManager.mm b/renderer/native/ios/renderer/component/view/HippyViewManager.mm index 1cf45e1d7..7cf84a887 100644 --- a/renderer/native/ios/renderer/component/view/HippyViewManager.mm +++ b/renderer/native/ios/renderer/component/view/HippyViewManager.mm @@ -287,6 +287,9 @@ HIPPY_CUSTOM_VIEW_PROPERTY(visibility, NSString, HippyView) { } HIPPY_CUSTOM_VIEW_PROPERTY(backgroundImage, NSString, HippyView) { + if (![view isKindOfClass:HippyView.class]) { + return; + } if (json) { NSString *imagePath = [HippyConvert NSString:json]; // Old background image need to be cleaned up in time due to view's reuse