In my previous posts I was talking about how to use SOAP to SharePoint Webservices using different programing languages (PHP, Android – Java). I found it very convenient to be able to publish also a sample how to do the same in Xcode (Objective-C).
I also had to browse the web quite a bit. Finilly I stumbeled upon article from Ravi Dixit about the tipical webservice changing celsius to fahrenheit. Becase I was missing some steps in the code Erhan Demirci steped in. Because I also needed to authenticate this article came handy. I connected the dots, changed the SOAP request and displayed the responce in the screen (also in the log).
When creating new project in Xcode just choose View-based Application, name it “SoapSharePoint” and copy-paste the code below.
The SoapSharePointController.h code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #import <UIKit/UIKit.h>
@interface SoapSharePointViewController : UIViewController <NSXMLParserDelegate> {
IBOutlet UILabel *output;
NSMutableData *webData;
NSXMLParser *xmlParser;
NSString *finaldata;
NSString *convertToStringData;
NSMutableString *nodeContent;
}
@property (nonatomic,retain) UILabel *output;
-(IBAction)invokeService;
@end |
And the SoapSharePointController.m file:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| #import "SoapSharePointViewController.h"
@implementation SoapSharePointViewController
@synthesize output;
-(IBAction)invokeService
{
nodeContent = [[NSMutableString alloc]init];
NSString *soapFormat = [NSString stringWithFormat:@"<?xml version="1.0" encoding="utf-8"?>\n"
"<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/">\n"
"<soap:Body>\n"
"<GetListCollection xmlns="http://schemas.microsoft.com/sharepoint/soap/" />\n"
"</soap:Body>\n"
"</soap:Envelope>\n"];
NSLog(@"The request format is %@",soapFormat);
NSURL *locationOfWebService = [NSURL URLWithString:@"http://localhost/_vti_bin/lists.asmx"];
NSLog(@"web url = %@",locationOfWebService);
NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc]initWithURL:locationOfWebService];
NSString *msgLength = [NSString stringWithFormat:@"%d",[soapFormat length]];
[theRequest addValue:@"text/xml" forHTTPHeaderField:@"Content-Type"];
[theRequest addValue:@"http://schemas.microsoft.com/sharepoint/soap/GetListCollection" forHTTPHeaderField:@"SOAPAction"];
[theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPMethod:@"POST"];
//the below encoding is used to send data over the net
[theRequest setHTTPBody:[soapFormat dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:theRequest delegate:self];
if (connect) {
webData = [[NSMutableData alloc]init];
}
else {
NSLog(@"No Connection established");
}
}
//NSURLConnection delegate method
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[webData setLength: 0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[webData appendData:data];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"ERROR with theConenction");
[connection release];
[webData release];
}
-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
return YES;
}
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSURLCredential *credential = [NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"DONE. Received Bytes: %d", [webData length]);
NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
NSLog(@"%@",theXML);
convertToStringData = [[NSString alloc] initWithData:webData encoding:NSUTF8StringEncoding];
output.numberOfLines = 0;
output.text = convertToStringData;
[output sizeToFit];
[connection release];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
[super viewDidUnload];
}
- (void)dealloc {
[output release];
[convertToStringData release];
[super dealloc];
}
@end |
Also don’t forget to create a label and a button in the XIB (nib) file. Connect the the File’s Owner in outlets output to label and in the received action invokeService to button.
Or you can simply download it.