前言

在实际业务中,我们需要加载 h5页面,而同一个h5页面可能在不同app中打开,我们需要对加载h5页面的环境做判断,这里我们的业务中修改UA,前端或者服务端可以通过UA来判断来源。
同样的,我们的登录页面是原生页面,有些h5页面需要登录状态才能访问,而我们的业务中是通过cookie来判断用户权限。

UA管理

根据文档介绍:User-Agent(简称UA)是一个特殊的字符串,包含设备类型、操作系统及版本等关键信息,在HarmonyOS中,默认值为: Mozilla/5.0 ({DeviceType}; {OSName} {OSVersion}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{ChromeCompatibleVersion}.0.0.0 Safari/537.36 ArkWeb/{ArkWeb VersionCode} {DeviceCompat} {扩展区},具体的字段说明,可以参考官方文档默认user-agent结构
我们可以通过this.controller.getUserAgent()来获取默认值,同时我们也可以通过setCustomUserAgent来设置UA的值。
下面来看具体例子

@Entry
@Component
struct WebComponent {
  controller: webview.WebviewController = new webview.WebviewController();
  @State customUserAgent: string = ' appName_appVersion';

  build() {
    Column() {
      Web({ src: 'www.example.com', controller: this.controller })
        .onControllerAttached(() => {
          console.log("onControllerAttached");
          try {
            let userAgent = this.controller.getUserAgent() + this.customUserAgent;
            this.controller.setCustomUserAgent(userAgent);
          } catch (error) {
            console.error(`ErrorCode: ${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`);
          }
        })
    }
  }
}
 

注意,这里建议在onControllerAttached方法中设置。
这样,我们就可以在h5页面中根据拼接的值来判断当前页面处于哪个环境,进行做出不同的处理。 当app升级时,同时修改拼接的字符串,可以根据不同的版本号来做版本兼容。

我们的业务中登录状态是放在请求头的cookie字段中,服务端可根据cookie来识别用户身份以及权限。
但我们的登录页面是原生页面,某些h5页面也需要登录才能访问,这就需要我们在原生页面登录成功后,将cookie同步到h5中,进而使得h5可以正常访问。
这里假设我们登录后将cookie做了持久化存储,并且可以通过 getCookie()方法来获取到cookie

 setSessionId() {
    const sessionid = getCookie()
    hilog.error(0x01, 'WebComponent', 'setSessionId --> ' + sessionid)
    if(sessionid){
      webview.WebCookieManager.configCookieSync('.xxx.com', sessionid);
      webview.WebCookieManager.configCookieSync('.yyy.com', sessionid);
    }

  }

我们可以在页面可见时就调用该方法设置web组件的cookie值,但官方介绍中说同步cookie的时机建议在Web组件加载之前完成。
需要注意的是:

configCookie中的url,可以指定域名的方式来使得页面内请求也附带上cookie。
若通过configCookieSync进行两次或多次设置cookie,则每次设置的cookie之间会通过"; "进行分隔。

当然还有其他不同参数的方法,可以在官方文档查阅,选择符合自己需求的api在合适的时机调用

获取cookie

当然有时候我们可能需要反向操作符:从web中获取cookie同步给原生请求,常见的是原生应用加载三方的h5业务页面,需要在h5中进行登录三方账号,然后同步给原生。

我们可以使用webview.WebCookieManager.fetchCookieSync方法来获取cookie,需要注意的是:

系统会自动清理过期的cookie,对于同名key的数据,新数据将会覆盖前一个数据。

为了获取可正常使用的cookie值,fetchCookieSync需传入完整链接。

fetchCookieSync用于获取所有的cookie值,每条cookie值之间会通过"; "进行分隔,但无法单独获取某一条特定的cookie值。


这样,我们就完成了cookie的双向同步,以及设置自定义的UA,这里建议只在UA中追加自定义的数据,不要删除原有信息

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐