STHTTPRequest icon indicating copy to clipboard operation
STHTTPRequest copied to clipboard

Warning: sendSynchronousRequest:returningResponse:error: deprecated since iOS 9

Open inb4ohnoes opened this issue 9 years ago • 1 comments

I feel like this should be updated pretty soon...

inb4ohnoes avatar Jul 23 '16 22:07 inb4ohnoes

I needed to support a self-signed cert, which was not trusted in the keychain. Since "NSURLConnection sendSynchronousRequest" does not support delegate.

So implemented this

- (NSString *)sartSynchronousSessionWithError:(NSError **)error
{
    NSURLRequest *request = [self prepareURLRequest];
    __block NSURLResponse   *urlResponse = nil;
    dispatch_semaphore_t    sem;
    __block NSData          *result = nil;
    __block NSError         *blkErr = nil;
    
    sem = dispatch_semaphore_create(0);
    
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue:nil];

    [[defaultSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *err)
    {
        if (err) {
            blkErr = err;
        }
        
        urlResponse = response;
        
        if (err == nil) {
            result = data;
        }
        
        dispatch_semaphore_signal(sem);  
    }] resume];
    
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    
    // If Error, return error
    if (blkErr) {
        if (error != NULL) *error = blkErr;
        return nil;
    }
    
    if (urlResponse)
    {
        if([urlResponse isKindOfClass:[NSHTTPURLResponse class]])
        {
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)urlResponse;
            self.responseHeaders = [httpResponse allHeaderFields];
            self.responseStatus = [httpResponse statusCode];
            self.responseStringEncodingName = [httpResponse textEncodingName];
        }
    }
    
    self.responseString = [self stringWithData:result encodingName:_responseStringEncodingName];
    self.responseData = [NSMutableData dataWithData:result];
    if(self.responseStatus >= 400) {
        if (error != NULL) *error = [self errorDescribingRequestNonfulfillment];
    }
    
    return _responseString;
}

cheizer avatar Apr 24 '17 19:04 cheizer