如何实现 App 内的视频/直播悬浮小窗播放 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
whhxf910
V2EX    视频技术

如何实现 App 内的视频/直播悬浮小窗播放

  •  
  •   whhxf910 2024-08-28 15:04:47 +08:00 1128 次点击
    这是一个创建于 408 天前的主题,其中的信息可能已经有所发展或是发生改变。

    方案概述

    • 功能:使用 webview 的方案,在 App 中实现视频/直播的悬浮小窗播放效果,支持应用内小窗、系统小窗,在订单页小窗播放,回到直播间小窗消失

    • 场景:适用于要在 App 中快速实现直播带货场景,或在 App 中需要点播视频小窗播放的场景

    • 支持环境:安卓、iOS 、鸿蒙

    • 前置条件:使用保利威的 webview SDK Demo ,对方案有任何疑问,可+V:wjc24680525 ,备注“小窗”

    一、安卓对接说明

    1.1 集成简介

    1.1.1 项目架构图

    1.1.2 使用源码项目集成

    当前将提供的源码包中的 PolyvAndroidWebViewDemo 、PLVWebViewSDK 、PLVJsBridge 、PLVFloatWindow 四个项目放入到同一目录下,然后使用编译器打开 PolyvAndroidWebViewDemo 项目即可。

    1.1.3 源码集成注意事项

    功能对接说明

    参考1.2 功能对接文档

    更换通信协议

    如果需要更换 web-native 通信协议的情况时,可以参考提供的1.3 更换 web-native 通信规则注意事项

    1.2 功能对接文档

    1.2.1 功能设置

    设置 Url 和 UA

    在启动 PLVWebViewDemoActivity 之前,我们需要设置加载的 Url 和添加上需要用到的 Ua ,这里可以通过PLVWebViewConfig来进行设置,示例代码如下:

    PLVWebViewConfig cOnfig= new PLVWebViewConfig(); config.setUrl("需要加载的 url") .setUa("需要添加的 UA"); PLVWebViewDemoActivity.startWebViewDemoActivity(PLVURLInputActivity.this, config); 

    设置小窗边框颜色

    当前 SDK 支持设置小窗边框颜色,通过PLVFloatWindowManager进行设置,示例代码如下:

    PLVFloatWindowManager.getInstance().setSolidColor(Color.RED); 
    1 )设置小窗边框厚度

    当前 SDK 支持设置小窗边框颜色,通过PLVFloatWindowManager进行设置,示例代码如下:

    PLVFloatWindowManager.getInstance().setSolidWidth(20); 
    2 )设置自动开启小窗功能

    当进程退到后台时会自动唤出小窗(默认关闭),通过PLVFloatWindowManager进行设置,示例代码如下:

    PLVWebViewConfig cOnfig= new PLVWebViewConfig(); config.setSupportAutoFloating(true); // 开启自动开启小窗功能 PLVWebViewDemoActivity.startWebViewDemoActivity(PLVURLInputActivity.this, config); 
    3 )使用系统/应用小窗

    当前小窗支持系统小窗和应用窗(默认使用系统小窗),如果开启系统小窗需要请求小窗悬浮权限,而应用小窗不需要请求权限,注意应用小窗依赖于 Activity ,当 Activity 被销毁时,应用小窗也会被关闭。

    PLVWebViewConfig cOnfig= new PLVWebViewConfig(); config.isSystemFloatingWindow(true);// 为 true 时使用系统窗,false 为使用应用小窗 PLVWebViewDemoActivity.startWebViewDemoActivity(PLVURLInputActivity.this, config); 
    4 )使用原生/web 弹出请求权限窗

    当前 sdk 支持通过原生或 web 端来弹出请求悬浮权限弹窗(默认使用原生弹窗方式)。

    注意如果是选择使用 web 端来弹窗请求悬浮权限弹窗,需要 web 端支持对应的事件。

    PLVWebViewConfig cOnfig= new PLVWebViewConfig(); config.setUseWebRequestPermission(true);// 为 true 时 web 弹窗,false 为使用原生弹窗 PLVWebViewDemoActivity.startWebViewDemoActivity(PLVURLInputActivity.this, config); 

    1.2.2 监听方法 js 事件

    SDK 内部已经定义了一部分与 web 端通信的 js 事件,这些通信事件可以在 demo 层中重写某些方法进行监听和拦截处理,这里以监听 onShare 事件进行为例:

    public class PLVWebViewDemoActivity extends PLVWebViewBaseActivity { @Override public void onShare() { // 监听到 onShare 事件的处理 ... super.onShare(); } } 

    可以选择需要监听的 js 事件进行重写实现对事件的监听。

    注意:这些 js 通信事件都是与 webview 关联,开启系统小窗后,即使 Activity 被销毁依然能收到来自 web 端发送的消息,触发这些方法,所以重写这些方法时,尽量避免做与 Activity 生命周期关联的操作

    允许的监听 js 事件

    当前支持通过重写方法来监听事件;

    有以下这些方法:

     /** * 点击商品,将切换到小窗时会触发该回调 * * @param width 小窗的宽 * @param height 小窗的高 * @param newPage 是否打开新的一页 * @param link 打开新的一页加载的 url * @param data 其他更多数据,开发者可根据需要自定义实现逻辑,数据为 json 格式 */ void changeToWindowForProduct(int width, int height, boolean newPage, String link, String data); /** * 用户主动调用切换到小窗的方法,在切换前会触发该回调 * * @param width 小窗的宽 * @param height 小窗的高 */ void changeToWindowForUser(int width, int height); /** * 点击小窗区域,从小窗中恢复到页面触发该回调 **/ void changeToNormal(); /** * 点击小窗关闭按钮,关闭小窗触发该回调 **/ void closeWindow(); /** * 点击返回事件 */ void onGobackPressed(); /** * 横置屏幕事件 */ void onLandScreen(); /** * 竖直屏幕事件 */ void onPortraitScreen(); /** * 分享事件 */ void onShare(); /** * 收藏事件 */ void onCollect(); /** * 隐藏状态栏,进入沉浸模式 */ void hideNavigationBar(); /** * 显示状态栏,退出沉浸模式 */ void showNavigationBar(); /** * 打开悬浮窗权限页面 */ void requestFloatWindowPermissionByWeb(); /** * 发送当前小窗的打开状态给前端 */ void getFloatWindowStatus(); /** * 获取当前的网路状态 */ void getCurrentNetworkStatus(); /** * 设置是否开启自动悬浮窗权限 * @param enable true 为打开,false 为甘比 */ void setEnableBackground(boolean enable); /** * 获取是否开启了自动悬浮窗的权限 */ void getEnableBackground(); /** * 处理其他 event */ void handleOtherEvent(String event); 

    1.2.3 注册新的 js 通信事件

    SDK 支持注册自定义 js 事件,可以通过下面的方式来注册自定义 js 事件,示例代码如下:

    @Override protected void initHandleForDemo() { //监听来自 web 端发送事件 floatableLayout.getWebView().registerHandler("监听事件", new BridgeHandler() { @Override public void handler(String s, CallBackFunction callBackFunction) {} }); //向 web 端发送对应事件和消息 floatableLayout.getWebView().callHandler("发送事件", "发送消息", new CallBackFunction() { @Override public void onCallBack(String s } }); } 

    注意:注册新的 js 事件时不仅需要原生端做相应的操作,还需要 web 端有注册对应的事件,否则是原生端是不会接收到对应的事件消息

    1.3更换 web-native 通信规则注意事项

    1.3.1 说明

    当前 SDK 内部是通过 Jsbridge 该库来实现 web 端与原生端的通信,Jsbridge 中定义了 web 端与原生的通信规则,如果集成项目是没有制定指定的 web-native 通信规则,那么可以直接使用 SDK 的通信规则即可,无需其余改动。

    如果集成项目中有定制指定的 web-native 通信规则,可以参考下面的方式进行修改。

    无论是使用哪一种通信规则,关键在于原生端发送/接收 web 端消息,web 端发送/接收原生端消息,所以当需要更换 SDK 内部的 web-native 通信规则仅关注上述的两点即可。

    1.3.2 更换 native 端通信规则

    因为 sdk 内部是依赖于 jsbridge 该模块实现 web-native 通信,当需要更换通信规则时,可以选择不依赖该模块。

    1.3.3 更改 PLVBaseWebView 继承类

    public class PLVBaseWebView extends BridgeWebView { .... } 

    可将 PLVBaseWebView 继承的 BridgeWebView 更换为集成项目中指定通信规则的 webview 。

    1.3.4 更改 WebViewClient

    WebViewClient 是实现原生端接收 web 端消息的关键,也是定制修改 webview 的核心部份,所以在更换通信规则时也需要更换 WebViewClient

    //替换自己需要用到的 WebViewClient webView.setWebViewClient(webviewClient); 

    可以通过 setWebViewClient(new WebViewClient() 方法为 webview 设置指定 WebViewclient 。

    1.3.5 更改原生端发送/接收 web 端消息的方法

    1. 更换发送消息方式
    public void callMessage(String type, String message) { //当使用的新的 web-native 规则时,可以将下面的代码修改为 webview 使用新规则发送消息时的代码 webview.callHandler(type, message, new CallBackFunction() { @Override public void onCallBack(String s) { ... } }); } 

    当前 SDK 内部时通过 webview.callHandler()方法来实现消息的发送,当更换新的通信规则时,可以将这个 webview.callHandler()方法替换为新规则中对应原生端发送消息的方法。

    1. 更换接收 web 端消息
    webview.registerHandler("xxx", new BridgeHandler() { @Override public void handler(String s, CallBackFunction callBackFunction) { ... } }); 

    当前 SDK 内部是通过 webview.registerHandler()方法来监听 web 端发送的消息,当更换新的通信规则时,可以将这个 webview.registerHandler()方法替换为新规则中对应原生端接收 web 消息的方法。

    1.3.6 更换 web 端通信规则

    web-native 通信规则是由 web 端和原生端两端定制的,所以当更换 web-native 通信规则不仅需要原生端更换,web 端也需要进行更换。

    注意事项

    当前需要通信的 web 页面 与 更换通信规则后的原生端 所使用的通信规则是否是对应,如果是对应的情况下无需做其他更替。

    如果需要通信的 web 页面与 更换通信规则后的原生端 所使用的不对应,那么就需要去更替 web 端的通信规则。

    如 web 端页面需要使用保利威的 web 页面(当前保利威 web 页面与 sdk 内部所使用的通信规则一致,当原生端切换通信规则,那么 web 端页面也需要更换对应通信规则)

    1.3.7 更换 web 端发送/接收方法

    1.更改 web 端发送消息方式

     window.bridge.callHandler( 'callAppEvent', message, function(responseData) { //发送消息 .... } ); 

    当前 SDK 内部与 Web 端应的通信规则是通过 bridge.callHandler()方法来进行发送消息,当替换新的通信规则后,可以使用新的发送方式来取代这个 bridge.callHandler()方法

    2.更改 web 端接收消息方式

    // 监听来自 xxx 事件的消息 bridge.registerHandler("xxx", function(data, responseCallback) { document.getElementById("show").innerHTML = (data); }); 

    当前 SDK 内部与 Web 端对应的通信规则是通过 bridge.registerHandler()方法来接收消息,当替换新的通信规则后,可以使用新的发送方式来取代这个 bridge.registerHandler()方法

    二、iOS 对接说明

    2.1 集成简介

    2.1.1 项目架构图

    2.1.2 运行环境要求

    名称 要求
    iOS 系统 9.0+
    CocoaPods 1.11.3+
    Xcode 11.0+

    2.2 快速集成

    2.2.1 项目配置

    配置支持系统版本

    打开项目的 PROJECT - Deployment Target - iOS Deployment Target 改为 9.0 或更高。

    打开项目的 TARGETS - General - Deployment Info ,把 iOS 系统改为 9.0 或更高。

    2.2.2 配置 App Transport Security (ATS)

    打开项目的info.plist文件,添加如下内容:

    <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSAllowsArbitraryLoadsInWebContent</key> <true/> </dict> 

    2.2.3 配置设备旋转

    播放器支持全屏播放,需要在 TARGETS - General - Deployment Info 中,勾选支持的横屏旋转方向。

    2.2.4 配置后台播放和画中画

    打开项目的 TARGETS - Signings & Capabilities ,点击 + Capability ,选择 Background Modes ,勾选 ‘Audio, AirPlay, and Picture in Picture’。

    2.3 集成 SDK

    2.3.1 Pod 方式集成

    集成 PLVWebViewSDK

    在 Podfile 文件中,添加以下内容:

    pod 'PLVWebViewSDK', '~> 1.0.0' 

    在终端执行pod install

    集成系统小窗

    如果需要使用系统小窗功能,则需要在 Podfile 文件中另外添加以下内容

    # 包含系统画中画 -- 如果不使用系统小窗 则不需要下面配置 pod 'PLVAliHttpDNS', '~>1.10.0' pod 'PLVFoundationSDK', '1.10.6', :subspecs => ['BaseUtils', 'NetworkUtils', 'ErrorCode', 'LogReporter', 'ConsoleLogger', 'Reachability', 'SafeModel', 'ProgressHUD'] pod 'PLVBusinessSDK', '1.10.4', :subspecs => ['BaseBSH'] pod 'PLVLiveScenesSDK', '1.10.6', :subspecs => ['Base', 'LogReporter', 'ConsoleLogger', 'ErrorManager', 'Network', 'Player', 'BasePlayer', 'LivePlayer', 'LivePlaybackPlayer', 'PictureInPicture'] 

    并在终端执行pod install,并且将对应的PLVLiveScenesSDK 、PLVBusinessSDK进行替换。

    2.3.2 离线包方式集成

    集成 PLVWebViewSDK

    将 PLVWebViewSDK.framework 库添加到自己的项目中。如果是使用源码的方式集成,则需要将 PLVWebViewSDK 文件整个添加到自己的项目即可。

    集成系统小窗

    1.如果项目使用系统小窗功能则需要将以下库添加到项目中

    PLVAliHttpDNS 、PLVBusinessSDK 、PLVFoundationSDK 、PLVIJKPlayer 、PLVLiveScenesSDK 

    2.在 General => Frameworks ,Libraries ,and Embedded Content 中移除已添加的 PLVFoundationSDK.framework 、PLVLiveScenesSDK.framework 、PLVBusinessSDK.framework 库,并添加系统库 libresolv.tbd 。

    3.设置 PLVIJKPlayer 为 Embed & Sign

    4.Build Settings ,Other Linker Flags 中添加 -ObjC ,如果项目已配置有,则不需要重复添加

    5.运行报错

    如果模拟器运行报错需要在 Build Settings 中设置 Excluded Architecture => Any iOS Simulator SDK 为 arm64

    如果运行报错

    Building for iOS Simulator, but the linked and embedded framework '***' was built for iOS + tvOS Simulator 

    可在 Build Settings 中 设置 VALIDATE_WORKSPACE 为 YES 即可。

    2.4 WebView 接入

    创建想要展示 WebView 的控制器页面DemoViewController继承于PLVWebViewBaseViewController,并通过初始化方法-initWithConfig:创建控制器页面。示例代码如下:

    // PLVWebViewDemoViewController.h #import <PLVWebViewSDK/PLVWebViewSDK.h> @interface PLVWebViewDemoViewController : PLVWebViewBaseViewController @end 

    初始化时可通过重写initHandleForDemo进行自定义配置,同时可以对 Bridge 事件进行自定义处理。示例代码如下:

    // PLVWebViewDemoViewController.m @implementation PLVWebViewDemoViewController #pragma mark - [ Override ] - (void)viewDidLoad { [super viewDidLoad]; } /// 初始化时,可以进行的自定义配置 //- (void)initHandleForDemo { // //} #pragma mark - [ Delegate ] #pragma mark PLVFloatableWebViewBridgeDelegate /// 如需要监听 js 回调事件,可以通过 Delegate 事件进行相应的处理,例如 webviewBridgeShare 消息 //- (void)webviewBridgeShare:(PLVFloatableWebViewBridge *)bridge { // //} @end 

    创建、配置、打开直播页面控制器

    PLVWebViewConfig *cOnfig= [[PLVWebViewConfig alloc] init]; config.urlString = urlString; config.allowFloatingWindow = YES; config.isSystemFloatingWindow = NO; config.userAgent = self.uaTextView.text; config.enableAutoFloatWindow = YES; PLVWebViewDemoViewController *webVC = [[PLVWebViewDemoViewController alloc] initWithConfig:config]; [self.navigationController pushViewController:webVC animated:YES]; 

    2.5 高级功能

    2.5.1 WebView 配置

    创建 PLVWebViewBaseViewController 时需要根据 PLVWebViewConfig 配置来进行初始化。

    PLVWebViewConfig *cOnfig= [[PLVWebViewConfig alloc] init]; config.urlString = @""; config.allowFloatingWindow = YES; config.isSystemFloatingWindow = NO; config.userAgent = @""; config.enableAutoFloatWindow = YES; PLVWebViewDemoViewController *floatingWebVC = [[PLVWebViewDemoViewController alloc] initWithConfig:config]; 
    • allowFloatingWindow 是否允许使用浮窗的功能
    • isSystemFloatingWindow 使用系统小窗或者应用内小窗
    • userAgent 浏览器的 UA ,可自行修改
    • enableAutoFloatWindow 开启自动浮窗,开启后 在退出页面或者退到后台时会自动开启小窗

    2.5.2 应用内小窗配置

    我们还可以对浮窗的大小、默认位置、以及样式进行配置修改:

    // 配置浮窗大小 [[PLVFloatWindowManager sharedManager] setFloatingWindowSize:size]; // 配置浮窗初始位置 [[PLVFloatWindowManager sharedManager] setFloatingWindowLocation:point]; // 应用内小窗样式修改 UIView *appWindowView = [PLVFloatWindowManager sharedManager].floatingWindow; appWindowView.layer.cornerRadius = 8.0f; appWindowView.layer.masksToBounds = YES; 

    其中,调用-moveContentViewToWindow:size:方法主动唤起的浮窗,默认宽度为屏幕的 0.3 倍,宽高比 16:9 。通过保利威的网页唤起浮窗,浮窗大小由网页告知。初始位置是指浮窗右下角距离屏幕右下角的相对位置,默认为(-10, -100), 表示悬浮窗右边沿距离屏幕右边沿 10pt ,下边沿距离屏幕下边沿 100pt 。

    2.5.3 画中画配置

    1. 如果要使用画中画功能,首先需要在 Podfile 文件中 添加支持画中画的 SDK ,然后执行pod install

      # 包含系统画中画 -- 如果不使用系统小窗 则不需要下面配置 pod 'PLVAliHttpDNS', '~>1.10.0' pod 'PLVFoundationSDK', '1.10.6', :subspecs => ['BaseUtils', 'NetworkUtils', 'ErrorCode', 'LogReporter', 'ConsoleLogger', 'Reachability', 'SafeModel', 'ProgressHUD'] pod 'PLVBusinessSDK', '1.10.4', :subspecs => ['BaseBSH'] pod 'PLVLiveScenesSDK', '1.10.6', :subspecs => ['Base', 'LogReporter', 'ConsoleLogger', 'ErrorManager', 'Network', 'Player', 'BasePlayer', 'LivePlayer', 'LivePlaybackPlayer', 'PictureInPicture'] 
    2. 替换对应的离线包

    用提供的离线包PLVLiveScenesSDK 、PLVBusinessSDK将 Pods 文件夹下对应的 SDK 进行替换。

    2.5.4 UA 和白名单配置

    当开启了enabelWhiteList后,只有添加了域名白名单的链接才会支持原生与前端的通信,才支持小窗的功能。

    [PLVUAConfigManager sharedManager].enabelWhiteList = YES; [[PLVUAConfigManager sharedManager] addHostWhitelist:@[@"live.polyv.cn"]]; 

    同时支持 自定义配置 UA

    [[PLVUAConfigManager sharedManager] addCustomUserAgent:@""]; 

    2.5.5 监听方法 js 事件

    在 SDK 内部已经对一些事件进行了处理,如果想要自定义处理某些事件可以在 demo 中进行监听拦截处理。示例如下:

    #pragma mark - [ Delegate ] #pragma mark PLVFloatableWebViewBridgeDelegate /// 如需要监听 js 回调事件,可以通过 Delegate 事件进行相应的处理,例如 webviewBridgeShare 消息 - (void)webviewBridgeShare:(PLVFloatableWebViewBridge *)bridge { } 

    2.5.6 注册和调用自定 js 事件

    可以通过 Demo 层注册和调用自定义事件,示例代码如下:

    - (void)initHandleForDemo { [self.contentAreaView.mainWebView.bridge registerHandler:@"" handler:^(id _Nonnull data, PLVWVJBResponseCallback _Nonnull responseCallback) { }]; [self.contentAreaView.mainWbView.bridge callHandler:@"" data:nil responseCallback:^(id _Nonnull responseData) { }]; } 

    2 .6 更换 web-native 通信规则注意事项

    本项目中使用的是开源库 WebViewJavascriptBridge 来实现 web 和 native 之间的通信。如果接入的项目中没有用到 web-native 通信,则不需要做任何调整。如果接入的项目中也用到 web-native 通信,则可以参考下面的方式进行修改。

    2.6.1 更换 native 端通信规则

    SDK 中使用的 WebViewJavascriptBridge 来实现通信的,在 PLVFloatableWebViewBridge 中对其进行了封装处理,如果需要更换 native 端通信规则只需要修改 PLVFloatableWebViewBridge 这个类即可

    更换注册消息方式:

    - (void)registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler { //当使用的新的 web-native 规则时,可以将下面的代码修改为 webview 使用新规则注册消息时的代码 [self.bridge registerHandler:handlerName handler:handler]; } 

    更换发送 web 端消息

    - (void)callHandler:(NSString*)handlerName data:(id _Nullable)data responseCallback:(WVJBResponseCallback _Nullable)responseCallback { //当使用的新的 web-native 规则时,可以将下面的代码修改为 webview 使用新规则发送消息时的代码 [self.bridge callHandler:handlerName data:data responseCallback:responseCallback]; } 

    2.6.2 更换 web 端通信规则

    当 native 端通信规则改变时,web 端则要根据是否与原来的通信方式原理相同来判断是否需要修改。

    当前 web 端注册消息方式

    bridge.registerHandler("testJavascriptHandler", function (data, responseCallback) { console.log(data); responseCallback(data); } ); 

    当前 web 端发送消息方式

    bridge.callHandler("callAppEvent", { }, function responseCallback(responseData) { console.log(responseData); } ); 

    当前 web-native 的通信是通过 bridge 这种方式来发送和接收消息的,如果需要调整可用集成项目 web 端接收、发送消息的方式来进行替换。

    2.7 iOS 系统版本使用系统小窗功能说明

    iOS 因为系统限制想实现系统小窗只能通过画中画的功能,同时这个功能会有版本限制,在 iOS14+开始支持 iPhone 的画中画功能。同时直播如果使用系统播放器 AVPlayer 会有 14s+的高延迟,IJKPlayer 可以实现低延迟,但是 iOS15 以上画中画才支持 SampleBufferLayer ,因此如果直播低延迟的话需要 iOS15+。

    • 回放视频系统小窗支持 iOS14+
    • 直播视频系统小窗支持 iOS15+

    三、鸿蒙 next

    3.1 简介

    PLVWebSDK 项目从属于易方信息科技股份有限公司,对保利威云直播、云点播系列产品的直播、回放观看做了良好的适配,极大优化了用户的观看体验,并支持浮窗播放等扩展功能,也可作为其他网页的展示容器。

    本项目包含功能如下:

    • 支持基础 Web 功能
    • 支持应用内浮窗播放
    • 支持系统级浮窗播放
    • 支持悬浮窗手势拖动
    • 支持视频全屏播放

    3.2 下载安装

    ohpm install plvwebsdk 

    OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包

    3.3 需要权限

    ohos.permission.INTERNET ohos.permission.GET_NETWORK_INFO 

    3.5 功能说明

    3.5.1 PLVWebViewConfig

    1.设置 UA

    当前可以通过下面的方式来设置需要的 UA

    PLVWebViewConfig().setUa("Android" + PLVUAConfig.defaultUA)

    注意:如果需要到 Saas 页面的小窗功能的情况,必须在 UA 中带上 Android 和 PLVUAConfig.defaultUA 字段

    2.设置 url

    可以通过下面的方式来设置需要加载的 url

    PLVWebViewConfig().setUrl("需要加载的 url")

    3.设置是否允许小窗悬浮

    可以通过下面的方式来设置是否允许开启小窗功能,默认是开启的,如不需要可以设置为 false

    PLVWebViewConfig().setAllowFloatingWindow(true)

    3.5.2 自定义注册事件

    当前 SDK 内部已经注册好与前端页面通信的事件,当接入 sdk 后就能直接使用这些事件。

    SDK 也支持注册自定义事件,可以通过下面的方式来进行注册

    this.controller.registerHandler("自定义事件", (data: string) => {// 监听自定义事件的处理 }) this.controller.callHandle("发送原生事件", "xxx", () => {//发送原生事件 }) 

    如果需要监听/拦截 SDK 内部已经实现了的事件,可以通过下面的方式继续监听/拦截,这里以 onShare 事件为例子,如果需要监听/拦截其他事件可以仿照这里来完成

    this.controller.registerCustomerContainEvent({ onShare: () => {// 监听到 onShare 事件时的操作 return true // return true 表示拦截掉分享事件 false 就继续由 sdk 往下执行 } }) 

    四、自定义事件

    // 小窗播放事件 webviewBridage?.sendData('clickProduct', webviewData); // 没有小窗播放的情况: 监听自定义事件 webviewBridage?.sendData('clickProductCustom', webviewData); // 数据格式 const webviewData = { width: plvWebviewDataSize.width, height: plvWebviewDataSize.height, newPage: true, link: “跳转的自定义 url”, data: { type : out | inner | stock link : “跳转的自定义 url” ( 同上 link ) market : ‘5053’, code : 789465, name : 名称 }, } 

    clickProduct 事件 和 clickProductCustom 自定义 webviewData ---> data 下面根据 type 和 其他参数完成 app 内链接跳转功能

    对方案有任何疑问,可+V:wjc24680525 ,备注“小窗”

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5970 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 02:48 PVG 10:48 LAX 19:48 JFK 22:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86