
# 下载归档存储对象
如果要下载归档存储对象，需要先将归档存储对象恢复。恢复选项分为以下两类，见下表：
| **选项** | **说明**          | **枚举值**                 |
|:---|:---|:---|
| 快速恢复   | 恢复耗时1\~5分钟。     | OBSRestoreTierExpedited |
| 标准恢复   | 恢复耗时3\~5小时。默认值。 | OBSRestoreTierStandard  |
   
![](https://support.huaweicloud.com/sdk-ios-devg-obs/public_sys-resources/caution_3.0-zh-cn.png)
重复恢复归档或深度归档存储数据时，系统将延长恢复有效期。同时，将对恢复操作产生的费用进行重复收取。
您可以通过OBSRestoreObjectRequest恢复归档存储对象。以下代码展示了如何下载归档存储对象：
```
#pragma mark - Entry Point
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        static OBSClient *client;
        NSString *endPoint = @"https://your-endpoint";
        // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。
        // 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
        char* ak_env = getenv("AccessKeyID");
        char* sk_env = getenv("SecretAccessKey");
        if (ak_env == NULL || sk_env == NULL) {
            NSLog(@"Error: AccessKeyID or SecretAccessKey environment variable not set");
            return 1;
        }
        NSString *AK = [NSString stringWithUTF8String:ak_env];
        NSString *SK = [NSString stringWithUTF8String:sk_env];
        
        // 初始化身份验证
        OBSStaticCredentialProvider *credentialProvider = [[OBSStaticCredentialProvider alloc] initWithAccessKey:AK secretKey:SK];
        
        //初始化服务配置
        OBSServiceConfiguration *conf = [[OBSServiceConfiguration alloc] initWithURLString:endPoint credentialProvider:credentialProvider];
        
        // 初始化client
        client = [[OBSClient alloc] initWithConfiguration:conf];
        
        // 恢复对象
        OBSRestoreObjectRequest *request = [[OBSRestoreObjectRequest alloc]initWithBucketName:@"bucketname" objectKey:@"objectname" storeDays:[NSNumber numberWithInt:30]]; // storeDays: 恢复副本的有效期，取值范围1-30天
        request.restoreTier = OBSRestoreTierExpedited; // restoreTier: 恢复选项，不设置时服务端默认Standard
        
        [client restoreObject:request completionHandler:^(OBSRestoreObjectResponse *response, NSError *error){
            NSLog(@"%@",response);
        }];
        
        // task可用于等待恢复完成
        
        // 等待对象恢复
        sleep(6*60);
        
        // 下载对象
        NSString * outfilePath = [NSTemporaryDirectory() stringByAppendingString:@"filename"];
        OBSGetObjectToFileRequest *request1 = [[OBSGetObjectToFileRequest alloc]initWithBucketName:@"bucketname" objectKey:@"objectname" downloadFilePath:outfilePath];
        request1.downloadProgressBlock = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
            NSLog(@"%0.1f%%",(float)floor((totalBytesExpectedToWrite > 0) ? (totalBytesWritten*10000/totalBytesExpectedToWrite) : 0)/100);
        };
        
        [client getObject:request1 completionHandler:^(OBSGetObjectResponse *response, NSError *error){
            if(response.etag){NSLog(@"%@",response.etag);}
        }];
    }
    return 0;
}
```
