Vikrant Labde
Vikrant Labde

Reputation: 128

Urban Airship Push Notification Problem

I am developing an app with phonegap, however I am trying to generate Push Notification call through plugin with NSUrlconnection.

Notification does work with following command curl -X POST -u ":" -H "Content-Type: application/json" --data '{"device_tokens": [""], "aps": {"alert": "Vikrant say Hello!","badge": "5"}}' https://go.urbanairship.com/api/push/

NOW I AM TRYING SAME WITH BELOW CODE

NSString *URL = @"https://go.urbanairship.com/api/push/";
    NSMutableURLRequest *req = [[[NSMutableURLRequest alloc] init] autorelease];

    [req setURL:[NSURL URLWithString:URL]];


    [req setHTTPMethod:@"POST"];

    NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
    NSString *contentType = [NSString stringWithFormat:@"application/json; boundary=%@",boundary];

    [req addValue:contentType forHTTPHeaderField: @"Content-Type"];

    NSMutableData *body = [NSMutableData data];

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithString:@"{\"device_tokens\": [\"<devce token>\"], \"aps\": {\"alert\": \"Vikrant say Hello!\",\"badge\": \"5\"}}"] dataUsingEncoding:NSUTF8StringEncoding]];

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];


    [req setHTTPBody:body];

    NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];
    finished = NO;
    finishedWithError = NO;
    if(xmlData == nil)
        [xmlData release];
    if(conn)
    {
        xmlData = [[NSMutableData alloc] retain];
        while(!finished)
        {
            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        }
    }

So, its a HTTPS url with server authentication. So i have written the delegates.

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge 
{
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
    {
        NSLog(@"Trust Challenge Requested!");
        [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
        [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];

    }
    else if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic])
    {
    NSLog(@"HTTP Auth Challenge Requested!");
        NSURLCredential *credential = [[NSURLCredential alloc] initWithUser:@"<apikey>" password:@"<master key>" persistence:NSURLCredentialPersistenceForSession];
        [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
        [credential release];
    }


}

The problem is, connection is not accepting the username and password. because prints below output

2000-01-01 11:07:09.-540 WIPT[500:307] From APN
[Switching to thread 13059]
2000-01-01 11:07:13.-986 WIPT[500:307] Trust Challenge Requested!
2000-01-01 11:07:14.-82 WIPT[500:307] didReceiveResponse
2000-01-01 11:07:14.-25 WIPT[500:307] connection
2000-01-01 11:07:14.-05 WIPT[500:307] connectionDidFinishLoading
2000-01-01 11:07:15.-958 WIPT[500:307] APN response data Authorization Required

It means it executes the URL but dose not send Username and password. Does anybody know the solution

Upvotes: 0

Views: 2488

Answers (2)

Gurmail Singh
Gurmail Singh

Reputation: 11

Replace NSURLAuthenticationMethodServerTrust with NSURLAuthenticationMethodHTTPBasic in canAuthenticateAgainstProtectionSpace delegate.

-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
 return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic];
}

Upvotes: 1

robotadam
robotadam

Reputation: 1153

The push API calls are normally authenticated with the master secret as the password, not the application secret. Consider the application secret to be a restricted access code that can be safely embedded in the app; you'd never embed the master secret inside your application.

However, to make some subset of push calls available without the master secret, you can enable the allow push from device flag on the Urban Airship application. This lets you make push calls directly to a device token with the application secret. It will not allow you to make pushes to aliases, tags, or do full broadcasts, as these can be guessed or can cost you lots of trouble.

Adam
Urban Airship

Upvotes: 3

Related Questions