城市飞艇推送通知问题

时间:2011-06-06 11:13:04

标签: push-notification urbanairship.com

我正在开发一个带有phonegap的应用程序,但是我试图通过NSUrlconnection插件生成推送通知调用。

通知可以使用以下命令 curl -X POST -u“:” - H“Content-Type:application / json”--data'{“device_tokens”:[“”],“aps”:{“alert”:“Vikrant说你好!”, “徽章”:“5”}}'https://go.urbanairship.com/api/push/

现在我正在尝试使用以下代码

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]];
        }
    }

因此,它是一个带服务器身份验证 HTTPS 网址。所以我写了代表们。

- (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];
    }


}

问题是,连接不接受用户名和密码。因为打印输出

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

这意味着它执行URL但不发送用户名和密码。有人知道解决方案

2 个答案:

答案 0 :(得分:3)

推送API调用通常使用主密钥作为密码进行身份验证,而不是应用程序密钥。将应用程序密钥视为可以安全地嵌入应用程序的受限访问代码;你永远不会在你的应用程序中嵌入主秘密。

但是,要在没有主密钥的情况下使某些推送调用子集可用,您可以在Urban Airship应用程序上启用允许从设备推送标记。这使您可以使用应用程序密钥直接对设备令牌进行推送调用。它不允许您推送别名,标签或完整的广播,因为这些可能会被猜到或者可能会给您带来很多麻烦。

亚当
城市飞艇

答案 1 :(得分:1)

NSURLAuthenticationMethodServerTrust 替换为 canAuthenticateAgainstProtectionSpace 委托中的 NSURLAuthenticationMethodHTTPBasic

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