6

我的应用程序在 ios 6 中运行良好..它从亚马逊网络服务器 s3 上传和下载数据..但是当我将 ios 6 升级到 ios 7 时...我收到警报消息“无法连接到服务器”日志中出现此错误窗户

“Exception = AmazonServiceException { RequestId:5DC8AEF01DD9FB91, ErrorCode:AccessDenied, Message:AWS authentication requires a valid Date or x-amz-date header}”。

为了解决这个问题,我将我的 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 中的替代冻结问题。

4

4 回答 4

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_USand 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 中明确设置区域设置,以便它可以在具有任何区域设置的设备上运行。

希望这是有道理的,

于 2013-09-24T19:48:24.487 回答
0

我已经向 Apple 提交了一份错误报告(以确定这是否是一个错误)。

与此同时,我在 configureURLRequest 方法中创建了一个可怕的 hack 来解决 S3Request.m 中的问题:

NSString *checkFormat =[self.date requestFormat];
if(![checkFormat hasSuffix:@":00"])
    checkFormat = [NSString stringWithFormat:@"%@:00",checkFormat];
[self.urlRequest setValue:checkFormat forHTTPHeaderField:kHttpHdrDate];

这可能与您的 AWS 开发工具包版本不同。

从长远来看,我不会使用此修复程序 - 一旦 Apple 错误报告团队返回推荐的解决方案,我将在此处发布任何回复

我还在这里发布了一个问题: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];
于 2013-09-24T14:52:02.960 回答
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];
   ...
     ...

}

于 2013-09-28T06:05:40.287 回答
0

我遇到了同样的问题,在更新到 AWS SDK 1.6 版后,问题就消失了。

于 2014-01-02T17:16:02.533 回答