如何在Swift中以编程方式获取AWS Amplify认证配置?
解答:获取Amplify配置中的Identity Pool ID及Signature V4请求建议
嘿,作为Swift和Amplify的新手,完全懂你想找最简便方案的心情!我来帮你理清楚这两个问题:
1. Amplify有没有直接获取Identity Pool ID的API?
很遗憾,目前Amplify iOS SDK并没有公开的Amplify.Auth.getIdentityPool()这类直接获取的API。因为Amplify的设计思路是帮你封装底层的凭证管理逻辑,大部分场景下你不需要直接操作Identity Pool ID。但对于你的POC场景,我们有两种可行方案。
2. 两种获取Identity Pool ID的方式对比
方案一:直接解析amplifyconfiguration.json(推荐POC使用)
这是最直接简便的方式,适合你当前的验证场景。你可以直接读取项目中的JSON文件,逐层解析出PoolId。给你写个现成的工具函数:
func getIdentityPoolId() -> String? { // 从主bundle中找到amplifyconfiguration.json文件路径 guard let configPath = Bundle.main.path(forResource: "amplifyconfiguration", ofType: "json"), // 读取文件数据 let configData = try? Data(contentsOf: URL(fileURLWithPath: configPath)), // 转成JSON对象 let configDict = try? JSONSerialization.jsonObject(with: configData, options: []) as? [String: Any], // 逐层解析到Identity Pool ID let authConfig = configDict["auth"] as? [String: Any], let plugins = authConfig["plugins"] as? [String: Any], let cognitoAuthPlugin = plugins["awsCognitoAuthPlugin"] as? [String: Any], let credentialsProvider = cognitoAuthPlugin["CredentialsProvider"] as? [String: Any], let cognitoIdentity = credentialsProvider["CognitoIdentity"] as? [String: Any], let defaultIdentity = cognitoIdentity["Default"] as? [String: Any], let poolId = defaultIdentity["PoolId"] as? String else { // 解析失败时返回nil,你可以根据需求添加错误处理 return nil } return poolId }
然后在你的MyView中直接调用这个函数赋值:
struct MyView: UIViewRepresentable { var identityPoolId: String = getIdentityPoolId() ?? "" }
方案二:通过底层AWS SDK实例获取(不推荐POC)
如果你已经初始化了Amplify,其实可以尝试获取底层的AWSCognitoCredentialsProvider实例,但这个方式需要依赖Amplify内部的实现,可能会随着SDK版本更新而变化,稳定性不如直接解析JSON,所以不推荐你的POC场景使用。
3. 关于Signature V4请求的补充
你的POC中手动生成Signature V4请求的代码是可行的,不过要注意几个小细节:
- 代码中的
regionType参数你写了单引号'us-east-1',Swift中应该用双引号"us-east-1",或者更规范的使用AWSRegionType.usEast1枚举值 - 处理
endpoint的时候要确保非空,避免崩溃
内容的提问来源于stack exchange,提问作者Andrew Allison
相关产品推荐
相关产品推荐

