# 终端能力适配 可以把 Native 的一些基础能力接口,抽象为 Adapter,方便业务注入实现。支持 Android、iOS、Flutter、Web(同构) 等平台。
# Android --- Android App 开发中存在很多第三方基础库。 比如图片缓存系统常用的有:Picasso、Glide、Fresco 等。 Hippy SDK 如果在代码中直接集成这些第三方基础库,很有可能与你的项目实际情况冲突。为了解决这个矛盾点,Hippy SDK 将所有基础能力接口化,抽象为 Adapter,方便业务注入实现,同时大多数基础能力我们也默认实现了一个最简单的方案。 Hippy SDK 现在所提供的 Adapter 包括: - `HippyHttpAdapter`:Http 请求 Adapter。 - `HippyExceptionHandlerAdapter`:引擎和 JS 异常处理 Adapter。 - `HippySharedPreferencesAdapter`:SharedPreferences Adapter。 - `HippyStorageAdapter`:数据库(KEY-VALUE)Adapter。 - `HippyExecutorSupplierAdapter`:线程池 Adapter。 - `HippyEngineMonitorAdapter`:Hippy 引擎状态监控 Adapter。 ## HippyHttpAdapter Hippy SDK 提供默认的实现 `DefaultHttpAdapter`。如果 `DefaultHttpAdapter`无法满足你的需求,请参考 `DefaultHttpAdapter`代码接入 `HippyHttpAdapter` 实现。 ## HippyExceptionHandlerAdapter Hippy SDK 提供默认空实现 `DefaultExceptionHandler`。当你的业务基于 Hippy 上线后,必然会出现一些JS异常,监控这些异常对于线上质量具有很重要的意义。Hippy SDK 会抓取这些 JS 异常,然后通过 `HippyExceptionHandlerAdapter` 抛给使用者。 ## handleJsException 处理抓取到的JS异常。JS 异常不会导致引擎不可运行,但可能导致用户感知或者业务逻辑出现问题,是线上质量的最重要衡量标准。 ## HippySharedPreferencesAdapter Hippy SDK 提供默认的实现 `DefaultSharedPreferencesAdapter`。大多数场景也不需要进行扩展。 ## HippyStorageAdapter Hippy SDK 提供默认的实现 `DefaultStorageAdapter`。 ## HippyExecutorSupplierAdapter Hippy SDK 提供默认的实现 `DefaultExecutorSupplierAdapter`。 ## HippyEngineMonitorAdapter Hippy SDK 提供默认空实现 `DefaultEngineMonitorAdapter`。当你需要查看引擎加载速度和模块加载速度时,可以通过此Adapter获取到相关信息。 ## ImageDecoderAdapter 用于支持开发者有自定义格式图片的解码需求,需要开发者自行提供接口类实例。


# iOS --- ## HippyImageCustomLoaderProtocol 在Hippy SDK中, 前端 `` 组件默认对应的 HippyImageView 会根据 src 属性使用默认行为下载图片数据并显示。但是某些情况下,业务方希望使用自定义的图片加载逻辑(比如业务使用了缓存,或者拦截特定URL的数据),为此 SDK 提供了`HippyImageCustomLoaderProtocol` 协议。 用户实现此协议,自行根据图片的URL返回数据即可,HippyImageView将根据返回的数据展示图片。注意该支持返回待解码的NSData类型图片数据,也支持直接返回解码后的UIImage图片,请根据需要选择合适方案。 ```objectivec /// A Resource Loader for custom image loading @protocol HippyImageCustomLoaderProtocol @required /// Load Image with given URL /// Note that If you want to skip the decoding process lately, /// such as using a third-party SDWebImage to decode, /// Just set the ControlOptions parameters in the CompletionBlock. /// /// - Parameters: /// - imageUrl: image url /// - extraInfo: extraInfo /// - progressBlock: progress block /// - completedBlock: completion block - (void)loadImageAtUrl:(NSURL *)imageUrl extraInfo:(nullable NSDictionary *)extraInfo progress:(nullable HippyImageLoaderProgressBlock)progressBlock completed:(nullable HippyImageLoaderCompletionBlock)completedBlock; @end ``` ## 协议实现 ```objectivec @interface CustomImageLoader : NSObject @end @implementation CustomImageLoader HIPPY_EXPORT_MODULE() // 全局注册该模块至Hippy - (void)loadImageAtUrl:(NSURL *)url extraInfo:(NSDictionary *)extraInfo progress:(HippyImageLoaderProgressBlock)progressBlock completed:(HippyImageLoaderCompletionBlock)completedBlock { // 1、如果获取的是NSData数据: // 业务方自行获取图片数据,返回数据或者错误 NSError *error = NULL; NSData *imageData = getImageData(url, &error); // 将结果通过block回调 completedBlock(imageData, url, error, nil, kNilOptions); // 2、如果可以直接获取UIImage数据,可跳过Hippy内置解码过程,避免重复解码: UIImage *image = getImage(xxx); // 传入控制参数,跳过内部解码 HippyImageLoaderControlOptions options = HippyImageLoaderControl_SkipDecodeOrDownsample; // 将结果通过block回调 completedBlock(nil, url, error, image, options); } @end ``` ## 协议注册 与Hippy框架注册其他模块的方法一样,ImageLoader同样既可以选择通过Hippy框架提供的 `HIPPY_EXPORT_MODULE()` 宏注册到App全局(注意,全局注册的含义是App内的所有HippyBridge实例均会获取和使用该模块),又可通过 `HippyBridge` 初始化参数列表中的 `moduleProvider` 参数来注册到特定bridge。 除此之外,`HippyBridge` 还提供了一个注册方法,便于业务注册ImageLoader实例: ```objectivec /// Set a custom Image Loader for current `hippyBridge` /// The globally registered ImageLoader is ignored when set by this method. /// /// - Parameter imageLoader: id - (void)setCustomImageLoader:(id)imageLoader; ``` 在上述实现代码中,我们使用了 `HIPPY_EXPORT_MODULE()` 宏来实现将此 ImageLoader 模块自动注册至 Hippy 框架中,框架内部将自动寻找实现了`HippyImageCustomLoaderProtocol` 协议的模块作为 ImageLoader。 !> 注意,同时只可有一个ImageLoader生效。若有多个模块实现了 `HippyImageCustomLoaderProtocol` 协议,框架使用最后一个作为生效的 ImageLoader。Hippy框架优先使用通过 `setCustomImageLoader:` 方法注册的ImageLoader。


# Voltron --- Flutter App 开发中存在很多第三方基础库。 Voltron 将所有基础能力接口化,抽象为 Adapter,方便业务注入实现,同时大多数基础能力我们也默认实现了一个最简单的方案。 Voltron 现在所提供的 Adapter 包括: - `VoltronHttpAdapter`:Http 请求 Adapter。 - `VoltronExceptionHandlerAdapter`:引擎和 JS 异常处理 Adapter。 - `VoltronStorageAdapter`:数据库(KEY-VALUE)Adapter。 ## VoltronHttpAdapter Voltron SDK 提供默认的实现 `DefaultHttpAdapter`。如果 `DefaultHttpAdapter`无法满足你的需求,请参考 `DefaultHttpAdapter`代码接入 `VoltronHttpAdapter` 实现。 ## VoltronExceptionHandlerAdapter Voltron SDK 提供默认空实现 `DefaultExceptionHandler`。当你的业务基于 Voltron 上线后,必然会出现一些JS异常,监控这些异常对于线上质量具有很重要的意义。Voltron SDK 会抓取这些 JS 异常,然后通过 `VoltronExceptionHandlerAdapter` 抛给使用者。 ## VoltronStorageAdapter Voltron SDK 提供默认的实现 `DefaultStorageAdapter`。