如何使用AWSMobileClient设置不同的配置(awsconfiguration.json)来调试和发布构建类型

时间:2019-06-26 11:34:57

标签: android aws-sdk

我想为debugrelease构建使用不同的配置。所有配置都存储在awsconfiguration.json内,例如,我有两个不同的配置文件,如何设置应该使用的文件。

使用AWSMobileClient.getInstance()时,它将从文件awsconfiguration.json中获取默认配置

配置文件示例:

{
  "Version": "1.0",
  "CredentialsProvider": {
    "CognitoIdentity": {
      "Default": {
        "PoolId": "DIFFERENT_VALUES",
        "Region": "DIFFERENT_VALUES"
      }
    }
  },
  "IdentityManager": {
    "Default": {}
  },
  "CognitoUserPool": {
    "Default": {
      "AppClientSecret": "DIFFERENT_VALUES",
      "AppClientId": "DIFFERENT_VALUES",
      "PoolId": "DIFFERENT_VALUES",
      "Region": "DIFFERENT_VALUES"
    }
  }
}

更新 通过将不同的文件放在awsconfiguration.jsonmain\res\raw中,可以选择使用不同的release\res\raw,例如,遵循此answer即可使用。 但是我想知道是否可以通过编程方式进行选择。

4 个答案:

答案 0 :(得分:5)

也可以通过在AWSConfiguration中设置配置值,然后初始化AWSMobileClient来实现。

    AWSConfiguration awsConfiguration = new AWSConfiguration(context);
    awsConfiguration.setConfiguration("Stage"); // BuildConfig can be used here.

    AWSMobileClient.getInstance().initialize(context, awsConfiguration,  new Callback<UserStateDetails>() {

        @Override
        public void onResult(UserStateDetails userStateDetails) {
        }

        @Override
        public void onError(Exception e) {
        }
    });

并且awsconfiguration.json文件可以如下更新

{
 "Version": "1.0",
 "CredentialsProvider": {
    "CognitoIdentity": {
        "Default": {
            "PoolId": "DIFFERENT_VALUES",
            "Region": "DIFFERENT_VALUES"
        },
        "Stage": {
            "PoolId": "STAGE_VALUES",
            "Region": "STAGE_VALUES"
        }
    }
 },
 "IdentityManager": {
    "Default": {},
    "Stage": {}
 },
 "CognitoUserPool": {
    "Default": {
        "AppClientSecret": "DIFFERENT_VALUES",
        "AppClientId": "DIFFERENT_VALUES",
        "PoolId": "DIFFERENT_VALUES",
        "Region": "DIFFERENT_VALUES"
    },
    "Stage": {
        "AppClientSecret": "STAGE_VALUES",
        "AppClientId": "STAGE_VALUES",
        "PoolId": "STAGE_VALUES",
        "Region": "STAGE_VALUES"
    }
 }
}

答案 1 :(得分:2)

我一直在努力实现类似的目标;根据选定的配置文件在运行时选择AWS配置。我通过破解AWS开发工具包使其部分工作,但是偶然发现release notes为AWS开发工具包版本2.11.0。报价:

  

添加了通过新API将配置作为内存对象(即[String: Any]/NSDictionary)而不是默认awsconfiguration.json传递的选项

我还在放大入门指南here中发现它已记录(!)。

因此,自2019年9月9日起,可以在运行时选择AWS配置。


编辑:刚刚注意到,这个问题是针对Android而非iOS的。我不是Android开发人员,但是快速搜索发现AWS Android SDK版本2.13.6(2019年6月7日)中有类似内容。引用release notes

  

添加AWSConfiguration(JSONObject)构造函数,以通过JSONObject传递的配置构造AWSConfiguration对象

...看起来很有希望。

答案 2 :(得分:1)

这可以通过source sets完成;例如。 APT2未处理maindebug目录或debugrelease的目录res/rawassets。添加仅建议内部使用的凭据,因为可以轻松地从软件包中提取它们。

答案 3 :(得分:-1)

Abhishek的答案是我最喜欢的答案。但是,如果您使用的是Amplify(就像我一样),虽然可以将多个配置放入一个文件中,但我找不到在它们之间进行选择的方法。

因此,尽管这并不是对问题的确切答案,但是在Amplify中,您可以在多个独立的配置文件之间进行选择,如下所示:

设置放大时:

Amplify.addPlugin(AWSCognitoAuthPlugin())
// and whatever other plugins you'll need...
Amplify.configure(AmplifyConfiguration.fromConfigFile(applicationContext, getConfigResourceId(applicationContext)), applicationContext)

还要添加:

private fun getConfigResourceId(context: Context): Int = context.resources.getIdentifier("YourConfigFileName", "raw", context.packageName)