博客 / 詳情

返回

如何實現App內的視頻/直播懸浮小窗播放

方案概述

  • 功能:使用webview的方案,在App中實現視頻/直播的懸浮小窗播放效果,支持應用內小窗、系統小窗,在訂單頁小窗播放,回到直播間小窗消失
  • 場景:適用於要在App中快速實現直播帶貨場景,或在App中需要點播視頻小窗播放的場景
  • 支持環境:安卓、iOS、鴻蒙
  • 前置條件:使用保利威的webview SDK Demo,對方案有任何疑問,可通過思否私信

一、安卓對接説明

1.1 集成簡介

1.1.1 項目架構圖

plv_webview_sdk_流程圖 (1).png

1.1.2 使用源碼項目集成

當前將提供的源碼包中的PolyvAndroidWebViewDemo、PLVWebViewSDK、PLVJsBridge、PLVFloatWindow四個項目放入到同一目錄下,然後使用編譯器打開PolyvAndroidWebViewDemo項目即可。

1.1.3 源碼集成注意事項

功能對接説明

參考 1.2 功能對接文檔

更換通信協議

如果需要更換web-native通信協議的情況時,可以參考提供的  1.3 更換web-native通信規則注意事項[](https://j9k9c2q2qc.feishu.cn/docx/U7D5dyO4NoXlSBxu0emchu5AnSD... "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 項目架構圖

ios plv sdk.png

2.1.2 運行環境要求

名稱· 要求
iOS系統 9.0+
CocoaPods 1.11.3+
Xcode 11.0+

2.1.3 API文檔

詳細接口文檔請參見 API文檔

Demo 倉庫 Tag 依賴 SDK 版本 API 文檔
3.0.0 3.0.0 v3.0.0 API
2.1.2 2.1.2 v2.1.2 API
2.1.1 2.1.1 v2.1.1 API
2.1.0 2.1.0 v2.1.0 API

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.mainWebView.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.4 使用示例

3.4.1 綁定WindowStage

首先需要在Ability中為PLVWebViewWindowManager綁定用到windowStage

 onWindowStageCreate(windowStage: window.WindowStage): void {// Main window is created, set main page for this abilityPLVLogger.info(TAG, 'Ability onWindowStageCreate');// demo核心代碼PLVWebViewWindowManager.setWindowStage(windowStage)
    windowStage.loadContent(CONTENT, new LocalStorage(), (err, data) => {if (err.code) {PLVLogger.info(TAG, 'Failed to load the content. Cause: ' + JSON.stringify(err) ?? '');
        return;
      }PLVLogger.info(TAG, 'Succeeded in loading the content. Data: ' + JSON.stringify(data) ?? '');
    });
  }

3.4.2 使用PLVWeb組件

@Entry@Component
struct PLVWebPage {@StorageLink('inputWebConfig') config: PLVWebViewConfig = new PLVWebViewConfig().setUrl("")@State controller: PLVWebController = new PLVWebController({ config: this.config!! })
  aboutToAppear(): void {this.controller.registerHandler("自定義事件", (data: string) => {// 監聽自定義事件的處理
    })this.controller.callHandle("發送原生事件", "xxx", () => {//發送原生事件
    })this.controller.registerCustomerContainEvent({
      onShare: () => {// 監聽到onShare事件時的操作return true // return true表示攔截掉分享事件 false就繼續由sdk往下執行
      }
    })
  }
  build() {
    Column() {
      PLVWeb({ controller: this.controller })
    }
    .width(PLVCommonConstants.FULL_PERCENT)
  }
  onBackPress(): boolean | void {if (this.controller.accessBackward()) {this.controller.backward()return true
    }return false
  }
}

注意該組件需要放在一個單獨的pages頁面中,因為創建的Web窗口需要一個單獨page頁面

3.4.3 Demo使用

@Entry(storage)
@Component
struct PLVInputPage {
  inputUrl: string = 'https://www.polyv.net'
  config: PLVWebViewConfig = new PLVWebViewConfig().setUa("Android" + PLVUAConfig.defaultUA)
    .setUrl(this.inputUrl)
    .setAllowFloatingWindow(true)

  build() {
    Stack({ alignContent: Alignment.Top }) {
        ...
        Button("打開Web")
          .margin(24)
          .onClick(() => {
            if (!PLVWebViewWindowManager?.getWebViewWindow()) {
              this.config.setUrl(this.inputUrl)AppStorage.setOrCreate('inputWebConfig', this.config);
              // 為webWindow綁定一個page頁面,用於窗口的顯示// true表示初始化後立刻打開webWindow
              PLVWebViewWindowManager?.initWindow(true, "pages/PLVWebPage")
              return
            }
          })
      }
        ....
  }
}

為PLVWebViewWindowManager綁定了WindowStage後,可以通過PLVWebViewWindowManager?.initWindow(true, "pages/PLVWebPage") 來進行初始化化,如果傳入參數true時,當初始化後立刻展示WebWindow,也可以選擇傳入false,初始化後不立刻展示WebWindow 再通過PLVWebViewWindowManager.showWebViewWindow()來進行展示

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 : 名稱
        },
}

out 外部
inner 內部
stock 基金 

clickProduct事件 和 clickProductCustom自定義 webviewData ---> data 下面根據 type 和 其他參數完成 app 內鏈接跳轉功能

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.