安卓:Firebase remoteConfig getString() 方法正在从 default.xml 中移除字符串中的引号

15

我有以下的远程 config_default.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<defaultsMap>
       <entry>
            <key>LOCAL_JSON</key>
            <value>[{"title":"TitleA","path":"pathA","image_url":" Some URL A"},{"title":"TitleB","path":"pathB","image_url":" Some URL B"}]</value>
        </entry>
</defaultsMap>

现在当我使用Firebase远程配置getString()方法尝试访问它时,我总是得到没有引号的字符串。

"[{title:TitleA,path:pathA,image_url: Some URL A},{title:TitleB,path:pathB,image_url: Some URL B}]

如下图所示:

enter image description here

我在 Firebase 远程配置控制台 上放置了相同的字符串,一旦应用程序从那里获取它,它会像我预期的那样在字符串中放置双引号。

我仔细检查了这个问题,并且当我使用以下项目 gradle 文件时,它似乎工作正常

    apply plugin: 'com.github.ben-manes.versions'
    buildscript {
        repositories {
            maven { url "http://dl.bintray.com/populov/maven" }
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.3.3'
            classpath 'me.tatarka:gradle-retrolambda:3.6.1'
            classpath 'com.github.ben-manes:gradle-versions-plugin:0.13.0'
            classpath 'com.stanfy.spoon:spoon-gradle-plugin:1.2.1'
            classpath 'com.google.gms:google-services:3.1.0'
            classpath 'com.google.firebase:firebase-plugins:1.0.5'
        }
    }

    allprojects {
        repositories {
            maven { url "http://dl.bintray.com/populov/maven" }
            maven { url "http://oss.sonatype.org/content/repositories/snapshots" }
            maven { url "https://jitpack.io" }
            jcenter()
            flatDir {
                dirs 'libs'
            }
        }
    }

但是,当我将Gradle更新为所有库的新版本时,引号似乎被忽略了。

我的新项目 Gradle 文件

apply plugin: 'com.github.ben-manes.versions'
buildscript {
    repositories {
        maven { url "http://dl.bintray.com/populov/maven" }
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.13.0'
        classpath 'com.stanfy.spoon:spoon-gradle-plugin:1.2.1'
        classpath 'com.google.gms:google-services:3.1.2'
        classpath ('com.google.firebase:firebase-plugins:1.0.5')
    }
}

allprojects {
    repositories {
        maven { url "http://dl.bintray.com/populov/maven" }
        maven { url "http://oss.sonatype.org/content/repositories/snapshots" }
        maven { url "https://jitpack.io" }
        jcenter()
        google()
        flatDir {
            dirs 'libs'
        }
    }
}

我不知道是哪个库导致了这个问题,但如果有人能指出来就太好了。


1
@DougStevenson 尝试过了,但输出仍然没有改变 :( - Sheraz Ahmad Khilji
https://groups.google.com/forum/#!topic/firebase-talk/LIzdfsWm9bU - Doug Stevenson
我鼓励您提交错误报告以加重问题的分量。https://firebase.google.com/support/contact/bugs-features/ - Doug Stevenson
默认远程配置中的引号是已知问题,我们正在努力修复。来自服务器的参数中的引号按预期工作,问题仅限于默认XML中的引号。 - Arthur Thompson
我采用的一种权宜之计,虽然不是理想的方法,但是可以使用引号以外的其他字符,例如管道符(|),然后对从远程配置返回的值执行String.replace('|', '"')操作。当然,您必须确保备选字符在JSON中不会自然出现。此外,您的默认值和控制台中的默认值都必须使用这个备选字符。 - Steve Yohanan
显示剩余3条评论
4个回答

2

首先,Sheraz Ahmad Khilji,我为我的英语道歉,我不太会写英语。

这个问题是因为Firebase在将您的XML转换为映射时存在错误,为了解决此问题,您可以使用映射代替XML。

示例:

firebaseConfig.setDefaults(Map<String, Object>);

这个更改将解决您的双引号问题。


1
我将以下问题发送给Firebase帮助团队并收到了以下回复:
这实际上是我们端上已知的问题,我们的工程师正在努力解决。我无法分享任何细节或时间表,但请查看我们的发布说明以获取未来更新。
看起来Gradle工具版本3.0.1存在问题。暂时的解决方法是使用Gradle工具版本2.3.3。
在项目级别的build.gradle文件中:
用`classpath 'com.android.tools.build:gradle:2.3.3'`替换`classpath 'com.android.tools.build:gradle:3.0.1'`,
并且将`google()`替换为
maven {
        url 'https://maven.google.com'
}

+1 对于官方回复表示赞同,但我认为因此降级gradle不值得。幸运的是,我能够重新构造字符串值并删除所有引号。 - gswierczynski
@gswierczynski 我同意你的看法。或者你可以使用一些编码,例如Base64。此外,这个问题只存在于配置文件的本地副本中,从远程端接收到的数据不受影响。 - Nabin Bhandari

0

如果在默认的xml文件中使用三个反斜杠作为转义序列,它会起作用:

{\\\"someKey\\\": \\\"someValue\\\"}

将产生{"someKey": "someValue"}作为FirebaseRemoteConfig的getString()方法的输出。


0

这个问题有多种解决方案

1. 使用firebaseConfig.setDefaults(Map)来设置默认配置。

2. 在.xml文件中,在双引号(")前使用反斜杠(\)。

3. 用下面的代码替换classpath 'com.android.tools.build:gradle:3.0.1'

*classpath 'com.android.tools.build:gradle:2.3.3'* 

and Relpace google() with
maven { url 'https://maven.google.com' }

4. 在 gradle.properties 中添加 android.enableAapt2 = false


对于任何查看上述答案的人,第二个建议转义引号是错误的,不起作用。 - nickle_nine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接