Skip to content

Commit

Permalink
refactor(ios): Revert rename and Sdk frame refactor and Fix some bug (#…
Browse files Browse the repository at this point in the history
…3545)

* refactor(ios): Revert rename Hippy prefix part3

* refactor(ios): Revert rename from Hippy prefix to NativeRender part1

the original rename pr is #2165

* refactor(ios): Revert rename from Hippy prefix to NativeRender part2

* refactor(ios): Revert rename Hippy prefix part4

* refactor(ios): Revert rename Hippy prefix part5

* refactor(ios): Revert rename Hippy prefix part 6

* refactor(ios): Revert rename Hippy prefix part 7

* refactor(ios): make hippy3 native component compatible with hippy2

* refactor(ios): Revert rename Hippy prefix part 8

* refactor(ios): Revert rename Hippy prefix part 9

* refactor(ios): Revert rename Hippy prefix part 10

* refactor(ios): Revert rename Hippy prefix to NativeRender part 11

* refactor(ios): Revert rename and sdk frame refactor part 12

* refactor(ios): Revert rename and sdk frame refactor part 13

HippyRootView and sdk start related change

* feat(ios): Improve method of getting UI state and Add NightMode

sync from hippy2

* fix(ios): bridge and rootView's memory issue when dealloc

* refactor(ios): Revert rename and sdk frame refactor part 14

* fix(ios): listview and waterfall reload animation bug

* fix(ios): fix hippy3 podspec's bug

remove all deprecated Header Search Path settings in user_target_xcconfig
  • Loading branch information
wwwcg authored Oct 19, 2023
1 parent e383127 commit d9576d4
Show file tree
Hide file tree
Showing 302 changed files with 5,289 additions and 4,722 deletions.
16 changes: 8 additions & 8 deletions docs/architecture/render/ios/native-render.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

Hippy抽象了RenderManager的接口,允许接入方自行实现RenderManager接口,并实现上屏操作。其中Native Renderer由Hippy默认实现,通过Native组件构建出整个Hippy界面。

NativeRenderManager负责实现Hippy::RenderManager的抽象接口,并将Render树的构建与UI上屏的行为交由NativeRenderImpl处理
NativeRenderManager负责实现Hippy::RenderManager的抽象接口,并将Render树的构建与UI上屏的行为交由HippyUIManager处理

NativeRenderImpl负责处理以下行为
HippyUIManager负责处理以下行为

- Render节点的创建与管理
- RooView与RootNode绑定与管理(不持有)
Expand Down Expand Up @@ -58,7 +58,7 @@ NativeRenderImpl负责处理以下行为:

为此,需要设定render节点的懒加载属性,以保证UI的懒创建。

在iOS中,此能力由`[NativeRenderObjectView creationType:NativeRenderCreationType]`属性控制。
在iOS中,此能力由`[HippyShadowView creationType:NativeRenderCreationType]`属性控制。
![image](../../../assets/img/lazy_load1.png)
对于懒加载组件,需要手动调用创建方法才会创建。
![image](../../../assets/img/lazy_load2.png)
Expand Down Expand Up @@ -141,13 +141,13 @@ Text组件算是一个比较特殊的组件,相对于其他组件,其有两

各业务会选择不同的图片格式就计入,而iOS api默认支持的图片格式有限。这种情况下,需要提供接口,处理默认不支持的图片格式解码。

为此我们声明了一份协议HPImageProviderProtocol,专门处理各类型Image的解码工作。
为此我们声明了一份协议HippyImageProviderProtocol,专门处理各类型Image的解码工作。

接入方如果有自定义格式,需要实现一份protocol。

#### HPImageProviderProtocol
#### HippyImageProviderProtocol

`HPImageProviderProtocol`包含有两类方法:必须实现的和可选实现的。
`HippyImageProviderProtocol`包含有两类方法:必须实现的和可选实现的。

必须实现的方法负责处理图片解码的基本操作,而可选实现的用于处理动图。
接入方可同时添加多个解码器,HippySDK 在需要时,会按照解码器添加反序询问各解码器能否处理当前数据。如果不能,则会询问下个解码器,直至获取了对应的解码器,或者使用默认解码器。
Expand All @@ -167,7 +167,7 @@ Text组件算是一个比较特殊的组件,相对于其他组件,其有两
| -(NSUIneger)loopCount | 返回动图循环次数 |
| -(double)delayTimeAtFrame:(NSUInteger)frame | 返回指定帧延迟时长 |

#### HPDefaultImageProvider
#### HippyDefaultImageProvider

Hippy3.0默认实现了一套decoder作为默认decoder,实现对系统支持的格式进行解码操作。任何没有decoder处理的数据,最终都会由HippyDefaultImageProvider调用系统API CGImageSource进行处理。

Expand All @@ -178,6 +178,6 @@ Hippy3.0默认实现了一套decoder作为默认decoder,实现对系统支持
- Hipp3.0SDK的动图逻辑由NativeRenderAnimatedImage和NativeRenderAnimatedImageView负责。
- 这是一个生产者-消费者模型。NativeRenderAnimatedImage负责生产,NativeRenderAnimatedImageView负责消费。
- NativeRenderAnimatedImageView实现一个vsync回调,每次回调向NativeRenderAnimatedImage询问当前帧对应的Image
- NativeRenderAnimatedImage持有HPImageProviderProtocol实例,负责解析动图,并返回对应帧的Image
- NativeRenderAnimatedImage持有HippyImageProviderProtocol实例,负责解析动图,并返回对应帧的Image

![image](../../../assets/img/animated_image.png)
48 changes: 24 additions & 24 deletions docs/development/native-component.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,13 +183,13 @@ protected void onAttachedToWindow() {
## 创建对应的ViewManager

> ViewManager 是对应的视图管理组件,负责前端视图和终端视图直接进行属性、方法的调用。
> SDK 中最基础的 `ViewManager``NativeRenderViewManager`,封装了基本的方法,负责管理 `NativeRenderView`
> 用户自定的 `ViewManager` 必须继承自 `NativeRenderViewManager`
> SDK 中最基础的 `ViewManager``HippyViewManager`,封装了基本的方法,负责管理 `NativeRenderView`
> 用户自定的 `ViewManager` 必须继承自 `HippyViewManager`
NativeRenderMyViewManager.h

```objectivec
@interface NativeRenderMyViewManager:NativeRenderViewManager
@interface NativeRenderMyViewManager:HippyViewManager
@end
```

Expand All @@ -198,15 +198,15 @@ NativeRenderMyViewManager.m
```objectivec
@implementation NativeRenderMyViewManager

NATIVE_RENDER_EXPORT_VIEW(MyView)
HIPPY_EXPORT_MODULE(MyView)

NATIVE_RENDER_EXPORT_VIEW_PROPERTY(backgroundColor, UIColor)
NATIVE_RENDER_REMAP_VIEW_PROPERTY(opacity, alpha, CGFloat)
HIPPY_EXPORT_VIEW_PROPERTY(backgroundColor, UIColor)
HIPPY_REMAP_VIEW_PROPERTY(opacity, alpha, CGFloat)

NATIVE_RENDER_CUSTOM_VIEW_PROPERTY(overflow, CSSOverflow, NativeRenderView)
HIPPY_CUSTOM_VIEW_PROPERTY(overflow, CSSOverflow, HippyView)
{
if (json) {
view.clipsToBounds = [HPConvert CSSOverflow:json] != CSSOverflowVisible;
view.clipsToBounds = [HippyConvert CSSOverflow:json] != CSSOverflowVisible;
} else {
view.clipsToBounds = defaultView.clipsToBounds;
}
Expand All @@ -216,15 +216,15 @@ NATIVE_RENDER_CUSTOM_VIEW_PROPERTY(overflow, CSSOverflow, NativeRenderView)
return [[NativeRenderMyView alloc] init];
}

- (NativeRenderObjectView *)shadowView {
return [[NativeRenderObjectView alloc] init];
- (HippyShadowView *)shadowView {
return [[HippyShadowView alloc] init];
}

NATIVE_RENDER_COMPONENT_EXPORT_METHOD(focus:(nonnull NSNumber *)reactTag) {
HIPPY_EXPORT_METHOD(focus:(nonnull NSNumber *)reactTag) {
// do sth
}

NATIVE_RENDER_COMPONENT_EXPORT_METHOD(focus:(nonnull NSNumber *)reactTag callback:(RenderUIResponseSenderBlock)callback) {
HIPPY_EXPORT_METHOD(focus:(nonnull NSNumber *)reactTag callback:(HippyPromiseResolveBlock)callback) {
// do sth
NSArray *result = xxx;
callback(result);
Expand All @@ -233,42 +233,42 @@ NATIVE_RENDER_COMPONENT_EXPORT_METHOD(focus:(nonnull NSNumber *)reactTag callbac
## 类型导出
`NATIVE_RENDER_EXPORT_VIEW()` 将`NativeRenderMyViewManager` 类注册,前端在对 `MyView` 进行操作时会通过 `NativeRenderMyViewManager` 进行实例对象指派。
`HIPPY_EXPORT_MODULE()` 将`NativeRenderMyViewManager` 类注册,前端在对 `MyView` 进行操作时会通过 `NativeRenderMyViewManager` 进行实例对象指派。
`NATIVE_RENDER_EXPORT_VIEW()`中的参数可选。代表的是 `ViewManager` 对应的View名称。
`HIPPY_EXPORT_MODULE()`中的参数可选。代表的是 `ViewManager` 对应的View名称。
若用户不填写,则默认使用类名称。
## 参数导出
`NATIVE_RENDER_EXPORT_VIEW_PROPERTY` 将终端View的参数和前端参数绑定。当前端设定参数值时,会自动调用 setter 方法设置到终端对应的参数。
`HIPPY_EXPORT_VIEW_PROPERTY` 将终端View的参数和前端参数绑定。当前端设定参数值时,会自动调用 setter 方法设置到终端对应的参数。
`NATIVE_RENDER_REMAP_VIEW_PROPERTY()` 负责将前端对应的参数名和终端对应的参数名对应起来。以上述代码为例,前端的`opacity` 参数对应终端的`alpha`参数。此宏一共包含三个参数,第一个为前端参数名,第二个为对应的终端参数名称,第三个为参数类型。另外,此宏在设置终端参数时使用的是`keyPath`方法,即终端可以使用`keyPath`参数。
`HIPPY_REMAP_VIEW_PROPERTY()` 负责将前端对应的参数名和终端对应的参数名对应起来。以上述代码为例,前端的`opacity` 参数对应终端的`alpha`参数。此宏一共包含三个参数,第一个为前端参数名,第二个为对应的终端参数名称,第三个为参数类型。另外,此宏在设置终端参数时使用的是`keyPath`方法,即终端可以使用`keyPath`参数。
`NATIVE_RENDER_CUSTOM_VIEW_PROPERTY()` 允许终端自行解析前端参数。SDK将前端传递过来的原始json类型数据传递给函数体(用户可以使用`HPConvert`类中的方法解析对应的数据),用户获取后自行解析。
`HIPPY_CUSTOM_VIEW_PROPERTY()` 允许终端自行解析前端参数。SDK将前端传递过来的原始json类型数据传递给函数体(用户可以使用`HippyConvert`类中的方法解析对应的数据),用户获取后自行解析。
>这个方法带有两个隐藏参数-`view`, `defaultView`。`view`是指当前前端要求渲染的view。`defaultView`指当前端渲染参数为nil时创建的一个临时view,使用其默认参数赋值。
## 方法导出
`NATIVE_RENDER_COMPONENT_EXPORT_METHOD` 能够使前端随时调用终端对应的方法。前端通过三种模式调用,分别是 `callNative`, `callNativeWithCallbackId`。终端调用这三种方式时,函数体写法可以参照上面的示例。
`HIPPY_EXPORT_METHOD` 能够使前端随时调用终端对应的方法。前端通过三种模式调用,分别是 `callNative`, `callNativeWithCallbackId`。终端调用这三种方式时,函数体写法可以参照上面的示例。
- callNative:此方法不需要终端返回任何值。
- callNativeWithCallbackId: 此方法需要终端在函数体中以单个block形式返回数据。block类型为 `RenderUIResponseSenderBlock`,参数为一个`id`变量。
- callNativeWithCallbackId: 此方法需要终端在函数体中以单个block形式返回数据。block类型为 `HippyPromiseResolveBlock`,参数为一个`id`变量。
一个`ViewManager`可以管理一种类型的多个实例,为了在ViewManager中区分当前操作的是哪个View,每一个导出方法对应的第一个参数都是View对应的tag值,用户可根据这个tag值找到对应操作的view。
> 由于导出方法并不会在主线程中调用,因此如果用户需要进行UI操作,则必须将其分配至主线程。推荐在导出方法中使用[NativeRenderImpl addUIBlock:]方法。其中的block类型为`NativeRenderRenderUIBlock`。
> 由于导出方法并不会在主线程中调用,因此如果用户需要进行UI操作,则必须将其分配至主线程。推荐在导出方法中使用[HippyUIManager addUIBlock:]方法。其中的block类型为`HippyViewManagerUIBlock`。
> `typedef void (^NativeRenderRenderUIBlock)(NativeRenderImpl *renderContext, NSDictionary<NSNumber *, __kindof UIView *> *viewRegistry)`。第二个参数为字典,其中的key就是对应的view tag值,value就是对应的view。
> `typedef void (^HippyViewManagerUIBlock)(HippyUIManager *uiManager, NSDictionary<NSNumber *, __kindof UIView *> *viewRegistry)`。第二个参数为字典,其中的key就是对应的view tag值,value就是对应的view。
## 创建RenderObject和View
在OC层,`NativeRenderImpl`负责构建Render树,对应的每一个节点都是一个RenderObjectView。Render树结构不保证与dom树一致,因为Render可能有自己的渲染逻辑。
在OC层,`HippyUIManager`负责构建Render树,对应的每一个节点都是一个RenderObjectView。Render树结构不保证与dom树一致,因为Render可能有自己的渲染逻辑。
>`NativeRenderView`会根据`NativeRenderObjectView`的映射结果构建真正的View视图。因此对于大多数情况下的自定义view manager来说,直接创建一个`NativeRenderObjectView`即可。
>`NativeRenderView`会根据`HippyShadowView`的映射结果构建真正的View视图。因此对于大多数情况下的自定义view manager来说,直接创建一个`HippyShadowView`即可。
`NativeRenderImpl`将调用[NativeRenderMyViewManager view]方法去创建一个真正的view,用户需要实现这个方法并返回自己所需要的`NativeRenderMyView`。
`HippyUIManager`将调用[NativeRenderMyViewManager view]方法去创建一个真正的view,用户需要实现这个方法并返回自己所需要的`NativeRenderMyView`。
到此,一个简单的`NativeRenderMyViewManager`与`NativeRenderMyView`创建完成。
Expand Down
6 changes: 3 additions & 3 deletions docs/development/native-integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ HippyBridge中有些必须属性,需要调用方设置。如果不设置,将
@property(nonatomic, assign)std::weak_ptr<VFSUriLoader> VFSUriLoader;
//添加Image
- (void)addImageProviderClass:(Class<HPImageProviderProtocol>)cls;
- (void)addImageProviderClass:(Class<HippyImageProviderProtocol>)cls;
//调用方代码
_bridge.moduleName = @"Demo"
Expand All @@ -253,7 +253,7 @@ demoLoader->RegisterConvenientUriHandler(@"hpfile", fileHandler);
_bridge.VFSUriLoader = demoLoader; //使用Hippy默认的vfs
//使用系统默认的image解码器
[_bridge addImageProviderClass:[HPDefaultImageProvider class]];
[_bridge addImageProviderClass:[HippyDefaultImageProvider class]];
```

Expand All @@ -279,7 +279,7 @@ auto nativeRenderManager = std::make_shared<NativeRenderManager>();
nativeRenderManager->SetDomManager(domManager);
//设置Image解码类
nativeRenderManager->AddImageProviderClass([HPDefaultImageProvider class]);
nativeRenderManager->AddImageProviderClass([HippyDefaultImageProvider class]);
//设置额外的自定义组件
nativeRenderManager->RegisterExtraComponent(_extraComponents);
//设置vfs系统
Expand Down
87 changes: 0 additions & 87 deletions framework/examples/ios-demo/HippyDemo/HippyConvenientBridge.h

This file was deleted.

Loading

0 comments on commit d9576d4

Please sign in to comment.