NSURLConnection Delegate methods not getting called after two times - ios

I am sending a request to server using NSURLConnection, it worked for 2 times , since third time it is not working, delegates are not being called. What i found during debugging is connectionShouldUseCredentialStorage method is called for initial times, third time it was not called and rest of methods are also not called.
Here is my code:
NSString *requestString = [NSString stringWithFormat:#"%#", [serviceParameters JSONFragment], nil];
NSData *requestData = [NSData dataWithBytes: [requestString UTF8String] length: [requestString length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: strUrl]];
[request setHTTPMethod:#"POST"];
[request setValue:#"application/json" forHTTPHeaderField:#"Content-type"];
[request setHTTPBody:requestData];
[NSURLConnection connectionWithRequest:urlRequest delegate:self];
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
self.data = [NSMutableData data];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)aData
{
[self.data appendData:aData];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
SBJSON *jsonParser = [[SBJSON new] autorelease];
NSString *jsonString = [[[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding] autorelease];
NSError *outError = nil;
id result = [jsonParser objectWithString:jsonString error:&outError];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
if( [[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust] )
{
return YES;
}
return NO;
}
- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection
{
return YES;
}

in .h
NSMutableData * data;
NSURLConnection *connection;
Also add Add
in .m
-(void) startConnection
{
NSString *requestString = [NSString stringWithFormat:#"http://md5.jsontest.com/?text=Pushkraj"];
NSData *requestData = [NSData dataWithBytes: [requestString UTF8String] length: [requestString length]];
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:requestString]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
data = [NSMutableData dataWithCapacity:0];
[request setHTTPMethod:#"POST"];
[request setValue:#"application/json" forHTTPHeaderField:#"Content-type"];
[request setHTTPBody:requestData];
connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
data = [NSMutableData data];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)aData
{
[data appendData:aData];
NSDictionary * dataDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSLog(#"dataDict : %#",dataDict);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(#"connectionDidFinishLoading");
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(#"Error : %#",error);
}
Call [self startConnection]; wherever you want means on viewDidLoad or on UIButton Click

You forgot to start connection. You are not saving the reference to NSURLConnection for starting the connection. So replace last line
[NSURLConnection connectionWithRequest:urlRequest delegate:self];
with this
NSURLConnection *cn =[NSURLConnection connectionWithRequest:urlRequest delegate:self];
[cn start];
Hope it helps.

Related

Connecting to the server using NSURLConnection objective c

I'm trying to connect my application to the backend using NSURLConnection.
When I use postman everything works really fine and I get the expected result.
But when I try that in my code I get a totally different result, which is a JSON object from the server but with an error message.
Please check the following pictures and the code I use for more details.
Any idea will be really appreciated .
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
NSString *urlStr=[NSString stringWithFormat:#"URL"];
NSURL* _url=[NSURL URLWithString:urlStr];
[request setURL:_url];
[request setHTTPMethod:#"POST"];
[request setValue:#"application/x-www-form-urlencoded" forHTTPHeaderField:#"Content-Type"];
[request setValue:#"Bearer ---" forHTTPHeaderField:#"Authorization"];
NSArray *keys= [[NSArray alloc] initWithObjects:#"email",#"firebase_token",#"password",#"username",#"phone",#"uploaded_file", nil];
NSArray *values = [[NSArray alloc] initWithObjects:email,#"token",password,userName,phone,#"#/C:/Users/admin/Downloads/chili house.png", nil];
NSDictionary *params = [[NSDictionary alloc] initWithObjects:values forKeys:keys];
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params
options:NSJSONWritingPrettyPrinted
error:&error];
[request setHTTPBody:jsonData];
NSString *jsonString;
if ( jsonData) {
jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
[request setHTTPBody:jsonData];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
}
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
if ([challenge previousFailureCount] == 0) {
NSURLCredential *newCredential;
newCredential = [NSURLCredential credentialWithUser:#"User"
password:#"Password"
persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential
forAuthenticationChallenge:challenge];
} else {
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data{
[self.responseData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(#"Connection failed: %#", [error description]);
}
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return YES;
}
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[self.responseData setLength:0];
}
- (NSCachedURLResponse *) connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
return nil;
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[[BusyAgent defaultAgent] makeBusy:NO];
NSString *responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
if (responseString == (id)[NSNull null] || responseString.length == 0 ){
NSLog(#"responseString= %#",responseString);
}else{
NSLog(#"responseString = %#",responseString);
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:nil message:responseString delegate:self cancelButtonTitle:nil otherButtonTitles:#"Ok", nil];
[alert show];
}
self.responseData = nil;
}

Getting slow response while hitting https url and fetching the data in iOS

In ViewDidLoad method I have added the below code
self.responseData = [NSMutableData data];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString:#"my url"]];
[request setHTTPShouldHandleCookies:YES];
[request setHTTPMethod:#"GET"];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
And When connection start delegate methods are calling
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
NSUInteger responseStatusCode = [httpResponse statusCode];
_responseData = [[NSMutableData alloc] init];
NSLog(#"connection");
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
// Append the new data to the instance variable you declared
[_responseData appendData:data];
NSLog(#"_responseData%#",_responseData);
}
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse*)cachedResponse {
// Return nil to indicate not necessary to store a cached response for this connection
return nil;
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSError *jError;
jArray= [NSJSONSerialization JSONObjectWithData:_responseData options:NSJSONReadingMutableContainers error:&jError];
[_tableView reloadData];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(#"didFailWithError");
}
This is the way am hitting HTTPS URL but it was taking more time to display the data.Am not getting what is the issue.Can anyone please help me on this issue.

How do I convert NSData to NSDictionary using NSJSONSerialization?

Hi I am facing problem in conversion of NSData to NSDictionary using NSJSONSerialization?
I got data using my code but unable to convert it into json.
Here is my code...
ViewController.h File
#import <UIKit/UIKit.h>
#interface ViewController : UIViewController<NSURLConnectionDelegate>
{
NSString *massage;
NSURL *url;
NSMutableURLRequest *request;
NSURLConnection *connection;
NSMutableData *httpbody;
NSMutableData *webData;
NSData *responceData;
NSDictionary *responceJson;
}
and ViewController.m File
#import "ViewController.h"
#interface ViewController ()
#end
#implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *mobile = #"123456789";
NSString *password = #"Welcome123";
NSString *deviceId = #"123sdfg15641ert321ret";
url = [NSURL URLWithString:#"http://203.109.87.34:8585/d-cab/web/app_dev.php/api/v1"];
massage = [NSString stringWithFormat:#"{\"action\":\"login\",\"data\":{\"contact\":\"%#\",\"password\":\"%#\",\"deviceId\":\"%#\"}}",mobile,password,deviceId];
//NSLog(#"Body = %#", massage);
httpbody = [ NSMutableData dataWithBytes: [ massage UTF8String ] length: [ massage length ] ];
request = [NSMutableURLRequest requestWithURL: url];
[request setHTTPMethod: #"POST"];
[request setHTTPBody: httpbody];
[request setTimeoutInterval:10.0];
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
//NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
//[connection start];
if (connection) {
webData = [[NSMutableData alloc]init];
}
}
#pragma mark NSURLConnection Delegate Methods
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[webData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[webData appendData:data];
//NSLog(#"WebData = %#",webData);
//NSLog(#"=================================");
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSError* error = nil;
responceJson = [NSJSONSerialization JSONObjectWithData:webData options:kNilOptions error:&error];
NSLog(#"ResponceJSON = %#",responceJson);
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
// Show error message
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:#"Error In connection" message:#"We are facing some problem in connection. Please Check your Internet Connection." delegate:self cancelButtonTitle:#"Ok" otherButtonTitles:nil, nil];
[alert show];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#end
Please Check my code and tell me where and what change I have to make?
Hey Thanks to all who gave attention to my question.... But I found the problem in my question.
I am trying to send the parameter into string format instead of dictionary format and not specifying header to request. Here is my updated code...
NSDictionary *paramData = [[NSDictionary alloc]initWithObjectsAndKeys:mobile,#"contact",password,#"password",deviceId,#"deviceId", nil];
//NSLog(#"paramData = %#",paramData);
jsonParam = [[NSDictionary alloc]initWithObjectsAndKeys:#"login",#"action",paramData,#"data", nil];
//NSLog(#"jsonParam = %#",jsonParam);
httpbody = [NSJSONSerialization dataWithJSONObject:jsonParam options:0 error:nil];
request = [NSMutableURLRequest requestWithURL: url];
request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0];
[request setHTTPMethod:#"POST"];
[request setValue:#"application/json" forHTTPHeaderField:#"Accept"];
[request setValue:#"application/json" forHTTPHeaderField:#"Content-Type"];
[request setValue:[NSString stringWithFormat:#"%d", [httpbody length]] forHTTPHeaderField:#"Content-Length"];
[request setHTTPBody: httpbody];
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (connection) {
webData = [[NSMutableData alloc]init];
}
It worked for me....
Try using the following code :
responceJson = [NSJSONSerialization JSONObjectWithData:webData
options:NSJSONReadingMutableContainers
error:&error];
Well the problem here is not in conversion problem is in this funtion
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
//[webData setLength:0];
webdData = [[NSMutableData alloc] init];
}
It will help.Thanks
NSURLConnection *theConnection = [NSURLConnection connectionWithRequest:request delegate:self];
if( theConnection )
{
mdata = [[NSMutableData alloc]init];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
mdata.length=0;
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[mdata appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// Data store in dictionary when connection proceed in background
dict=[NSJSONSerialization JSONObjectWithData:mdata options:kNilOptions error:nil];
NSLog(#"%#",dict);
}
This is working gooood...
Try to check, what your connection is load. Converting NSData to NSString. In didFinishLoading typing this:
NSString *tempString = [[NSString alloc] initWithData:webData encoding:NSUTF8StringEncoding];
NSLog(#"loaded data: %#",tempString);

Login issues returns me previous login profile

I uses nsurlconnection delegates to post request I just created one class to test my login post request one I login it gives me correct profile and again I run and login with another credentials it is giving me previous profile I done understand what is the problem I am posting to ROR server
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[receivedData appendData:data];
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[receivedData setLength:0];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSError * error;
jsonDictionary = [NSJSONSerialization JSONObjectWithData:receivedData options:0 error:&error];
NSLog(#"%#",jsonDictionary);
theConnection = nil;
receivedData = nil;
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
theConnection = nil;
receivedData = nil;
NSLog(#"Connection failed! Error - %# %#",
[error localizedDescription],
[[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}
- (IBAction)sigininAction:(id)sender {
if (theConnection) {
[theConnection cancel];
receivedData.data = nil;
jsonDictionary = nil;
theConnection = nil;
}
NSString *bodyData = [NSString stringWithFormat:#"user[email]=%#&user[password]=%#",[_email text],[_password text]];
NSData *postData = [bodyData dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:#"http://URL/login"]];
[postRequest setValue:#"application/x-www-form-urlencoded" forHTTPHeaderField:#"Content-Type"];
[postRequest setValue:#"application/json" forHTTPHeaderField:#"Accept"];
[postRequest setHTTPMethod:#"POST"];
[postRequest setHTTPBody:postData];
theConnection=[[NSURLConnection alloc] initWithRequest:postRequest delegate:self];
if (theConnection) {
[theConnection start];
receivedData = [[NSMutableData alloc]init];
}
}

Progress Bar With NSURLConnection

I want to show the progress bar while downloading a video from an url. I'm not able to figure out where I have gone wrong,and also expectedContentLength is always showing -1. Here is the code.
-(void)getResource{
bytesReceived = 0;
self.progressView.progress = 0.0;
NSString *string = #“MY_URL";
NSMutableURLRequest *request =[[NSMutableURLRequest alloc] initWithURL:
[NSURL URLWithString:string]];
[request setHTTPMethod:#"POST"];
[request setValue:#"application/json" forHTTPHeaderField:#"Content-length"];
[request setValue:#"application/json" forHTTPHeaderField:#"Content-Type"];
[request setValue:#"application/json" forHTTPHeaderField:#"Accept"];
self.feedConnection = [[NSURLConnection alloc]initWithRequest:request delegate:self]
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
self.responseData = [NSMutableData data];
[self.responseData setLength:0];
float length = [response expectedContentLength];
expectedBytes = [NSNumber numberWithUnsignedInteger:length];
NSLog(#"expected bytes %f %#",length,expectedBytes);
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[self.responseData appendData:data];
float progress = (float)[self.responseData length]/[expectedBytes floatValue];
NSLog(#"%f / %f is %f", (float)[self.responseData length] ,[expectedBytes floatValue],progress);
self.progressView.progress = progress;
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
self.feedConnection = nil;
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
self.feedConnection = nil;
[self.view setBackgroundColor:[UIColor blackColor]];
[self fetchedData:self.responseData];
self.responseData = nil;
}
I think,you Can use NSURLConnectionDownloadDelegate method in which will get the totalBytes and how much data has been downloaded.
- (void)connection:(NSURLConnection *)connection
didWriteData:(long long)bytesWritten
totalBytesWritten:(long long)totalBytesWritten
expectedTotalBytes:(long long) expectedTotalBytes;

Resources