如何将NSURLConnection更改为Objective C中的NSURLSession?
我是iOS的新手。我在将应用程序提交给Apple Store时遇到了IPv6错误。我的代码是这样的如何将NSURLConnection更改为Objective C中的NSURLSession?
-(void)serverconnection{
NSString *soapMessage = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
"<soap:Body>"
"<Method Name xmlns=\"http://tempuri.org/\">"
"<UserId>%@</UserId>"
"</Method Name>"
"</soap:Body>"
"</soap:Envelope>",userid];
NSURL *myNSUObj=[NSURL URLWithString:@"URL/webservice.asmx?op=MethodName"];
// NSURLRequest *myNSURequestObj=[NSURLRequest requestWithURL:myNSUObj];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:myNSUObj];
NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[soapMessage length]];
[theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[theRequest addValue: @"http://tempuri.org/MethodName" forHTTPHeaderField:@"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
myNSUConnectionObj=[[NSURLConnection alloc]initWithRequest:theRequest delegate:self];
NSLog(@"Data =%@",myNSUConnectionObj);
if(myNSUConnectionObj)
{
NSLog(@"successful connection");
myNSMDataFromServer=[[NSMutableData alloc]init];
}
}
#pragma mark - NSURLConnection Delegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
[myNSMDataFromServer setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[myNSMDataFromServer appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSXMLParser *myNSXMLParserObj=[[NSXMLParser alloc]initWithData:myNSMDataFromServer];
myNSXMLParserObj.delegate=self;
[myNSXMLParserObj parse];
NSLog(@"%@",myNSXMLParserObj.parserError);
NSLog(@"DataArray: %@",myDataNSMArray);
Keyarry=[responsedict valueForKey:@"Key"];
NSLog(@"Assign Count =%@",Keyarry);
NSString *string = [NSString stringWithFormat:@"%@", [Keyarry objectAtIndex:0]];
NSLog(@"String value =%@",string);
ibtassigncountlbl.text =string;
}
#pragma mark - NSXMLParsing Delegate
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:@"FillBlocksNew"])
{
myDataClassObj=[[mydata alloc]init];
}
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
myMutableStringObj=[[NSMutableString alloc]initWithString:string];
NSLog(@"Array String: %@",myMutableStringObj);
NSData *data = [myMutableStringObj dataUsingEncoding:NSUTF8StringEncoding];
responsedict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"JSON DATA = %@",responsedict);
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"DataArray: %@",myDataNSMArray);
}
我的问题是什么样的委托使用在NSURLSessionDataDelegate
didFinishLoading
。
当我下面使用该委托:
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task connectionDidFinishLoading:(NSURLConnection *)conn { }
它表明我的错误。苹果建议我需要从NSURLConnectionDataDelegate
更改为NSURLSessionDataDelegate
。
NSURLConnection方法与IPv6兼容。无需将其更改为支持IPv6。我认为问题在于你的网址。在您的应用程序的某处,您可能使用了像(w.x.y.z)这样的硬编码IPv4地址。使用适当的域名删除这些地址,应用程序将通过。
你也应该使用最新的Rachability类。
基本上delegate
方法被用来创建两个类之间的连接,以便当请求一个url
尤斯NSURLRequest
它使连接到NSURLConnection
类,其处理请求url
所述特定的时间和明智地响应的delegate
方法。
而NSURLConnection
两种方法,发出信号请求已完成(NSURLConnectionDataDelegate - connectionDidFinishLoading
:和NSURLConnectionDelegate -connection:didFailWithError
:)。两种方法都表示特定请求的完成。
现在没有什么不对,使用NSURLConnection
你只需要确保你的URL
和使用delegate
方法以正确的方式见下文。
#pragma mark -
#pragma mark - NSURLConnection Delegate Methods
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[webData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
if(!webData){
webData = [[NSMutableData alloc] init];
}
[webData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *returnString = [[NSString alloc] initWithData:webData encoding:NSUTF8StringEncoding];
NSLog(@"response = %@",returnString);
}
这是NSURLConnectionDataDelegated我已经在使用。 – Muju
如何检查URL地址和Rachability版本 – Muju
检查您的代码在哪里创建URL。您是否使用180.170.160.150之类的硬编码IP地址?如果是,请使用适当的域名(如hostname.api.com)将其删除。为可达性下载最新的可达性。它们与IPv6兼容。 – Apurv