我的应用程序在ios 6中正常工作..它从亚马逊网络服务器上传和下载数据s3 ..但是当我将ios 6升级到ios 7时...我收到了警告消息“无法连接到服务器”这个日志窗口中的错误
“Exception = AmazonServiceException {RequestId:5DC8AEF01DD9FB91,ErrorCode:AccessDenied,消息:AWS身份验证需要有效日期或x-amz-date标头}”。
解决这个问题我将我的aws ios sdk 1.0.0升级到aws ios sdk 1.6.1。并尝试运行我的应用程序冻结10-12秒然后应用程序运行。
所以请任何人告诉我解决方案我如何删除aws ios sdk 1.0.0中的“x-amz-date header”问题及其在aws ios sdk 1.6.1中的替代冻结问题..
答案 0 :(得分:3)
在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
如前所述,iOS {7}中NSDateFormatter
的行为发生了变化;但是,此问题的根本原因是您没有明确将语言环境设置为en_US
。当语言环境设置为en_US
以外的其他内容时,可能会导致问题。这就是为什么我们在最新版本的SDK中明确设置区域设置,以便它在具有任何区域设置的设备上运行。
希望这是有道理的,
答案 1 :(得分:0)
我已经向Apple提交了一份错误报告(以确定这是否是一个错误)。
与此同时,我创建了一个可怕的黑客,解决了S3Request.m中的问题 方法configureURLRequest:
NSString *checkFormat =[self.date requestFormat];
if(![checkFormat hasSuffix:@":00"])
checkFormat = [NSString stringWithFormat:@"%@:00",checkFormat];
[self.urlRequest setValue:checkFormat forHTTPHeaderField:kHttpHdrDate];
这可能与您的AWS SDK版本不同。
我不会长期使用此修复程序 - 一旦他们回来推荐一个解决方案,我会在这里发布Apple bug报告团队的任何回复
我还在这里发了一个问题:https://forums.aws.amazon.com/thread.jspa?threadID=135829#
编辑:在最新版本的工具包中,黑客是:
NSString *checkFormat =[self.date stringWithRFC822Format];
if(![checkFormat hasSuffix:@":00"])
checkFormat = [NSString stringWithFormat:@"%@:00",checkFormat];
[self.urlRequest setValue:checkFormat forHTTPHeaderField:kHttpHdrDate];
答案 2 :(得分:0)
最后我得到了解决方案,这对我有用,我使用了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];
...
...
}
答案 3 :(得分:0)
我遇到了同样的问题,在更新到AWS SDK 1.6版后问题已经消失。