深入鸿蒙 Web 组件:开启深色模式与自定义 UserAgent 原创

SameX
发布于 2024-10-17 13:46
浏览
0收藏

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。
主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。
本文为原创内容,任何形式的转载必须注明出处及原作者。

设置深色模式
ArkWeb 支持对前端页面进行深色模式配置。通过 darkMode() 接口可以配置不同的深色模式,默认关闭。当深色模式开启时,Web 将启用媒体查询 prefers-color-scheme 中网页所定义的深色样式,若网页未定义深色样式,则保持原状。

@Entry
@Component
struct WebComponent {
  // ...
  @State mode: WebDarkMode = WebDarkMode.Auto;
  build() {
    Column() {
      // ...
      Web({
        // ...
        .darkMode(this.mode)
      })
    }
  }
}

通过 forceDarkAccess() 接口可将前端页面强制配置深色模式,强制深色模式无法保证所有颜色转换符合预期,且深色模式不跟随前端页面和系统。

@Entry
@Component
struct WebComponent {
  // ...
  @State mode: WebDarkMode = WebDarkMode.On;
  @State access: boolean = true;
  build() {
    Column() {
      // ...
      Web({
        // ...
        .darkMode(this.mode)
        .forceDarkAccess(this.access)
      })
    }
  }
}

设置 UserAgent
从 API version 11 起,Web 组件基于 ArkWeb 的内核,默认 UserAgent 定义如下:

Mozilla/5.0 ({deviceType}; {OSName} {OSVersion}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 ArkWeb/{ArkWeb VersionCode} {Mobile}

建议通过 ArkWeb 关键字识别是否是 HarmonyOS 设备以及 web 内核是否为 ArkWeb,同时可以通过 deviceType 识别设备类型用于不同设备上的页面显示。

@Entry
@Component
struct WebComponent {
  // ...
  build() {
    Column() {
      // ...
      Button('getUserAgent')
        .onClick(() => {
          try {
            let userAgent = this.controller.getUserAgent();
            console.log("userAgent: " + userAgent);
          } catch (error) {
            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
          }
        })
      // ...
    }
  }
}
@Entry
@Component
struct WebComponent {
  // ...
  aboutToAppear(): void {
    webview.once('webInited', () => {
      try {
        // 应用侧用法示例,定制 UserAgent。
        this.ua = this.controller.getUserAgent() + 'xxx';
        this.controller.setCustomUserAgent(this.ua);
      } catch (error) {
        console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
      }
    });
  }
  build() {
    Column() {
      // ...
    }
  }
}

使用隐私模式
开发者在创建 Web 组件时,可以将可选参数 incognitoMode 设置为 ‘true’,来开启 Web 组件的隐私模式。当使用隐私模式时,浏览网页时的 cookies、 cache data 等数据不会保存在本地的持久化文件,当隐私模式的 Web 组件被销毁时,cookies、 cache data 等数据将不被记录下来。

@Entry
@Component
struct WebComponent {
  // ...
  build() {
    Column() {
      // ...
      Web({
        // ...
        .incognitoMode(true)
      })
    }
  }
}
@Entry
@Component
struct WebComponent {
  // ...
  build() {
    Column() {
      // ...
      Button('isIncognitoMode')
        .onClick(() => {
          try {
            let result = this.controller.isIncognitoMode();
            console.log('isIncognitoMode' + result);
          } catch (error) {
            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
          }
        })
      // ...
    }
  }
}

隐私模式提供了一系列接口,用于操作地理位置、Cookie 以及 Cache Data。

@Entry
@Component
struct WebComponent {
  // ...
  build() {
    Column() {
      // ...
      Button('allowGeolocation')
        .onClick(() => {
          try {
            // allowGeolocation 第二个参数表示隐私模式(true)或非隐私模式(false)下,允许指定来源使用地理位置。
            webview.GeolocationPermissions.allowGeolocation(this.origin, true);
          } catch (error) {
            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
          }
        })
      // ...
    }
  }
}

使用运动和方向传感器
Web 组件可以通过 W3C 标准协议接口对接运动和方向相关的传感器。开发者在使用该功能中的加速度、陀螺仪及设备运动事件接口时,需在配置文件中声明相应的传感器权限。

@Entry
@Component
struct WebComponent {
  // ...
  aboutToAppear() {
    // ...
    let atManager = abilityAccessCtrl.createAtManager();
    try {
      atManager.requestPermissionsFromUser(getContext(this), ['ohos.permission.ACCELEROMETER', 'ohos.permission.GYROSCOPE'], (err: BusinessError, data: PermissionRequestResult) => {
        // ...
      });
    } catch (error) {
      // ...
    }
  }
  build() {
    Column() {
      // ...
      Web({
        // ...
        .onPermissionRequest((event) => {
          if (event) {
            // ...
          }
        })
        // ...
      })
    }
  }
}

在新窗口中打开页面
Web 组件提供了在新窗口打开页面的能力,开发者可以通过 multiWindowAccess() 接口来设置是否允许网页在新窗口打开。

@Entry
@Component
struct WebComponent {
  // ...
  build() {
    Column() {
      // ...
      Button('createPort')
        .onClick(() => {
          try {
            // ...
          } catch (error) {
            // ...
          }
        })
      // ...
    }
  }
}

总结
通过本文,相信您已经了解了华为鸿蒙 ArkWeb 的设置基本属性和事件,包括设置深色模式、设置 UserAgent、使用隐私模式、使用运动和方向传感器以及在新窗口中打开页面等功能。这些功能可以帮助您更好地控制 Web 组件的行为,并提升您的应用程序的性能和用户体验。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
收藏
回复
举报
回复
    相关推荐