2013-09-21 24 views
6

ứng dụng của tôi đang hoạt động tốt trong ios 6 .. nó tải lên và tải xuống dữ liệu từ máy chủ web amazon s3 .. nhưng khi tôi nâng cấp ios 6 đến ios 7 ... tôi nhận được thông báo cảnh báo "không thể kết nối với máy chủ" lỗi này trong cửa sổ nhật kýErrorCode: AccessDenied, Message: AWS xác thực yêu cầu một ngày hợp lệ hoặc x-amz-ngày tiêu đề

"Ngoại lệ = AmazonServiceException {RequestId: 5DC8AEF01DD9FB91, ErrorCode: AccessDenied, Message: AWS xác thực yêu cầu Ngày hợp lệ hoặc x -amz-date header} ".

để giải quyết vấn đề này tôi nâng cấp aws ios sdk 1.0.0 lên aws ios sdk 1.6.1.và thử chạy ứng dụng của tôi nó bị đóng băng trong 10-12 giây sau đó ứng dụng đang chạy.

vì vậy xin bất cứ ai có thể cho tôi biết giải pháp làm thế nào tôi loại bỏ "x-AMZ cập nhật tiêu đề" Vấn đề ở AWS ios sdk 1.0.0 và vấn đề đóng băng thay thế của nó trong AWS ios sdk 1.6.1 ..

+0

Tôi có cùng một vấn đề với aws ios sdk 1.4 –

+1

Tôi có cùng một vấn đề; nhìn vào dữ liệu đang được gửi đến Amazon Tôi nhận thấy rằng định dạng của tiêu đề Ngày hơi khác giữa iOS6 và iOS7, và rất có thể đây là những gì sẽ ném trình phân tích cú pháp ngày vào cuối Amazon. iOS6: Ngày: Thứ Ba, 24 tháng 9 năm 2013 07:58:18 GMT + 10: 00 iOS7: Ngày: Thứ Ba, ngày 24 tháng 9 năm 2013 07:58:18 GMT + 10 Vì vậy, phần giờ của TZ bù đắp dường như bị thiếu trong iOS7. – patschiboy

+0

để bạn giải quyết điều đó như thế nào ?, IS có phương pháp nào để giải quyết phần giờ này trong ios7 không? – pradeep

Trả lời

0

tôi đã gửi một báo cáo lỗi cho Apple (để tìm hiểu xem đây có phải là lỗi hay không).

Trong khi chờ đợi tôi tạo ra một hack khủng khiếp mà giải quyết vấn đề trong S3Request.m trong phương pháp configureURLRequest:

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

này có thể không giống nhau ở các phiên bản của AWS SDK.

tôi sẽ không sử dụng sửa lỗi này trong thời gian dài - Tôi sẽ đăng bất kỳ phản hồi từ nhóm báo cáo lỗi của Apple ở đây khi họ quay trở lại với một giải pháp khuyến khích

Tôi cũng đăng một câu hỏi ở đây: https://forums.aws.amazon.com/thread.jspa?threadID=135829#

EDIT: trong phiên bản mới nhất của bộ công cụ hack là:

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

trong AmazonSDKUtil.m, chúng tôi có các phương pháp sau:

+(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; 
} 

Trong các phiên bản cũ hơn của SDK, ngôn ngữ và múi giờ không được đặt chính xác thành en_USGMT. Điều này có thể gây ra sự cố tùy thuộc vào cài đặt múi giờ của thiết bị và múi giờ của bạn. Phiên bản SDK mới nhất khắc phục sự cố. Nếu vì một lý do nào đó, bạn không thể cập nhật SDK, bạn có thể sửa đổi AmazonSDKUtil.m và đặt rõ ràng các giá trị ngôn ngữ và múi giờ.

EDIT:

Nếu bạn chạy các đoạn mã sau đây trên iOS 6 và iOS 7, bạn có thể thấy cách locale đặt này ảnh hưởng định dạng ngày tháng.

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); 

Trên iOS 6

Date 1: Wed, 25 Sep 2013 16:25:29 PDT 
Date 2: Wed, 25 Sep 2013 23:25:29 GMT 

Trên iOS 7

Date 1: Wed, 25 Sep 2013 16:24:11 GMT-7 
Date 2: Wed, 25 Sep 2013 23:24:11 GMT 

Như bạn đã nói trước đây, hành vi của NSDateFormatter thay đổi trong iOS 7; tuy nhiên, nguyên nhân gốc rễ của vấn đề này là bạn không rõ ràng đặt ngôn ngữ thành en_US. Khi ngôn ngữ được đặt thành một thứ khác ngoài en_US, nó có thể gây ra sự cố.Đây là lý do tại sao chúng tôi đặt rõ ràng ngôn ngữ trong phiên bản SDK mới nhất của chúng tôi để nó chạy trên các thiết bị có bất kỳ cài đặt ngôn ngữ nào.

Hy vọng điều này có ý nghĩa,

+0

Tôi không tin đây là giải pháp - tôi đã thử hai dự án và cả hai đều thất bại với mã mới này. Tôi vẫn đồng ý với @patschiboy rằng các lỗi nằm ở định dạng ngày tháng được cung cấp bởi ios7 – petenelson

+0

Việc đặt đúng ngôn ngữ và múi giờ sẽ giải quyết vấn đề định dạng ngày/giờ như được chỉ ra trong câu trả lời đã chỉnh sửa của tôi. Hy vọng nó có ý nghĩa. –

+0

Cảm ơn các chi tiết bổ sung - Tôi sẽ cố gắng và báo cáo lại nếu có vấn đề nhưng điều này có ý nghĩa – petenelson

0

Cuối cùng I Got Giải pháp và này làm việc cho tôi, tôi sử dụng awsios SDK 1.3.1 thay vì awsios sdk 1.6.1. và thực hiện một số thay đổi trong S3Request.m trong phương pháp

-(AmazonURLRequest *)configureURLRequest{ 
    .... 
    .... 

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

}

0

tôi đã có cùng một vấn đề và sau khi cập nhật lên phiên bản 1.6 của AWS SDK vấn đề đã biến mất.

Các vấn đề liên quan