0

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

通知确实适用于以下命令 curl -X POST -u ":" -H "Content-Type: application/json" --data '{"device_tokens": [""], "aps": {"alert": "维克兰特说你好!","徽章": "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 url 。所以我写了代表。

- (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 但不发送用户名和密码。有谁知道解决方案

4

2 回答 2

3

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

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

亚当
城市飞艇

于 2011-06-06T15:47:44.657 回答
1

canAuthenticateAgainstProtectionSpace委托中将NSURLAuthenticationMethodServerTrust替换为NSURLAuthenticationMethodHTTPBasic

-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
 return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic];
}
于 2011-08-01T13:37:55.840 回答