You need to enable JavaScript to run this app.
文档中心
企业直播

企业直播

复制全文
下载 pdf
WebView SDK
集成 WebView SDK
复制全文
下载 pdf
集成 WebView SDK

本文介绍企业直播面向原生 App 内嵌场景的两个 WebView SDK:直播播放器 WebView SDK(byte-live-player) 与 uni web-view SDK(byte-live-webview)。两者定位与能力不同,请先选择适合的 SDK,再按对应章节接入。

前提条件

您已开通尊享版套餐。详见计费说明。

如何选择 WebView SDK

  • 若您需要支持应用内小窗(PiP),或需要提供宿主 App 提供分享、支付、下载、路由跳转等原生能力,请选择直播播放器 WebView SDK(byte-live-player)。
  • 若您仅需要在 uni-app 中内嵌 H5 观看页,并解决 Android WebView 下连麦无法触发相机或麦克风系统权限弹窗的问题,希望轻量接入,请选择 uni web-view SDK(byte-live-webview)。

两个 SDK 的具体对比如下表所示:

对比项直播播放器 WebView SDK(byte-live-player)uni web-view SDK(byte-live-webview)
交付形式原生插件 + AAR / Framework纯 JavaScript uni_modules,无原生插件
支持平台uni-app / Android / iOSuni-app(App Android、App iOS、H5)
应用内小窗 / 系统画中画(PiP)支持✅不支持,不提供 PiP ❌
宿主与 H5 双向通信支持✅支持✅(message / handlers)
Android 相机 / 麦克风运行时权限弹窗需宿主自行实现支持✅ 内置(allowedPermissions + manifest.json 声明)
WebSDK 首包入口资源预载 / 离线替换支持✅(需使用支持离线资源的 SDK 版本)Android App-Plus 支持✅;iOS 不支持本地入口资源处理
集成成本较高,需自定义调试基座 / 云打包较低,仅拷贝 JS 组件
典型场景需要小窗 / PiP、与宿主深度联动的观播体验只需内嵌观看页并解决连麦相机或麦克风权限弹窗的轻量接入

直播播放器 WebView SDK

直播播放器 WebView SDK 是面向原生 App 的集成 SDK。它以企业直播 H5 页面和 Web 观播 SDK 为内容载体,通过封装 WebView 容器,为开发者提供页面生命周期管理、小窗与 PiP 控制、宿主与 H5 通信等能力,帮助您快速集成企业直播观看体验。本文将分别介绍如何在 uni-app、Android 和 iOS 项目中接入和使用企业直播 WebView SDK。

适用场景

如果您希望将企业直播能力嵌入 Android、iOS 或 uni-app 宿主 App 中,并与 App 的原生能力进行联动,可以选择 WebView SDK。

WebView SDK 适用于以下场景:

  • 已拥有 Android、iOS 或 uni-app 宿主 App,需要在 App 内集成企业直播观看页。
  • 希望观播页面与 App 的导航栏、返回逻辑、安全区、小窗等交互保持一致。
  • 需要支持应用内小窗(PiP)等多任务观看体验。
  • 需要通过宿主 App 提供分享、支付、下载、路由跳转等原生能力。
  • 需要实现宿主与观播页面之间的双向通信和状态同步。

如果您希望直接在浏览器中访问直播页面,或仅需在 Web 页面中集成直播能力,则建议使用集成 Web 观播 SDK。

核心能力

企业直播 WebView SDK 提供以下核心能力:

  • 小窗与 PiP:支持应用内小窗播放,可配置小窗位置、尺寸、允许进入小窗的直播间状态,以及下拉刷新、侧滑返回等手势能力。部分场景下,小窗可展示签到、抽奖等直播互动信息,方便用户快速返回直播间。
  • 全屏播放与页面联动:支持全屏播放模式,并与宿主 App 的导航栏、安全区、返回逻辑等页面元素联动。宿主可根据业务需求控制导航栏显隐、页面布局及横屏体验。
  • 宿主与 H5 通信:提供宿主与观播页面之间的双向通信机制。宿主可以监听直播 WebView 事件,也可以通过 notifyWebview() 将事件和业务数据发送给 H5 页面。
  • 原生能力扩展:支持观播页面通过桥接机制向宿主 App 发起 Native API 请求。Android/iOS SDK 负责透传请求和回调结果,分享、支付、文件下载、图片保存、路由跳转、本地存储等具体能力由宿主按业务实现;uni-app 适配层内置了部分常用 API 代理。
  • 播放体验优化:针对直播场景优化 WebView 集成体验,支持页面切换、小窗切换等场景下的播放控制与状态管理。
  • WebSDK 首包入口资源预载:支持在 App 启动阶段预载 Web 观播 SDK 的入口 JS/CSS。打开观播页面时,SDK 优先使用已校验的本地入口资源;本地资源缺失、版本不匹配或校验失败时,自动回退到 CDN。

能力uni-appAndroidiOS
应用内小窗✅✅✅
系统画中画 (PiP)✅ (Android 8.0+)✅ (Android 8.0+)✅ (iOS 12+)
全屏播放✅✅✅
宿主与 H5 通信✅✅✅
原生能力扩展✅ (内置部分 API 代理)✅ (宿主实现)✅ (宿主实现)
下拉刷新✅✅ (宿主实现)✅ (宿主实现)
侧滑返回✅✅ (宿主实现)✅ (宿主实现)
WebSDK 首包入口资源预载✅(nativeplugin 接入方式下支持双端;纯 JS uni web-view 仅 Android App-Plus)✅✅(需配合 Loader)

uni-app 接入

uni-app SDK 以 DCloud 本地原生插件形式交付,包含 Android 和 iOS 原生能力封装,以及适用于 uni-app 的 JS 调用层。您可以通过 uni_modules/byte-live-player 调用 SDK 提供的 JS 接口,底层通过 nativeplugins/byteLivePlayer 接入 Android 和 iOS 原生能力。SDK 包同时包含 Android AAR、iOS Framework 以及 uni_modules 相关代码,您可直接集成至 uni-app 工程中使用。

环境要求

  • 仅支持 uni-app App-Plus 运行环境,需要使用包含 byteLivePlayer 原生插件的自定义调试基座、离线打包工程或云打包产物;标准基座不包含该插件。
  • Android 端要求 Android 5.0(API Level 21)及以上版本。系统级画中画(PiP)功能依赖 Android 8.0(API Level 26)及以上版本;低版本设备仍可使用应用内小窗能力。
  • Android 端如需在观播页面使用观众连麦功能,宿主 App 需具备摄像头和麦克风权限。WebView SDK 会承接 H5 与 uni-app 宿主之间的权限消息处理,您仍需在应用中声明相关 Android 权限,并确保应用具备对应运行时权限。
  • iOS 端要求 iOS 12.0 及以上版本。iOS 插件会自动合并运行所需的系统 Framework、权限声明及相关配置,开发者无需手动添加。
  • 如需在 iOS 模拟器中进行调试,请使用包含 Simulator Slice 的自定义基座或 .xcframework 产物。真机基座与模拟器基座不兼容,不能混用。

步骤一:下载 SDK 集成包

  1. 点击下载 SDK 集成包:
    byte-live-player-delivery-0.0.17.zip
    未知大小

    集成包目录如下所示:
    byte-live-player-delivery-<version>
    ├── nativeplugins
    │   └── byteLivePlayer
    │       ├── android
    │       │   └── ByteLivePlayer.aar
    │       ├── ios
    │       │   └── ByteLivePlayer.framework
    │       └── package.json
    └── uni_modules
        └── byte-live-player
    
  2. 解压 SDK 包,将 nativeplugins/byteLivePlayer 和 uni_modules/byte-live-player 分别拷贝到 uni-app 工程的同名目录下。
  3. (可选)如果您的 uni-app 工程使用 npm / Vite / Vue CLI 等模块化构建方式,建议在 package.json 中添加本地依赖,以便构建系统正确识别 SDK 模块:
    {
      "dependencies": {
        "@byte-live/live-player": "file:uni_modules/byte-live-player"
      }
    }
    
    添加后请重新执行依赖安装(如 npm install 或 pnpm install)。

步骤二:启用原生插件

在使用 SDK 前,需要在 uni-app 工程中启用原生插件 byteLivePlayer,否则运行时将无法调用相关能力。

  1. 您可通过以下两种方式启用:
    • 方式一:通过 HBuilderX 启用:在 HBuilderX 中打开 manifest.json,进入 App 原生插件配置页,勾选 byteLivePlayer 插件并保存。
    • 方式二:如果使用手动编辑 manifest.json,请在 app-plus.nativePlugins 中添加如下配置:
      {
          "app-plus": {
              "nativePlugins": {
                  "byteLivePlayer": {
                      "__plugin_info__": {
                          "name": "byteLivePlayer",
                          "description": "ByteLivePlayer: PiP, autoplay, etc (Android/iOS)",
                          "platforms": "Android,iOS",
                          "isCloud": false
                      }
                  }
              }
          }
      }
      
  2. 修改原生插件配置后,需要重新制作并安装包含该插件的自定义调试基座,或重新执行云打包或离线打包应用,否则插件不会生效。在代码中,可通过以下代码验证插件是否已生效:
    const byteLivePlayer = uni.requireNativePlugin('byteLivePlayer');
    if (!byteLivePlayer) {
      // 当前基座未包含 byteLivePlayer,需重新制作自定义基座或检查 nativeplugins 目录与 manifest 配置。
    }
    

步骤三:打开 WebView 页面

本小节介绍打开 WebView 页面的两种方式。

方式一:通过 LivePlayerManager 打开观播页面

SDK 提供默认的 LivePlayerManager 单例,用于创建和管理直播页面。引入 SDK 后,您可以通过 LivePlayerManager.open() 打开直播页面。示例代码如下所示。参数说明请参考下文。

import LivePlayerManager from '@byte-live/live-player';

LivePlayerManager.open('https://example.com/live', {
  contentPlayerWebViewId: 'live-room-xxx',  // 当前直播页面实例的唯一标识。必填。
  title: '直播',
  fullscreen: false,
  keepSafeTop: false,
  pipStyles: {
    enableInAppPiP: true,
    enableSystemPiP: true,
    pipSize: { ratio: 0.45 },
    allowedRoomStatuses: [1, 2, 3]
  },
  enablePullRefresh: true,
  enableSwipeBack: true
});

方式二:通过 LivePlayer 组件集成直播能力

如果希望以组件形式在页面中集成观播能力,也可以使用 LivePlayer 组件。多个组件实例之间相互独立,可分别进行生命周期管理。示例代码如下所示。参数说明请参考下文。

<template>
  <LivePlayer
    src="https://example.com/live"
    content-player-web-view-id="live-room-xxx"
    :pip-styles="pipStyles"
    @message="onMessage"
    @exit-web-view="onExitWebView"
  />
</template>

<script>
import { LivePlayer } from '@byte-live/live-player';

export default {
  components: { LivePlayer },
  data() {
    return {
      pipStyles: {
        enableInAppPiP: true,
        enableSystemPiP: true,
        pipSize: { ratio: 0.45 },
        allowedRoomStatuses: [1, 2, 3]
      }
    };
  },
  methods: {
    onMessage(event) {
      // event.detail.data 与 uni-app web-view message 形态对齐。
    },
    onExitWebView() {
      // 用户或 H5 触发退出播放。
    }
  }
};
</script>

参数说明

打开观播页面的参数说明如下所示。详情参考WebView SDK API 参考。

参数类型是否必填默认值说明

url

string

是

无

观播页面地址。

  • 通过 LivePlayerManager 打开直播页面场景下,使用 open(url, options);
  • 通过 LivePlayer 组件场景下,使用 src 或 url。
contentPlayerWebViewIdstring是无当前观播页面实例的唯一标识。您需使用唯一字符串,例如直播间 ID 或播放器实例 ID。不同直播页面实例应使用不同的值。该标识用于直播页面的创建、恢复、小窗展示和系统画中画等场景。请勿直接使用 plus.webview.currentWebview().id 作为 contentPlayerWebViewId。
titlestring否无观播页面标题。部分场景下可用于导航栏标题展示。仅在通过 LivePlayerManager 打开直播页面场景有效。
fullscreenboolean否true是否以全屏模式展示观播页面。仅在通过 LivePlayerManager 打开直播页面场景有效。
keepSafeTopboolean否true是否保留顶部安全区域。开启后,观播页面内容不会覆盖状态栏区域。仅在通过 LivePlayerManager 打开直播页面场景有效。
pipStylesobject否无小窗及系统画中画相关配置。
pipStyles.enableInAppPiPboolean否true是否启用应用内小窗能力。
pipStyles.enableSystemPiPboolean否false是否启用系统画中画(PiP)能力。Android 端系统级画中画(PiP)功能依赖 Android 8.0(API Level 26)及以上版本;低版本设备仍可使用应用内小窗能力。
pipStyles.pipSizeobject否无应用内小窗尺寸配置。
pipStyles.pipSize.rationumber否0.45应用内小窗宽度与屏幕宽度的比例,取值范围为 (0, 1]。

pipStyles.allowedRoomStatuses

number[]

否

[1, 2, 3]

允许进入小窗或系统画中画的直播间状态列表。取值如下:

  • 1:直播中
  • 2:预告
  • 3:回放
enablePullRefreshboolean否false是否启用下拉刷新。仅在通过 LivePlayerManager 打开直播页面场景有效。
enableSwipeBackboolean否true是否启用侧滑返回手势。仅在通过 LivePlayerManager 打开直播页面场景有效。
uniStoragePrefetchKeysstring[] | boolean否无控制是否同步 uni storage 到 H5 页面。传 string[] 时仅同步指定 key;传 false 时关闭同步。

步骤四:管理观播页面

您可通过以下方法管理观播页面:

方法说明
LivePlayerManager.close({ mode: 'hide' })隐藏当前观播页面,后续可通过 show() 恢复。
LivePlayerManager.close()关闭并销毁当前观播页面。
LivePlayerManager.show()恢复大窗展示。
LivePlayerManager.maximize()将观播页面从系统画中画恢复为大窗模式。
LivePlayerManager.minimize()进入系统画中画。
LivePlayerManager.enterInAppPiP()进入应用内小窗,返回是否成功发起。
LivePlayerManager.exitMiniWindow()退出应用内小窗。

Native API 承接

uni-app 适配层会将 H5 发起的部分 Native API 请求代理到宿主 uni 能力,包括 navigateTo、redirectTo、switchTab、showToast、showModal、downloadFile、downloadFileAbort、saveImageToPhotosAlbum、requestPayment 和 share。本地存储 get / set / remove 请求通过 uni storage bridge 承接。宿主仍需要按业务场景确认权限、支付/分享 provider、相册权限和路由白名单等配置。

Android 接入

环境要求

  • Android 5.0(API Level 21)及以上;其中 Android 系统 PiP 依赖 Android 8.0(API Level 26)及以上,低版本仍可使用应用内小窗。
  • 宿主工程建议使用 compileSdk / targetSdk 34 或以上;SDK 构建产物当前按 34 编译。
  • 宿主工程需要配置 google() 与 mavenCentral(),用于解析 AndroidX 与 fastjson 依赖。
  • SDK 依赖 AndroidX core、appcompat、swiperefreshlayout、webkit 以及 fastjson。
  • 如需使用系统 PiP,请按宿主 App 场景开启系统 Picture in Picture 能力;如需分享、支付、下载、相册等 Native API,由宿主自行声明权限并实现。

步骤一:引入 WebView SDK

  1. 点击下载 SDK 集成包。解压后,将 SDK 本地 Maven 仓库目录拷贝至您的 Android 工程中,例如放在 libs/bytelive-maven 下:
    byte-live-webview-sdk-local-maven-0.2.0.zip
    未知大小
    project
    ├── app
    ├── libs
    │   └── bytelive-maven
    └── settings.gradle
    
  2. 在工程中添加本地 Maven 仓库:
    repositories {
        google()
        mavenCentral()
        maven {
            url uri("$rootDir/libs/bytelive-maven")
        }
    }
    
  3. 添加 SDK 依赖:
    dependencies {
        implementation "com.bytelive:byte-live-webview-sdk:0.2.0"
    }
    

步骤二:创建 SDK 实例

通过 ByteLiveWebViewSdk.create() 创建 SDK 实例。

ByteLiveWebViewSdk sdk = ByteLiveWebViewSdk.create(
        activity,
        ByteLiveWebViewConfig.builder()
                .webViewDebugEnabled(true)
                .eventListener(event -> {
                    // 监听 SDK 事件
                })
                .bridgeHandler(new ByteLiveBridgeHandler() {
                    @Override
                    public void onInvokeNative(ByteLiveInvokeRequest request) {
                        // 处理 window.ByteLiveJsBridge.invokeNative(msg)
                    }

                    @Override
                    public void onNativeApiRequest(
                            ByteLiveNativeApiRequest request,
                            ByteLiveNativeApiResponder responder) {
                        // 处理 share / requestPayment / downloadFile / route / storage 等请求
                        responder.success(new JSONObject());
                    }
                })
                .build());

步骤三:配置观播页面

通过 attachContent() 配置观播页面信息。

sdk.attachContent(
        ByteLiveContentOptions.builder("live-content-xxx")
                .url("https://example.com/live")
                .top(0)
                .height(0)
                .autoplay(true)
                .navShellVisible(false)
                .miniWindowPosition(24, 120)
                .miniWindowSize(360, 202)
                .build());

参数说明如下所示:

参数是否必填默认值说明
id是无观播页面内容的唯一标识,由业务自定义。该值与 open() 中的 options.contentPlayerWebViewId 对应,后续展示、隐藏、关闭和小窗控制会使用同一标识定位内容。
url是无观播页面地址。
top否0页面顶部偏移,单位为 px。
height否0页面高度;为 0 或未传时,由 SDK 按宿主容器可用区域计算。
autoplay否false是否自动播放。
navShellVisible否false是否显示 SDK 内置导航容器。默认不显示,宿主可自行承接导航栏。
miniWindowPosition否SDK 默认位置应用内小窗初始位置,例如 miniWindowPosition(left, top)。
miniWindowSize否SDK 默认尺寸应用内小窗尺寸,例如 miniWindowSize(width, height)。
navTitle否无SDK 内置导航容器标题。
immersiveProgress否false是否使用沉浸式加载进度样式。
keepSafeTop否false是否保留顶部安全区。
miniWindowWidthRatio否无应用内小窗宽度占屏幕宽度的比例。

步骤四:展示观播页面

调用 showShell() 展示观播页面。

sdk.showShell("live-content-xxx");

iOS 接入

环境要求

  • iOS 12.0 及以上。
  • 宿主工程使用 Xcode 14 或以上版本构建。
  • SDK 产物为 ByteLiveWebViewSdk.xcframework,同时包含 iPhoneOS 与 iPhone Simulator slice。
  • SDK 使用 Foundation、UIKit、WebKit、AVFoundation、AVKit、CoreMedia、QuartzCore、CFNetwork、CoreGraphics 等系统 Framework。
  • 如需使用系统 PiP,请在宿主 App 开启 Picture in Picture 能力;分享、支付、相册、文件下载等业务能力由宿主自行声明权限并在 ByteLiveBridgeHandler 中处理。

步骤一:引入 WebView SDK

  1. 点击下载 SDK 集成包。解压后,把 ByteLiveWebViewSdk.xcframework 加入 Xcode 工程,并设置 Embed & Sign。
    ByteLiveWebViewSdk.xcframework-0.2.0.zip
    未知大小
  2. 在代码中引入头文件:
#import <ByteLiveWebViewSdk/ByteLiveWebViewSdk.h>

步骤二:创建 SDK 实例

在 ViewController 中初始化 SDK,并实现协议:

@interface LiveHost () <ByteLiveEventListener, ByteLiveBridgeHandler>
@property (nonatomic, strong) ByteLiveWebViewSdk *sdk;
@end

初始化配置:

ByteLiveWebViewConfig *config = [ByteLiveWebViewConfig configWithEventListener:self
                                                                bridgeHandler:self];
config.webViewDebugEnabled = YES;

self.sdk = [ByteLiveWebViewSdk createWithViewController:self config:config];

步骤三:配置观播页面

通过 ByteLiveContentOptions 配置观播页面信息。

ByteLiveContentOptions *content = [[[[[[ByteLiveContentOptions optionsWithId:@"live-content-xxx"]
    url:@"https://example.com/live"]
    top:0]
    height:0]
    autoplay:YES]
    navShellVisible:NO];

参数是否必填默认值说明
id是无观播页面内容的唯一标识,由业务自定义。该值与 open() 中的 options.contentPlayerWebViewId 对应,后续展示、隐藏、关闭和小窗控制会使用同一标识定位内容。
url是无观播页面地址。
top否0页面顶部偏移,单位为 px。
height否0页面高度;为 0 或未传时,由 SDK 按宿主容器可用区域计算。
autoplay否false是否自动播放。
navShellVisible否false是否显示 SDK 内置导航容器。默认不显示,宿主可自行承接导航栏。

步骤四:展示观播页面

调用 showShell() 展示观播页面。

[self.sdk attachContent:content];
[self.sdk showShell:@"live-content-xxx"];

配置 WebSDK 首包离线资源自动预载

如果您希望降低 Web 观播 SDK 首包入口资源的加载耗时,可以在 App 启动阶段开启 WebSDK 首包离线资源自动预载。开启后,SDK 会预载指定 accessType 对应的入口 JS/CSS,并在打开观播页面时优先使用已校验的本地资源;如本地资源不可用,会自动回退到 CDN,不阻塞观播页面打开。

说明

请使用 Web 观播 SDK 2.1.62 或以上版本。

不同接入形态的支持范围如下所示:

接入形态支持平台使用方式
byteLivePlayer nativepluginAndroid / iOS升级 nativeplugin 与 @byte-live/live-player,在 App.vue 的 onLaunch 中调用一次 initializeWebSDKOffline()。如需双端增强,观看页需同时接入 Loader。
Android Native SDKAndroid在 Application.onCreate 或等价启动入口调用一次 initializeWebSDKOffline()。
iOS Native SDKiOS在 AppDelegate didFinishLaunchingWithOptions 或等价启动入口调用一次 initializeWebSDKOffline(),并配合 Loader 使用。
纯 JS byte-live-webviewAndroid App-Plus继续使用 SDK 托管的 ByteLiveWebView 组件。SDK 在首次加载页面前安装本地资源请求重写规则。
纯 JS byte-live-webviewiOS / H5不支持本地入口资源处理,继续走 CDN;如需 iOS 离线资源能力,请迁移至 byteLivePlayer nativeplugin。

方式一:不改观播页面,需优化 Android 端首包加载

如果暂时不能修改观播页面,仅需要优化 Android 首包加载,可以保持页面原有 WebSDK CSS/JS 引入方式不变,并在 App 启动阶段开启预载。该方式要求显式传入页面当前使用的 accessType 和 webSDKVersion,且两者必须与页面实际加载的 WebSDK 版本一致。

import { initializeWebSDKOffline } from '@byte-live/live-player';

initializeWebSDKOffline({
  enabled: true,
  strategy: 'preferLocal',
  accessType: 'mobile',
  webSDKVersion: '<2.1.55>'
});

参数说明如下所示:

参数是否必填说明
enabled是是否开启 WebSDK 首包离线资源自动预载。取值为 true 时开启。
strategy是资源加载策略。取值如下:
* networkOnly:仅使用网络资源,不启用本地入口资源。
* preferLocal:优先使用已校验的本地入口资源;本地资源不可用时自动回退到 CDN。
accessType是观播页面实际使用的 WebSDK 接入类型,与 WebSDK Loader 的 data-access-type 取值一致。取值如下:
* pc:PC 端,仅支持模块化接入。
* player-pc:PC 端,单独接入播放器模块。
* mobile:移动端,支持模块化接入或整页接入。
* mobile-all:移动端,仅支持整页接入。
* player-mobile:移动端,单独接入播放器模块。
webSDKVersion是填写页面中固定引入的 WebSDK 版本,需与页面实际加载的 WebSDK 版本保持一致。如果观播页面使用 WebSDK Loader 接入并开启远程升级,Loader 最终加载的版本可能动态变化,方式一无法保证与 Native 侧传入的 webSDKVersion 一致并命中本地资源。如需在 Loader 场景稳定使用本地入口资源,请采用方式二。

方式二:升级 Loader,跨端入口资源预载

如果需要 Android 和 iOS 都能优先使用已校验的本地入口资源,请将观播页面中直接引入的 WebSDK CSS/JS 替换为官方 Loader,并在创建 ByteLiveWebSDK 实例前等待 Loader 完成资源选择。该方式下,webSDKVersion 为可选参数;传入时仅作为预载候选,不覆盖 Loader 的最终版本决策。

import {
  initializeWebSDKOffline,
  preloadWebSDK
} from '@byte-live/live-player';

// App 启动阶段调用一次即可,无需等待预载完成再打开观播页面。
initializeWebSDKOffline({
  // 是否开启 WebSDK 首包离线资源自动预载。
  enabled: true,
  // 资源加载策略。preferLocal 表示优先使用已校验的本地入口资源。
  strategy: 'preferLocal',
  // 观播页面实际使用的 WebSDK 接入类型。
  accessType: 'mobile'
});

// 可选:如需为其他 WebSDK 接入类型提前准备入口资源,可在初始化后调用。
preloadWebSDK({
  accessType: 'player-mobile'
});

观播页面接入 Loader 后,在初始化 Web 观播 SDK 前等待 Loader 完成:

window.LiveSaaSWebSDKLoader.ready()
  .then(function (result) {
    console.log('WebSDK source ready', result.version);
    return new window.ByteLiveWebSDK(webSDKOptions);
  })
  .catch(function (error) {
    console.error('WebSDK Loader failed', error);
  });

如观播页面配置了 CSP(Content Security Policy,内容安全策略),请放行 Loader CDN、WebSDK CDN 以及本地离线资源使用的 bytelive-offline: scheme,避免浏览器拦截 Loader、WebSDK 静态资源或本地离线资源加载。

uni web-view SDK

如果您的项目仅需在 uni-app 中加载企业直播 H5 页面,并承接 H5 与宿主之间的消息通信、Android 运行时权限申请等能力,可以接入 uni web-view SDK。该 SDK 是面向 Uni 环境的专用 SDK 包,以纯 JavaScript 的 uni_modules 组件形式交付。

  • 当前版本:0.4.0
  • 支持范围:uni-app Vue 2 / Vue 3,App Android、App iOS 和 H5
  • 交付形式:uni_modules,不包含原生插件、AAR 或 Framework

步骤一:安装 SDK

安装 SDK:获取 SDK 压缩包并解压,将 uni_modules/byte-live-webview 目录复制到 uni-app 项目根目录下。

byte-live-webview-delivery-0.4.0.zip
未知大小
你的 uni-app 项目/
└── uni_modules/
    └── byte-live-webview/
        ├── components/
        ├── js/
        ├── static/
        ├── web/
        ├── index.js
        └── package.json

步骤二:注册组件

在项目的 pages.json 中增加 easycom 配置。如果项目已有 easycom,只需合并 custom 中的组件规则:

{
  "easycom": {
    "autoscan": true,
    "custom": {
      "^ByteLiveWebView$": "@/uni_modules/byte-live-webview/components/ByteLiveWebView.vue"
    }
  }
}

步骤三:在页面中使用

在需要加载观播页面的位置使用 ByteLiveWebView 组件。

<template>
  <view class="page">
    <ByteLiveWebView
      :src="liveUrl"
      :webview-styles="webviewStyles"
      @message="onMessage"
      @load="onLoad"
      @error="onError"
    />
  </view>
</template>

<script>
export default {
  data() {
    return {
      liveUrl: 'https://example.com/live/index.html',
      webviewStyles: {
        top: '0px',
        bottom: '0px'
      }
    };
  },
  methods: {
    onMessage(event) {
      // 透传 H5 的原始消息,数据位于 event.detail.data。与 uni-app 原生 <web-view @message> 的数据结构一致。
      console.log('收到 H5 消息:', event.detail.data);
    },
    onLoad(event) {
    // WebView 页面加载完成。
      console.log('页面加载完成:', event);
    },
    onError(event) {
    // WebView 页面加载失败,或 Android WebView 初始化失败。
      console.error('页面加载失败:', event);
    }
  }
};
</script>

常用配置说明如下所示:

配置项说明
src要加载的 H5 页面地址。
webview-stylesWebView 的位置、尺寸和进度条等样式。

overrideResourceRequest

当您需要将线上资源替换为 App 本地资源时,可配置 overrideResourceRequest 请求重写 Android 资源。该能力仅在 App Android 生效。

  • redirect 应使用 _www、_doc、_downloads 或 _documents 等 HTML5+ 本地路径。
  • 使用 Android 5+ App 时,需要选择 “解压资源后运行” 模式。运行过程中更新规则只影响后续请求,不会自动刷新当前页面。
  • overrideResourceRequest 是手动资源请求重写能力。如需由 SDK 自动下载、校验并生成 WebSDK 入口资源重写规则,请使用支持 WebSDK 首包离线资源自动预载的版本,并参考“配置 WebSDK 首包离线资源自动预载”。
<ByteLiveWebView
  :src="liveUrl"
  :override-resource-request="[
    {
      match: '^https://example\\.com/live/assets/app\\.js(?:\\?.*)?$',
      redirect: '_www/static/offline/app.js',
      mime: 'application/javascript',
      encoding: 'UTF-8'
    }
  ]"
/>

常用事件说明如下所示:

事件说明
message透传 H5 的原始消息,数据位于 event.detail.data。与 uni-app 原生 <web-view @message> 的数据结构一致。
loadWebView 页面加载完成。
errorWebView 页面加载失败,或 Android WebView 初始化失败。
business-resultSDK 内置或自定义 handler 执行成功。
business-error消息校验或 handler 执行失败。
reply-error业务结果未能回传给 H5,不改变原业务执行结果。
resource-errorH5 中的 script、link、img 等资源加载失败。

步骤四:配置 Android 运行时权限

如果 H5 需要申请相机、麦克风等权限,例如用于观众连麦,需要在宿主项目的 manifest.json 中声明对应权限,您也可以在组件中设置 allowedPermissions 权限白名单。

  1. (可选)在组件中设置权限白名单:
    <ByteLiveWebView
      :src="liveUrl"
      :allowed-permissions="[
        'android.permission.CAMERA',
        'android.permission.RECORD_AUDIO'
      ]"
    />
    
  2. 在宿主项目的 manifest.json 中声明对应权限。运行时申请不能代替 manifest.json 声明,两者必须同时配置。
    {
      "app-plus": {
        "distribute": {
          "android": {
            "permissions": [
              "<uses-permission android:name=\"android.permission.CAMERA\"/>",
              "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>"
              "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"
            ]
          }
        }
      }
    }
    
    上述权限说明如下所示:
    • CAMERA:视频连麦所需的摄像头权限。
    • RECORD_AUDIO:音频、视频连麦所需的麦克风权限。
    • MODIFY_AUDIO_SETTINGS:连麦音频链路所需的音频设置权限。

    说明

    App iOS 不提供同类批量权限接口,具体权限仍由相机、定位等业务 API 在实际调用时触发。

步骤五:(可选)透传 Web 观播 SDK 事件

如果您希望在 uni-app 的 @message 回调中获取 Web 观播 SDK 的业务事件或播放器事件,需要在集成 Web 观播 SDK 的 H5 页面中监听对应事件,并通过 uni.postMessage 转发给宿主。

以下以商品购买点击事件(productPurchase.click)和播放器播放中事件(player.playing)为例。

在 H5 页面中转发事件

在 H5 页面中引入 uni-app WebView 通信脚本,并等待通信桥就绪。以下代码中的 webSDK 为您已创建的 Web 观播 SDK 实例。

<script>
  var viewerEventQueue = [];
  var viewerBridgeReady = false;

  function forwardViewerEvent(action, payload) {
    var message = {
      source: 'viewer-event',
      action: action,
      payload: payload
    };

    if (!viewerBridgeReady) {
      viewerEventQueue.push(message);
      return;
    }

    window.uni.postMessage({ data: message });
  }

  function onViewerBridgeReady() {
    if (viewerBridgeReady ||
        !window.uni ||
        typeof window.uni.postMessage !== 'function') {
      return;
    }

    viewerBridgeReady = true;

    viewerEventQueue.splice(0).forEach(function (message) {
      window.uni.postMessage({ data: message });
    });
  }

  document.addEventListener(
    'UniAppJSBridgeReady',
    onViewerBridgeReady
  );
</script>

<script src="https://lf3-static.bytednsdoc.com/obj/eden-cn/ozeh7nuhfhbobps/uni.webview.1.5.8.js"></script>

<script>
  if (window.UniAppJSBridge) {
    onViewerBridgeReady();
  }

  // 在已有 WebSDK 实例上注册监听,请在需要捕获的事件触发前执行。
  webSDK.on('productPurchase.click', function (payload) {
    forwardViewerEvent('productPurchase.click', payload);
  });

  webSDK.on('player.playing', function (payload) {
    forwardViewerEvent('player.playing', payload);
  });
</script>

您可以按相同方式监听并转发其他 Web 观播 SDK 事件。转发的数据应为可序列化的数据,请勿传递函数、DOM 元素或播放器实例。

在 uni-app 页面中接收事件

将 ByteLiveWebView 的 src 设置为上述 H5 页面地址,并通过 @message 接收消息。event.detail.data 为消息数组,建议逐条处理。

<template>
  <ByteLiveWebView
    :src="liveUrl"
    @message="onMessage"
  />
</template>

<script>
export default {
  data() {
    return {
      liveUrl: 'https://example.com/live/index.html'
    };
  },
  methods: {
    onMessage(event) {
      var messages = (event.detail && event.detail.data) || [];

      messages.forEach(function (message) {
        if (!message || message.source !== 'viewer-event') {
          return;
        }

        switch (message.action) {
          case 'productPurchase.click':
            console.log('商品购买点击:', message.payload);
            // 按业务需求处理购买点击。
            break;

          case 'player.playing':
            console.log('播放器正在播放:', message.payload);
            break;
        }
      });
    }
  }
};
</script>

说明:

  • 本示例适用于 uni-app App Android、App iOS。H5 平台的消息通信需单独适配。
  • source: 'viewer-event' 为本示例约定的消息标记,用于区分观看事件与其他 H5 消息。
  • 仅接收事件时,无需配置 handlers;消息通过 @message 原样透传。
  • SDK 不会自动订阅 Web 观播 SDK 事件,您需要在 H5 页面中显式监听并转发。

了解更多

WebView SDK API 参考

最近更新时间:2026.11.03 10:39:13
这个页面对您有帮助吗?
有用
有用
无用
无用