HarmonyOS鸿蒙Next中ONLY ONE String Field can be annotated as Url问题处理办法

HarmonyOS鸿蒙Next中ONLY ONE String Field can be annotated as Url问题处理办法 问题背景

最近在使用华为的AppGallery Connect(简称AGC)服务开发移动应用,发现在接入远程配置和认证服务的时候都遇到了code: 2 message: ONLY ONE String Field can be annotated as Url的错误。

远程配置的场景是在调用fetch接口的时候,而认证服务是在调用signin接口的时候都会遇到此错误。

问题原因与分析

通过观察错误信息,我们发现一定是请求的时候url参数生成了多条,导致请求参数不合法。但是我们观察两个请求,fetch接口没有任何参数,而signin接口只需要传入之前生成的credential凭证,并没有url参数。根据之前接入AGC服务的经验,在接入服务之前需要在AGC的官网下载agconnect-services.json文件,文件中包含了应用和项目的基本信息,包括project id,appid,clientid等信息,其中就有url参数。

我的agconnect-services.json文件如下:

<img src="https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/150/224/722/0900086000150224722.20210520162833.25824910367180527769439301136607:50001231000000:2800:89CB85D7A39E92A6754AD160325A21E3799110964AD92F0050EB30702259BD8B.png" style="width: 551.0px;height: 399.0px;">

这个参数的作用就是指定了sdk的请求路径url。所以报错中的url应该指的就是这里的url。

但是文件是从官方下载的,为何会报错呢?我们要看下这个参数是如何使用的。AGC提供了一个叫AGCP的插件,在应用中集成这个插件就可以去读取文件中的各种参数,配合SDK中的方法,自动用于SDK的运行中。后来求助了华为的技术专家后,从他们那里得知AGCP的工作原理就是将json文件中的键值对加密写在了应用的资源文件中,然后通过annotation去读取相应的内容。所以如果应用被混淆了,那就有可能读取错误获取读取不到相应的参数。这里就提醒我了,我使用了dexguard进行了应用的混淆。所以解决办法就是在混淆脚本中添加AGC相关的例外,语句如下:

-keep class com.huawei.agconnect.** {*;}
-keepresourcexmlelements **
-keepresources */*

添加了这个例外后所有的请求就都成功了。

总结

接入AGC服务遇到报错:ONLY ONE String Field can be annotated as Url,而无相关url参数传递的,可以优先排查是否有.json文件中的参数混淆问题。

参考文档:

  1. AGC认证服务开发指南: https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-auth-introduction-0000001053732605

  2. AGC远程配置服务开发指南: https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-remoteconfig-introduction-0000001055149778


更多关于HarmonyOS鸿蒙Next中ONLY ONE String Field can be annotated as Url问题处理办法的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,当遇到“ONLY ONE String Field can be annotated as Url”问题时,通常是因为在某个类中,有多个字段被注解为@Url,而系统规定每个类中只能有一个字段被标记为@Url。要解决这个问题,需要检查并确保类中只有一个字段使用了@Url注解。

具体步骤如下:

  1. 定位问题:找到报错的类,检查其中使用了@Url注解的字段。
  2. 删除多余注解:保留一个必要的@Url注解,删除其他多余的@Url注解。
  3. 重新编译:修改后重新编译项目,确保问题已解决。

例如,假设有以下代码:

public class MyClass {
    @Url
    private String url1;

    @Url
    private String url2;
}

需要修改为:

public class MyClass {
    @Url
    private String url1;

    private String url2;
}

这样,类中只有一个字段被注解为@Url,问题即可解决。

更多关于HarmonyOS鸿蒙Next中ONLY ONE String Field can be annotated as Url问题处理办法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,当遇到“ONLY ONE String Field can be annotated as Url”问题时,通常是因为在数据类中使用了多个@Url注解。@Url注解用于标识一个字段为URL类型,但每个类中只能有一个字段被标记为@Url。解决方法是检查数据类,确保只有一个字段使用了@Url注解。如果确实需要多个URL字段,可以考虑使用其他方式处理,如自定义注解或手动验证URL格式。

回到顶部