1

所以我的 iPhone 应用程序成功地将照片上传到 Amazon S3。我使用了与 S3Uploader 示例项目相同的代码以及最新(1.6.0 版)适用于 iOS 的 Amazon AWS 开发工具包。问题是间歇性地我会收到 SignatureDoesNotMatch 错误(我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。)。它没有模式。目前,我的应用程序正在通过对委托调用 didFailWithError: 进行一定数量的重试来解决此错误。

到目前为止,我的测试已经进行了足够多的重试,因此用户不会注意到错误,但是当我的签名明显正确时知道我收到了签名密钥错误,这是非常令人沮丧的,因为它有时会起作用。我不确定这是否是 url 编码错误(我的签名密钥中有一个 + 号),但由于我使用的是 iOS SDK,我看不到 PUT url 是如何处理的。

另外,我验证了我的存储桶名称都是小写的,我的文件名只是数字和几个字母。我也尝试了不同的区域,它们都有相同的结果。简而言之,它可能需要 0 次重试到 5 次重试才能获得成功的 PUT 而不会出现 SignatureDoesNotMatch 错误。有没有人有类似的问题?任何帮助将不胜感激。谢谢阅读。

4

2 回答 2

3

您可能需要在生成签名后对其进行按摩,因为有效的 base64 在查询字符串中并不总是有效的。我一定曾经遇到过同样的问题,因为我在我编写的一些代码中发现了以下注释:

# the "+" is not url-safe, as it gets converted to a space somewhere along the line

# '+' => '%2B'

# while we're at it, we'll go ahead and convert the other non-safe-ish 
# characters even though the links seem to work without this step

# '/' => '%2F'
# '=' => '%3D'

我的代码对这 3 个字符进行字符串搜索和替换,在将查询字符串返回给调用者之前将它们更改为它们的 url 编码等效项。我使用了搜索/替换策略,因为我工作的环境没有合适的 url 编码库可用。由于这些是我的代码可以生成的唯一 3 个 base64 字符,这些字符显然不是 url 安全的,因此我显然继续处理了所有三种可能性。

于 2013-07-24T04:05:00.863 回答
2

好的。因此,在过去几天尝试新的存储桶之后...尝试所有不同的 NSString 编码/UIImage 到 NSData 语句...从嵌入式切换到 TVM...从我的项目来回跳到 TVM 演示...并阅读调试输出的页面和页面......我发现它与任何这些都无关!:P

一旦我意识到我无意中将 AWS 框架复制到了我的项目文件夹中,我删除了它们并重新添加了它们,但没有选中复制框(引用我的 SDK 文件夹)。繁荣 - 没有更多的签名错误。

AWS SDK 显然不喜欢在一个系统上拥有其框架的多个实例。希望这对其他人有帮助!:)

于 2013-07-26T18:36:36.367 回答