Как добавить поддержку GZIP в мой проект Xcode - PullRequest
0 голосов
/ 27 февраля 2019

Я пытался узнать, как добавить поддержку GZIP в мои вызовы, в моем проекте obj-C, но мне не удается найти руководство для этого,

это мой инициализатор для моих вызовов:

- (instancetype)initPrivate {
    self = [super init];

    if (self) {
        [[AWAFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){
        }];
        [[AWAFNetworkReachabilityManager sharedManager] startMonitoring];

        _networkReachabilityManager = [AWAFNetworkReachabilityManager sharedManager];

        _jsonSerializer = [AWAFJSONRequestSerializer serializer];

        [_jsonSerializer setValue:[VersionUtils currentVersion] forHTTPHeaderField:@"X-Client-Version"];
        [_jsonSerializer setValue:[VersionUtils supportedOnlineCareVersions] forHTTPHeaderField:@"X-Supported-OnlineCare-Versions"];
        [_jsonSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

        _urlSerializer = [AWAFHTTPRequestSerializer serializer];

        [_urlSerializer setValue:[VersionUtils currentVersion] forHTTPHeaderField:@"X-Client-Version"];
        [_urlSerializer setValue:[VersionUtils supportedOnlineCareVersions] forHTTPHeaderField:@"X-Supported-OnlineCare-Versions"];

        if ([AWSDKService debugEnabled]) {
            [_urlSerializer setValue:@"true" forHTTPHeaderField:@"X-Internal-Build"];
            [_jsonSerializer setValue:@"true" forHTTPHeaderField:@"X-Internal-Build"];
        } else {
            [_urlSerializer setValue:@"false" forHTTPHeaderField:@"X-Internal-Build"];
            [_jsonSerializer setValue:@"false" forHTTPHeaderField:@"X-Internal-Build"];
        }
    }

    return self;
}

и вот мой полный сетевой сервис:

@interface NetworkingService ()

@property (nonatomic, readonly) AWAFNetworkReachabilityManager *networkReachabilityManager;

@property (nonatomic, readonly) AWAFJSONRequestSerializer *jsonSerializer;
@property (nonatomic, readonly) AWAFHTTPRequestSerializer *urlSerializer;
@property (nonatomic, readonly) AWJSONResponseSerializer *defaultResponseSerializer;
@property (nonatomic) NSMutableSet<NSData *> *pinnedCertificates;

@end

@implementation NetworkingService

#pragma mark - Lifecycle

+ (instancetype)sharedInstance {
    static dispatch_once_t once;
    static NetworkingService *instance;

    dispatch_once(&once, ^{
        instance = [[NetworkingService alloc] initPrivate];
        instance.pinnedCertificates = [NetworkingService defaultPinnedCertificates].mutableCopy;
    });

    return instance;
}

/**
 Searches the ENTIRE mainBundle for any cer files and returns them

 @return The found certificates. If none were found, returns empty array.
 */
+ (NSSet<NSData *> *)defaultPinnedCertificates {
    NSMutableArray<NSData *> *foundCertificates = [NSMutableArray new];
    for (NSString *path in [NSBundle.mainBundle pathsForResourcesOfType:@"cer" inDirectory:nil]) {
        [foundCertificates addObject:[NSData dataWithContentsOfFile:path]];
    }
    return [NSSet setWithArray:foundCertificates.copy];
}

+ (void)addCertificate:(NSData *)certificate {
    [NetworkingService.sharedInstance.pinnedCertificates addObject:certificate];
}

- (instancetype)initPrivate {
    self = [super init];

    if (self) {
        [[AWAFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){
        }];
        [[AWAFNetworkReachabilityManager sharedManager] startMonitoring];

        _networkReachabilityManager = [AWAFNetworkReachabilityManager sharedManager];

        _jsonSerializer = [AWAFJSONRequestSerializer serializer];

        [_jsonSerializer setValue:[VersionUtils currentVersion] forHTTPHeaderField:@"X-Client-Version"];
        [_jsonSerializer setValue:[VersionUtils supportedOnlineCareVersions] forHTTPHeaderField:@"X-Supported-OnlineCare-Versions"];
        [_jsonSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

        _urlSerializer = [AWAFHTTPRequestSerializer serializer];

        [_urlSerializer setValue:[VersionUtils currentVersion] forHTTPHeaderField:@"X-Client-Version"];
        [_urlSerializer setValue:[VersionUtils supportedOnlineCareVersions] forHTTPHeaderField:@"X-Supported-OnlineCare-Versions"];

        if ([AWSDKService debugEnabled]) {
            [_urlSerializer setValue:@"true" forHTTPHeaderField:@"X-Internal-Build"];
            [_jsonSerializer setValue:@"true" forHTTPHeaderField:@"X-Internal-Build"];
        } else {
            [_urlSerializer setValue:@"false" forHTTPHeaderField:@"X-Internal-Build"];
            [_jsonSerializer setValue:@"false" forHTTPHeaderField:@"X-Internal-Build"];
        }
    }

    return self;
}

- (AWJSONResponseSerializer *)defaultResponseSerializer {
    // We use a custom serializer to access additional data about the response
    AWJSONResponseSerializer *responseSerializer = [AWJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
    // Redefine what constitutes "success" and "failure" - see below for details
    [responseSerializer setAcceptableStatusCodes:[self acceptableStatusCodes]];
    return responseSerializer;
}

/**
 *  Return the set of HTTP status codes that the application expects. When a network request completes, the status
 *  code of the response is used to determine whether the success or failure block is executed - anything in this
 *  set will be treated as a "success".
 *
 *  This is where we draw the line between "negative use-cases" and "network errors". If we're expecting that the
 *  server may spit back a 404/NOT FOUND, for example, and handling that case in the code, that needs to trigger
 *  the success callback so that we have the content of the response to properly proceed.
 *
 *  @return the HTTP status codes that should result in the "success" block getting executed
 */
- (NSIndexSet *)acceptableStatusCodes {
    NSMutableIndexSet *statusCodes = [NSMutableIndexSet new];

    // Treat all 200-level status codes as successful. These are HTTP spec'd to be "success" cases.
    [statusCodes addIndexesInRange:NSMakeRange(200, 99)];

    // 300-level codes are valid "redirect" cases, though we don't use these too much (if at all)
    [statusCodes addIndexesInRange:NSMakeRange(300, 99)];

    // 400 Bad Request: Validation failed - the client provided incorrect or incomplete information
    [statusCodes addIndex:400];

    // 401 Unauthorized: Not authenticated - the client wasn't properly authenticated for the request
    [statusCodes addIndex:401];

    // 403 Forbidden: Access denied - the client authenticated but isn't allowed to perform this action
    [statusCodes addIndex:403];

    // 404 Not Found: Resource missing - the client tried to access something that can't be found
    [statusCodes addIndex:404];

    // 409 Conflict: Resource in conflict - the client is attempting to act on a resource that's changed
    [statusCodes addIndex:409];

    // 410 Gone: Resource no longer exists - like 404, except the server knows for certain that it did
    // exist. This might be appropriate if the provider requests an "Appointment" that's already
    // successfully happened; the server knows that it's no longer in a "scheduled" disposition, so it
    // tells the client "Hey dummy, stop showing that thing as an appointment. Also, buy a beeper."
    [statusCodes addIndex:410];

    // 503 Service Unavailable: No access - the server cannot respond to requests right now; maybe it's
    // going down for maintenance, or the mobile app is turned off, etc.
    [statusCodes addIndex:503];

    return statusCodes;
}

- (instancetype)init {
    [self doesNotRecognizeSelector:_cmd];
    return nil;
}

#pragma mark - Public

+ (void)HEAD:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlockNoContent)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict {
    [[NetworkingService sharedInstance] HEAD:url parameters:parameters success:success failure:failure credentials:credentials options:dict];
}

+ (void)GETImage:(NSString *)url success:(NetworkSuccessBlock)success failure:(NetworkFailureBlock)failure credentials:(id<NetworkCredentials>)credentials {
    [[NetworkingService sharedInstance] GETImage:url success:success failure:failure credentials:credentials];
}

+ (void)GETData:(NSString *)url success:(DataSuccessBlock)success failure:(NetworkFailureBlock)failure credentials:(id<NetworkCredentials>)credentials {
    [[NetworkingService sharedInstance] GETData:url success:success failure:failure credentials:credentials];
}

+ (void)GETData:(NSString *)url parameters:(id)parameters success:(DataSuccessBlock)success failure:(NetworkFailureBlock)failure credentials:(id<NetworkCredentials>)credentials {
    [[NetworkingService sharedInstance] GETData:url parameters:parameters success:success failure:failure credentials:credentials];
}

+ (void)GET:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlock)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict {
    [[NetworkingService sharedInstance] GET:url parameters:parameters success:success failure:failure credentials:credentials options:dict];
}

+ (void)DELETE:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlock)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict {
    [[NetworkingService sharedInstance] DELETE:url parameters:parameters success:success failure:failure credentials:credentials options:dict];
}

+ (void)PUT:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlock)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict {
    [[NetworkingService sharedInstance] PUT:url parameters:parameters success:success failure:failure credentials:credentials options:dict];
}

+ (void)POST:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlock)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict {
    [[NetworkingService sharedInstance] POST:url parameters:parameters success:success failure:failure credentials:credentials options:dict];
}

+ (void)POST:(NSString *)url
                   parameters:(id)parameters
    constructingBodyWithBlock:(void (^)(id<AFMultipartFormData> formData))block
                      success:(NetworkSuccessBlock)success
                      failure:(NetworkFailureBlock)failure
                  credentials:(id<NetworkCredentials>)credentials
                      options:(NSDictionary *)dict {
    [[NetworkingService sharedInstance] POST:url parameters:parameters constructingBodyWithBlock:block success:success failure:failure credentials:credentials options:dict];
};

+ (void)POSTMultiPart:(NSString *)url
                   parameters:(id)parameters
    constructingBodyWithBlock:(void (^)(id<AFMultipartFormData> formData))block
                     progress:(NetworkProgressBlock)progress
                      success:(NetworkSuccessBlock)success
                      failure:(NetworkFailureBlock)failure
                  credentials:(id<NetworkCredentials>)credentials
                      options:(NSDictionary *)dict {
    [[NetworkingService sharedInstance] POSTMultiPart:url parameters:parameters constructingBodyWithBlock:block progress:progress success:success failure:failure credentials:credentials options:dict];
}

+ (void)PATCH:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlock)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict {
    [[NetworkingService sharedInstance] PATCH:url parameters:parameters success:success failure:failure credentials:credentials options:dict];
}

- (void)HEAD:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlockNoContent)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict;
{
    AWAFHTTPRequestSerializer *requestSerializer = [dict[kUseJsonSerializer] boolValue] ? _jsonSerializer : _urlSerializer;
    AWAFHTTPResponseSerializer *responseSerializer = self.defaultResponseSerializer;

    // Overrides from options
    if ([dict[kUseAcceptHeaderVersion] intValue]) {
        NSString *acceptHeader = [NSString stringWithFormat:@"application/vnd.amwell-v%@+json", dict[kUseAcceptHeaderVersion]];
        [requestSerializer setValue:acceptHeader forHTTPHeaderField:@"Accept"];
        responseSerializer.acceptableContentTypes = [[responseSerializer acceptableContentTypes] setByAddingObject:acceptHeader];
    } else {
        [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    }

    AWAFHTTPSessionManager *manager = [self createManagerForRequestWithCredentials:credentials requestSerialzer:requestSerializer responseSerializer:responseSerializer];
    [manager HEAD:url parameters:parameters success:success failure:[self defaultFailureBlock:failure]];
}

- (void)GETImage:(NSString *)url success:(NetworkSuccessBlock)success failure:(NetworkFailureBlock)failure credentials:(id<NetworkCredentials>)credentials {
    AWAFHTTPSessionManager *manager = [self createManagerForRequestWithCredentials:credentials requestSerialzer:_urlSerializer responseSerializer:[AWAFImageResponseSerializer serializer]];
    [manager GET:url parameters:nil success:success failure:failure];
}

- (void)GETData:(NSString *)url success:(DataSuccessBlock)success failure:(NetworkFailureBlock)failure credentials:(id<NetworkCredentials>)credentials {
    AWAFHTTPSessionManager *manager = [self createManagerForRequestWithCredentials:credentials requestSerialzer:_urlSerializer responseSerializer:[AWAFHTTPResponseSerializer serializer]];
    [manager GET:url parameters:nil success:success failure:failure];
}

- (void)GETData:(NSString *)url parameters:(id)parameters success:(DataSuccessBlock)success failure:(NetworkFailureBlock)failure credentials:(id<NetworkCredentials>)credentials {
    AWAFHTTPSessionManager *manager = [self createManagerForRequestWithCredentials:credentials requestSerialzer:_urlSerializer responseSerializer:[AWAFHTTPResponseSerializer serializer]];
    [manager GET:url parameters:parameters success:success failure:failure];
}

- (void)GET:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlock)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict;
{
    AWAFHTTPRequestSerializer *requestSerializer = [dict[kUseJsonSerializer] boolValue] ? _jsonSerializer : _urlSerializer;
    AWAFHTTPResponseSerializer *responseSerializer = self.defaultResponseSerializer;

    // Overrides from options
    if ([dict[kUseAcceptHeaderVersion] intValue]) {
        NSString *acceptHeader = [NSString stringWithFormat:@"application/vnd.amwell-v%@+json", dict[kUseAcceptHeaderVersion]];
        [requestSerializer setValue:acceptHeader forHTTPHeaderField:@"Accept"];
        responseSerializer.acceptableContentTypes = [[responseSerializer acceptableContentTypes] setByAddingObject:acceptHeader];
    } else {
        [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    }

    AWAFHTTPSessionManager *manager = [self createManagerForRequestWithCredentials:credentials requestSerialzer:requestSerializer responseSerializer:responseSerializer];
    [manager GET:url parameters:parameters success:success failure:[self defaultFailureBlock:failure]];
}

- (void)DELETE:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlock)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict {
    AWAFHTTPRequestSerializer *requestSerializer = [dict[kUseJsonSerializer] boolValue] ? _jsonSerializer : _urlSerializer;
    AWAFHTTPResponseSerializer *responseSerializer = self.defaultResponseSerializer;

    // Overrides from options
    if ([dict[kUseAcceptHeaderVersion] intValue]) {
        NSString *acceptHeader = [NSString stringWithFormat:@"application/vnd.amwell-v%@+json", dict[kUseAcceptHeaderVersion]];
        [requestSerializer setValue:acceptHeader forHTTPHeaderField:@"Accept"];
        responseSerializer.acceptableContentTypes = [[responseSerializer acceptableContentTypes] setByAddingObject:acceptHeader];
    } else {
        [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    }

    AWAFHTTPSessionManager *manager = [self createManagerForRequestWithCredentials:credentials requestSerialzer:requestSerializer responseSerializer:responseSerializer];
    [manager DELETE:url parameters:parameters success:success failure:[self defaultFailureBlock:failure]];
}

- (void)PUT:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlock)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict {
    AWAFHTTPRequestSerializer *requestSerializer = [dict[kUseJsonSerializer] boolValue] ? _jsonSerializer : _urlSerializer;
    AWAFHTTPResponseSerializer *responseSerializer = self.defaultResponseSerializer;

    // Overrides from options
    if ([dict[kUseAcceptHeaderVersion] intValue]) {
        NSString *acceptHeader = [NSString stringWithFormat:@"application/vnd.amwell-v%@+json", dict[kUseAcceptHeaderVersion]];
        [requestSerializer setValue:acceptHeader forHTTPHeaderField:@"Accept"];
        responseSerializer.acceptableContentTypes = [[responseSerializer acceptableContentTypes] setByAddingObject:acceptHeader];
    } else {
        [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    }

    AWAFHTTPSessionManager *manager = [self createManagerForRequestWithCredentials:credentials requestSerialzer:requestSerializer responseSerializer:responseSerializer];
    [manager PUT:url parameters:parameters success:success failure:[self defaultFailureBlock:failure]];
}

- (void)POST:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlock)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict {
    AWAFHTTPRequestSerializer *requestSerializer = [dict[kUseJsonSerializer] boolValue] ? _jsonSerializer : _urlSerializer;
    AWAFHTTPResponseSerializer *responseSerializer = self.defaultResponseSerializer;

    // Overrides from options
    if ([dict[kUseAcceptHeaderVersion] intValue]) {
        NSString *acceptHeader = [NSString stringWithFormat:@"application/vnd.amwell-v%@+json", dict[kUseAcceptHeaderVersion]];
        [requestSerializer setValue:acceptHeader forHTTPHeaderField:@"Accept"];
        responseSerializer.acceptableContentTypes = [[responseSerializer acceptableContentTypes] setByAddingObject:acceptHeader];
    } else {
        [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    }

    AWAFHTTPSessionManager *manager = [self createManagerForRequestWithCredentials:credentials requestSerialzer:requestSerializer responseSerializer:responseSerializer];
    [manager POST:url parameters:parameters success:success failure:[self defaultFailureBlock:failure]];
}

- (void)POSTMultiPart:(NSString *)url
                   parameters:(id)parameters
    constructingBodyWithBlock:(void (^)(id<AFMultipartFormData> formData))block
                     progress:(NetworkProgressBlock)progress
                      success:(NetworkSuccessBlock)success
                      failure:(NetworkFailureBlock)failure
                  credentials:(id<NetworkCredentials>)credentials
                      options:(NSDictionary *)dict {
    AWAFHTTPRequestSerializer *requestSerializer = [dict[kUseJsonSerializer] boolValue] ? _jsonSerializer : _urlSerializer;

    AWAFHTTPResponseSerializer *responseSerializer = self.defaultResponseSerializer;

    // Overrides from options
    if ([dict[kUseAcceptHeaderVersion] intValue]) {
        [requestSerializer setValue:[NSString stringWithFormat:@"application/vnd.amwell-v%d+json", [dict[kUseAcceptHeaderVersion] intValue]] forHTTPHeaderField:@"Accept"];
    } else {
        [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    }

    AWAFHTTPSessionManager *manager = [self createManagerForRequestWithCredentials:credentials requestSerialzer:requestSerializer responseSerializer:responseSerializer];
    [manager POST:url parameters:parameters constructingBodyWithBlock:block success:success failure:[self defaultFailureBlock:failure]];
}

- (void)POST:(NSString *)url
                   parameters:(id)parameters
    constructingBodyWithBlock:(void (^)(id<AFMultipartFormData> formData))block
                      success:(NetworkSuccessBlock)success
                      failure:(NetworkFailureBlock)failure
                  credentials:(id<NetworkCredentials>)credentials
                      options:(NSDictionary *)dict {
    AWAFHTTPRequestSerializer *requestSerializer = [dict[kUseJsonSerializer] boolValue] ? _jsonSerializer : _urlSerializer;
    AWAFHTTPResponseSerializer *responseSerializer = self.defaultResponseSerializer;

    // Overrides from options
    if ([dict[kUseAcceptHeaderVersion] intValue]) {
        NSString *acceptHeader = [NSString stringWithFormat:@"application/vnd.amwell-v%@+json", dict[kUseAcceptHeaderVersion]];
        [requestSerializer setValue:acceptHeader forHTTPHeaderField:@"Accept"];
        responseSerializer.acceptableContentTypes = [[responseSerializer acceptableContentTypes] setByAddingObject:acceptHeader];
    } else {
        [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    }

    AWAFHTTPSessionManager *manager = [self createManagerForRequestWithCredentials:credentials requestSerialzer:requestSerializer responseSerializer:responseSerializer];
    [manager POST:url parameters:parameters constructingBodyWithBlock:block success:success failure:[self defaultFailureBlock:failure]];
}

- (void)PATCH:(NSString *)url
     parameters:(id)parameters
        success:(NetworkSuccessBlock)success
        failure:(NetworkFailureBlock)failure
    credentials:(id<NetworkCredentials>)credentials
        options:(NSDictionary *)dict {
    AWAFHTTPRequestSerializer *requestSerializer = [dict[kUseJsonSerializer] boolValue] ? _jsonSerializer : _urlSerializer;
    AWAFHTTPResponseSerializer *responseSerializer = self.defaultResponseSerializer;

    // Overrides from options
    if ([dict[kUseAcceptHeaderVersion] intValue]) {
        NSString *acceptHeader = [NSString stringWithFormat:@"application/vnd.amwell-v%@+json", dict[kUseAcceptHeaderVersion]];
        [requestSerializer setValue:acceptHeader forHTTPHeaderField:@"Accept"];
        responseSerializer.acceptableContentTypes = [[responseSerializer acceptableContentTypes] setByAddingObject:acceptHeader];
    } else {
        [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    }

    AWAFHTTPSessionManager *manager = [self createManagerForRequestWithCredentials:credentials requestSerialzer:requestSerializer responseSerializer:responseSerializer];

    [manager PATCH:url parameters:parameters success:success failure:[self defaultFailureBlock:failure]];
}

#pragma mark - Private

- (AWAFHTTPSessionManager *)createManagerForRequestWithCredentials:(id<NetworkCredentials>)credentials
                                                  requestSerialzer:(AWAFHTTPRequestSerializer *)requestSerializer
                                                responseSerializer:(AWAFHTTPResponseSerializer *)responseSerializer {
    AWAFHTTPSessionManager *manager = [AWAFHTTPSessionManager manager];
    __weak AWAFHTTPSessionManager *weakManager = manager;
    [manager setTaskDidCompleteBlock:^(NSURLSession *_Nonnull session, NSURLSessionTask *_Nonnull task, NSError *_Nullable error) {
        [weakManager invalidateSessionCancelingTasks:NO];
    }];

    if (AWSDKService.sharedInstance.certificatePinningEnabled) {
        manager.securityPolicy = [AWAFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
        manager.securityPolicy.pinnedCertificates = self.pinnedCertificates.allObjects;
    }

    [requestSerializer clearAuthorizationHeader];
    if (credentials) {
        [requestSerializer setValue:credentials.authorizationHeaderValue forHTTPHeaderField:@"Authorization"];
        if ([responseSerializer isKindOfClass:AWJSONResponseSerializer.class]) {
            ((AWJSONResponseSerializer *)responseSerializer).tokenDelegate = credentials;
        }
    }

    // Accept-Language HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
    NSLocale *locale = [AWSDKLocale sharedInstance].preferredLocale;
    NSString *localeIdentifier = locale.localeIdentifier;
    NSDictionary<NSLocaleKey, NSString *> *localeComponents = [NSLocale componentsFromLocaleIdentifier:localeIdentifier];
    NSString *languageIdentifier = [NSString stringWithFormat:@"%@-%@,%@;q=1.0", localeComponents[NSLocaleLanguageCode], localeComponents[NSLocaleCountryCode], localeComponents[NSLocaleLanguageCode]];
    [requestSerializer setValue:languageIdentifier forHTTPHeaderField:@"Accept-Language"];

    [requestSerializer setValue:[[AWSDKService sharedInstance] bundleId] forHTTPHeaderField:@"X-App-Identifier"];

    [responseSerializer setAcceptableStatusCodes:[self acceptableStatusCodes]];

    [manager setRequestSerializer:requestSerializer];
    [manager setResponseSerializer:responseSerializer];

    if ([AWSDKService debugEnabled]) {
        manager.securityPolicy.allowInvalidCertificates = YES;
    }

    return manager;
}

/**
 *  Returns a default failure handler for network requests that don't have a specific one implemented.
 *  Currently, this just logs a message at WARN level and the actual error at DEBUG level; if there's
 *  additional behavior that applies across the board for unexpected request failures, here would be
 *  the place to add it.
 *
 *  @param failure the failure block that was passed into the method.
 *
 *  @return the supplied failure block, if it exists; else, a default handler
 */
- (NetworkFailureBlock)defaultFailureBlock:(NetworkFailureBlock)failure {
    if (failure) {
        return failure;
    }

    return ^(NSURLSessionDataTask *task, NSError *error) {
    };
}

@end

Как добавить поддержку gzip в мой заголовок?

...