Tag Archives: Objective-C

Making a POST in Objective-C (Xcode) to SharePoint Webservice requiring Windows NTLM Authenticaton for iPhone or Ipad

Xcode logoIn 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.

“Hallo World” in Objective-C

Below is a simple sample code in objecitve-c on how to write “Hallo World” string:

1
2
3
4
5
6
7
8
9
10
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

        NSLog (@"Hallo World");
        [pool drain];
        return 0;
}