HarmonyOS鸿蒙Next中uniapp-x应该如何获取原生侧的webviewController?并自定义UA?

HarmonyOS鸿蒙Next中uniapp-x应该如何获取原生侧的webviewController?并自定义UA? 我们使用uniapp-x开发鸿蒙app。

目前的问题是:webview如何自定义useragent?

我们设想是通过uniapp-x拿到鸿蒙的controller,调用鸿蒙的api来设置ua,最后再让webvirw组件加载网页。尝试后发现不行,各位大佬可以提供给我们uniapp-x自定义UA的解决方案和示例代码吗?

5 回复

【解决方案】

目前无法获取uni-app x的webview的WebviewController。uni-app x也还不支持和uni-app一样在manifest.json配置useragent,后续应该会支持配置。可以通过以下方式设置UA或等待uni-app修复此问题。

方式一(推荐):运行时通过webview的evalJS方法执行JS代码修改UA。

<template>
	<web-view id="xxx" src="../../static/index.html"></web-view>
</template>

<script>
	export default {
		data() {
			return {
				_webview: null as WebviewContext | null
			}
		},
		onReady() {
			const jscode = `navigator.__defineGetter__('userAgent', function(){
  return 'UniAppX-Custom-UA HarmonyOS5';
})`
			this._webview = uni.createWebviewContext('xxx', this);
			this._webview?.evalJS(jscode)
		},
		methods: {

		}
	}
</script>

方式二:开发时修改uni-app x的webview组件源码,使用生成的HarmonyOS工程打包。

文件路径:uni-app x项目工程/unpackage/dist/dev/app-harmony/oh_modules/@dcloudio/uni-app-x-runtime/src/main/ets/runtime/components/WebView.ets。

将以下代码

const userAgent = getUniApp()!.userAgent.fullUserAgent as string
this.controller?.setCustomUserAgent(userAgent)

修改为

const userAgent = '自定义UA'
this.controller?.setCustomUserAgent(userAgent)

更多关于HarmonyOS鸿蒙Next中uniapp-x应该如何获取原生侧的webviewController?并自定义UA?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


全局UA设置

// 在鸿蒙原生侧创建插件(如webview-ua.ets)
import { webview } from '@kit.ArkWeb';

export function setGlobalUserAgent(ua: string) {
  try {
    const defaultUA = webview.WebviewController.getDefaultUserAgent();
    const customUA = `${defaultUA} ${ua}`;
    webview.WebviewController.setAppCustomUserAgent(customUA);
  } catch (error) {
    console.error(`设置失败:${error.code}, ${error.message}`);
  }
}

UniApp-X 调用

// 通过条件编译调用原生方法
// #ifdef APP-HARMONYOS
const nativeModule = uni.requireNativePlugin('webview-ua');
nativeModule.setGlobalUserAgent('MyApp/1.0');
// #endif

实现思路

通过原生插件获取WebviewController:需开发原生插件获取鸿蒙的WebviewController实例,调用setCustomUserAgent()方法实现UA定制

设置时机选择:建议在onControllerAttached生命周期回调中设置UA,避免因加载时序问题导致失效

示例参考

原生侧扩展代码:

// 原生插件代码

export struct WebViewPlugin {

  // 设置自定义UA的扩展方法

  static setCustomUA(controller: webview.WebviewController, ua: string): void {

    try {

      controller.setCustomUserAgent(ua);

    } catch (error) {

      console.error(`设置失败 ErrorCode: ${error.code}, Message: ${error.message}`);

    }

  }

}

Uniapp-X调用侧代码:

// 页面逻辑层

import { nativePlugin } from '原生插件模块';

export default {

  onReady() {

    const webview = uni.requireNativePlugin('webview');

    webview.create({

      // ...其他配置

      onControllerAttached: (controller) => {

        nativePlugin.WebViewPlugin.setCustomUA(controller, 'DemoApp/1.0 HarmonyOS');

      }

    });

  }

}

在HarmonyOS Next中,使用UniApp-X获取原生侧WebviewController需通过Native API调用。具体使用uni.requireNativePlugin引入鸿蒙原生模块,调用getWebviewController方法获取实例。

自定义UserAgent可通过获取的WebviewController调用setUserAgentString方法直接设置UA字符串。需注意鸿蒙Next的Webview API与Android存在差异,应使用鸿蒙提供的Web组件相关接口实现。

在HarmonyOS Next中,通过uniapp-x获取原生WebviewController并自定义UA,需使用uni.requireNativePlugin调用原生模块。以下是示例代码:

// 引入鸿蒙Webview插件
const webviewModule = uni.requireNativePlugin('ohos-webview');

// 创建Webview实例并获取Controller
let webview = webviewModule.createWebview();
let controller = webview.getWebviewController();

// 设置自定义UA
controller.setUserAgent('YourCustomUserAgentString');

// 加载URL
webview.loadUrl('https://example.com');

注意:需在原生侧配置Webview插件并导出对应方法,具体依赖鸿蒙SDK的WebView组件能力。建议查阅uniapp-x官方文档中关于原生插件集成的部分,确保模块正确注册。

回到顶部