Ios 错误代码:AccessDenied,消息:AWS身份验证需要有效的日期或x-amz-Date标头
我的应用程序在ios 6中运行良好。。它可以从amazon web服务器s3上传和下载数据。但当我将ios 6升级到ios 7时,我在日志窗口中收到警告消息“无法连接到服务器”此错误 “Exception=AmazonServiceException{RequestId:5DC8AEF01DD9FB91,错误代码:AccessDenied,消息:AWS身份验证需要有效日期或x-amz-Date头}” 为了解决这个问题,我将我的aws ios sdk 1.0.0升级到aws ios sdk 1.6.1。然后尝试运行我的应用程序,它会冻结10-12秒,然后应用程序运行Ios 错误代码:AccessDenied,消息:AWS身份验证需要有效的日期或x-amz-Date标头,ios,xcode,amazon-web-services,amazon-s3,ios7,Ios,Xcode,Amazon Web Services,Amazon S3,Ios7,我的应用程序在ios 6中运行良好。。它可以从amazon web服务器s3上传和下载数据。但当我将ios 6升级到ios 7时,我在日志窗口中收到警告消息“无法连接到服务器”此错误 “Exception=AmazonServiceException{RequestId:5DC8AEF01DD9FB91,错误代码:AccessDenied,消息:AWS身份验证需要有效日期或x-amz-Date头}” 为了解决这个问题,我将我的aws ios sdk 1.0.0升级到aws ios sdk 1.6
因此,请任何人告诉我如何解决aws ios sdk 1.0.0中的“x-amz-date header”问题以及aws ios sdk 1.6.1中的替代冻结问题。我已向苹果提交了一份错误报告(以确定这是否是错误) 与此同时,我创建了一个可怕的黑客程序,解决了S3Request.m In中的问题 方法configureURLRequest:
NSString *checkFormat =[self.date requestFormat];
if(![checkFormat hasSuffix:@":00"])
checkFormat = [NSString stringWithFormat:@"%@:00",checkFormat];
[self.urlRequest setValue:checkFormat forHTTPHeaderField:kHttpHdrDate];
这在您的AWS SDK版本中可能不同
从长远来看,我不会使用此修复程序-一旦苹果bug报告团队提出建议解决方案,我会在这里发布他们的任何回复
我也在这里发布了一个问题:
编辑:在最新版本的工具包中,黑客是:
NSString *checkFormat =[self.date stringWithRFC822Format];
if(![checkFormat hasSuffix:@":00"])
checkFormat = [NSString stringWithFormat:@"%@:00",checkFormat];
[self.urlRequest setValue:checkFormat forHTTPHeaderField:kHttpHdrDate];
在
AmazonSDKUtil.m
中,我们有以下方法:
+(NSDate *)convertStringToDate:(NSString *)string usingFormat:(NSString *)dateFormat
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:dateFormat];
[dateFormatter setLocale:[AmazonSDKUtil timestampLocale]];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
NSDate *parsed = [dateFormatter dateFromString:string];
NSDate *localDate = [parsed dateByAddingTimeInterval:_clockskew];
[dateFormatter release];
return localDate;
}
+(NSString *)convertDateToString:(NSDate *)date usingFormat:(NSString *)dateFormat
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
[dateFormatter setDateFormat:dateFormat];
[dateFormatter setLocale:[AmazonSDKUtil timestampLocale]];
NSDate *realDate = [date dateByAddingTimeInterval:-1*_clockskew];
NSString *formatted = [dateFormatter stringFromDate:realDate];
[dateFormatter release];
return formatted;
}
在旧版本的SDK中,区域设置和时区未正确设置为en_US
和GMT
。这可能会导致问题,具体取决于您的设备区域设置和时区设置。SDK的最新版本修复了该问题。如果由于某种原因无法更新SDK,则可以修改AmazonSDKUtil.m
并显式设置区域设置和时区值
编辑:
如果在iOS 6和iOS 7上运行以下代码段,您可以看到区域设置如何影响日期格式
NSDateFormatter *dateFormatter = [NSDateFormatter new];
dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss z";
dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"PDT"];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
NSString *dateWithoutTimezoneAndLocale = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"Date 1: %@", dateWithoutTimezoneAndLocale);
dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSString *dateWithTimezoneAndLocale = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"Date 2: %@", dateWithTimezoneAndLocale);
在iOS 6上
Date 1: Wed, 25 Sep 2013 16:25:29 PDT
Date 2: Wed, 25 Sep 2013 23:25:29 GMT
在iOS 7上
Date 1: Wed, 25 Sep 2013 16:24:11 GMT-7
Date 2: Wed, 25 Sep 2013 23:24:11 GMT
如前所述,NSDateFormatter
的行为在iOS 7中发生了变化;但是,此问题的根本原因是您没有将区域设置明确设置为en_US
。当区域设置设置为非en_US时,可能会导致问题。这就是为什么我们在最新版本的SDK中显式设置了区域设置,以便它在具有任何区域设置的设备上运行
希望这是有意义的,最终我得到了解决方案,这对我来说很有效,我使用了awsios sdk 1.3.1而不是awsios sdk 1.6.1。并对方法中的S3Request.m进行一些更改
-(AmazonURLRequest *)configureURLRequest{
....
....
NSString *checkFormat =[self.date stringWithRFC822Format];
if(![checkFormat hasSuffix:@":00"])
checkFormat = [NSString stringWithFormat:@"%@+00:00",checkFormat];
[self.urlRequest setValue:checkFormat forHTTPHeaderField:kHttpHdrDate];
...
...
}我遇到了同样的问题,在更新到AWS SDK的1.6版后,问题消失了。我遇到了与AWS ios SDK 1.4I相同的问题;查看发送到Amazon的数据时,我注意到iOS6和iOS7之间的日期头格式略有不同,这很可能是导致Amazon端的日期解析器失效的原因。iOS6:Date:Tue,2013年9月24日07:58:18 GMT+10:00 iOS7:Date:Tue,2013年9月24日07:58:18 GMT+10所以TZ偏移的小时部分在iOS7中似乎丢失了。那么您如何解决这个问题呢?在iOS7中有解决这个小时部分的方法吗?我不相信这是一个解决方案-我尝试了两个项目,但都失败了。我仍然同意@patschiboy的观点,即错误在于ios7提供的日期格式。正确设置区域设置和时区应该可以解决我编辑的答案中指出的日期/时间格式问题。希望这是有意义的。感谢您提供的额外详细信息——如果有任何问题,我会尝试报告,但这是有意义的——因为Apple向我提供了更多关于ios7的信息:每个地区支持两种长度的本地化GMT格式,长(如“GMT-08:00”)和短(如“GMT-8”)。现在显式指定“z”以回退到短本地化GMT格式。尽管如此,不同地区的情况可能会有所不同。如果你想有一个不变的形式,那么你应该使用一个ISO8601样式,模式字符使用X或X;请参阅“最终抽空测试”的区域部分,您的GMT和en_US方法(如日期2示例所示)看起来不错-谢谢Yosuke!