Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 错误代码:AccessDenied,消息:AWS身份验证需要有效的日期或x-amz-Date标头_Ios_Xcode_Amazon Web Services_Amazon S3_Ios7 - Fatal编程技术网

Ios 错误代码:AccessDenied,消息:AWS身份验证需要有效的日期或x-amz-Date标头

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

我的应用程序在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秒,然后应用程序运行


因此,请任何人告诉我如何解决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!