docs/development/native-adapter.md
可以把 Native 的一些基础能力接口,抽象为 Adapter,方便业务注入实现。支持 Android、iOS、Ohos、Flutter、Web(同构) 等平台。
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。HippyFontScaleAdapter:自定义字体 Adapter。Hippy SDK 提供默认的实现 DefaultHttpAdapter。如果 DefaultHttpAdapter无法满足你的需求,请参考 DefaultHttpAdapter代码接入 HippyHttpAdapter 实现。
Hippy SDK 提供默认空实现 DefaultExceptionHandler。当你的业务基于 Hippy 上线后,必然会出现一些JS异常,监控这些异常对于线上质量具有很重要的意义。Hippy SDK 会抓取这些 JS 异常,然后通过 HippyExceptionHandlerAdapter 抛给使用者。
处理抓取到的JS异常。JS 异常不会导致引擎不可运行,但可能导致用户感知或者业务逻辑出现问题,是线上质量的最重要衡量标准。
Hippy SDK 提供默认的实现 DefaultSharedPreferencesAdapter。大多数场景也不需要进行扩展。
Hippy SDK 提供默认的实现 DefaultStorageAdapter。
Hippy SDK 提供默认的实现 DefaultExecutorSupplierAdapter。
Hippy SDK 提供默认空实现 DefaultEngineMonitorAdapter。当你需要查看引擎加载速度和模块加载速度时,可以通过此Adapter获取到相关信息。
用于支持开发者有自定义格式图片的解码需求,需要开发者自行提供接口类实例。
Hippy SDK 提供默认的实现 DefaultFontScaleAdapter,默认实现中未对字体做任何定制处理,如果需要加载自定义字体或者改变文字显示大小需要实现自定义font adapter并实现以下接口。
// 返回字体的缩放系数,开发者可以返回自定义缩放系数,来动态改变字体的显示大小
float getFontScale();
// 通过该方法可以替换text中自定义表情字符
CharSequence getEmoticonText(CharSequence text, int fontSize)
// 根据font family和style返回自定义字体的文件路径
String getCustomFontFilePath(String fontFamily, int style);
// 根据font family和style返回自定义字体的Typaeface对象
Typeface getCustomTypeface(String fontFamily, int style);
在Hippy SDK中, 前端 <Image> 组件默认对应的 HippyImageView 会根据 src 属性使用默认行为下载图片数据并显示。但是某些情况下,业务方希望使用自定义的图片加载逻辑(比如业务使用了缓存,或者拦截特定URL的数据),为此 SDK 提供了HippyImageCustomLoaderProtocol 协议。
用户实现此协议,自行根据图片的URL返回数据即可,HippyImageView将根据返回的数据展示图片。注意该支持返回待解码的NSData类型图片数据,也支持直接返回解码后的UIImage图片,请根据需要选择合适方案。
/// A Resource Loader for custom image loading
@protocol HippyImageCustomLoaderProtocol <HippyBridgeModule>
@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
@interface CustomImageLoader : NSObject <HippyImageCustomLoaderProtocol>
@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实例:
/// 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<HippyImageCustomLoaderProtocol>)imageLoader;
在上述实现代码中,我们使用了 HIPPY_EXPORT_MODULE() 宏来实现将此 ImageLoader 模块自动注册至 Hippy 框架中,框架内部将自动寻找实现了HippyImageCustomLoaderProtocol 协议的模块作为 ImageLoader。
!> 注意,同时只可有一个ImageLoader生效。若有多个模块实现了 HippyImageCustomLoaderProtocol 协议,框架使用最后一个作为生效的 ImageLoader。Hippy框架优先使用通过 setCustomImageLoader: 方法注册的ImageLoader。
Ohos App 开发中存在很多第三方基础库。
Hippy SDK 将所有基础能力接口化,抽象为 Adapter,方便业务注入实现,同时大多数基础能力我们也默认实现了一个最简单的方案。
Hippy SDK 现在所提供的 Adapter 包括:
HippyHttpAdapter:Http 请求 Adapter。HippyExceptionHandlerAdapter:引擎和 JS 异常处理 Adapter。HippyStorageAdapter:数据库(KEY-VALUE)Adapter。HippyExecutorSupplierAdapter:线程池 Adapter。HippyEngineMonitorAdapter:Hippy 引擎状态监控 Adapter。HippyImageLocalLoaderAdapter:Hippy 本地图片加载 Adapter。使用方法可以参考 Demo 工程中 ExampleImageLoaderAdapter.ets 等实现。HippyImageRemoteLoaderAdapter:Hippy 远程图片加载 Adapter。使用方法可以参考 Demo 工程中 ExampleImageLoaderAdapter.ets 等实现。Flutter App 开发中存在很多第三方基础库。
Voltron 将所有基础能力接口化,抽象为 Adapter,方便业务注入实现,同时大多数基础能力我们也默认实现了一个最简单的方案。
Voltron 现在所提供的 Adapter 包括:
VoltronHttpAdapter:Http 请求 Adapter。VoltronExceptionHandlerAdapter:引擎和 JS 异常处理 Adapter。VoltronStorageAdapter:数据库(KEY-VALUE)Adapter。Voltron SDK 提供默认的实现 DefaultHttpAdapter。如果 DefaultHttpAdapter无法满足你的需求,请参考 DefaultHttpAdapter代码接入 VoltronHttpAdapter 实现。
Voltron SDK 提供默认空实现 DefaultExceptionHandler。当你的业务基于 Voltron 上线后,必然会出现一些JS异常,监控这些异常对于线上质量具有很重要的意义。Voltron SDK 会抓取这些 JS 异常,然后通过 VoltronExceptionHandlerAdapter 抛给使用者。
Voltron SDK 提供默认的实现 DefaultStorageAdapter。