2013-02-28 74 views
3

你好,我正在尝试一些相当简单的想法。 我做了一个使用APNS发送数据的可可应用程序,从我的数据库获取令牌,一切都设置完成并运行完美。如何在目标c中接收来自APNS反馈服务器的数据

现在我想检查APNS反馈服务器并删除从我的数据库收到的任何令牌。 我在php,javascript等等中发现了数十个例子,但在Objective C中没有任何例子。我已经阅读了苹果的编程指南,但无法弄清楚如何去做。

我正在建立与APNS反馈的连接,但我不知道如何读取数据。 我是新来的可可,所以请详细解释:)

这就是我如何连接到反馈服务器,这与发送时连接的方式相同,只是使用其他主机。

- (void)connectToFeedBackServer 
{ 
    if(self.certificate == nil) 
    { 
    return; 
} 

    NSString *feedBackHost = @"feedback.push.apple.com"; 
    const char *cHost = [feedBackHost UTF8String]; 
    NSLog(@"The size of cHost is: %lu", strlen(cHost)); 


    NSLog(@"Host is: %s", cHost); 
// Define result variable. 
OSStatus result; 

// Establish connection to server. 
PeerSpec peer; 
result = MakeServerConnection(cHost, 2196, &socket, &peer); 
    //NSLog(@"MakeServerConnection(): %d", result); 

// Create new SSL context. 
result = SSLNewContext(false, &context); //NSLog(@"SSLNewContext(): %d", result); 

// Set callback functions for SSL context. 
result = SSLSetIOFuncs(context, SocketRead, SocketWrite); 
    // NSLog(@"SSLSetIOFuncs(): %d", result); 

// Set SSL context connection. 
result = SSLSetConnection(context, socket); 
    // NSLog(@"SSLSetConnection(): %d", result); 

// Set server domain name. 
//result = SSLSetPeerDomainName(context, cHost, sizeof(cHost)); 
    NSLog(@"SSLSetPeerDomainName(): %d", result); 
    result = SSLSetPeerDomainName(context, cHost, strlen(cHost)); 


    result = SecIdentityCopyCertificate(_theIdentity, &(certificate)); 

// Set client certificate. 
CFArrayRef certificates = CFArrayCreate(NULL, (const void **)&_theIdentity, 1, NULL); 
result = SSLSetCertificate(context, certificates);// NSLog(@"SSLSetCertificate(): %d", result); 
CFRelease(certificates); 

// Perform SSL handshake. 
do 
    { 
    result = SSLHandshake(context); NSLog(@"SSLHandshake(): %d", result); 
} while(result == errSSLWouldBlock); 
} 

我怎样尝试读取数据,并保存接收的令牌数组

- (NSMutableArray *)CheckFeedBackServer 
{ 
    char feedback[38]; 
    size_t feedBackSize = sizeof(feedback); 
    size_t processed = 0; 

    NSMutableData *feedbackData = [[NSMutableData alloc]init]; 
    NSString *token = [[NSString alloc]init]; 
    NSMutableArray *tokenArray = [[NSMutableArray alloc]init]; 

    [self connectToFeedBackServer]; 
    while ([self getSSLContext]) 
    { 
     int bytesLength = SSLRead([self getSSLContext], &feedback, feedBackSize, &processed); 

     [feedbackData appendBytes:feedback length:bytesLength]; 

     while ([feedbackData length] > 38) 
     { 
      NSData *deviceToken = [NSData dataWithBytes:[feedbackData bytes] + 6 length:32]; 

      token = [self deviceTokenToString:deviceToken]; 

      [tokenArray addObject:token]; 

      [feedbackData replaceBytesInRange: NSMakeRange(0, 38) withBytes: "" length: 0]; 
     } 
    } 
    return tokenArray; 
} 

- (NSString *)deviceTokenToString: (NSData *)deviceToken; 
{ 
    NSString *tmpToken = [NSString stringWithFormat:@"%@", deviceToken]; 
    NSUInteger loc_begin = [tmpToken rangeOfString: @"<"].location+1; 
    NSUInteger loc_end = [tmpToken rangeOfString: @">"].location-1; 
    return [tmpToken substringWithRange: NSMakeRange(loc_begin, loc_end)]; 
} 
+0

你在Objective-C中做服务器编程吗?我认为这有点不寻常。你可以发布你用来连接APNS的代码来获得反馈吗? – bdesham 2013-02-28 16:29:28

+0

我已经编辑了我的问题并包含代码 – 2013-02-28 16:36:54

+0

反馈应该在服务器端在APNS中处理,而不是在您的应用程序中处理。你想实现什么? – 2013-02-28 17:08:31

回答

2

只是如果有人需要做类似我解决我的问题是这样的东西。

我用苹果ioSock类,我已经通过调用钥匙扣

首先,我连接到反馈服务器,此代码

- (void)connectToFeedBackServer 
{ 
    if(self.certificate == nil) 
    { 
    return; 
} 

    // Get the global variable feedbackHost and make it to a char 
    const char *cHost = [feedbackHost UTF8String]; 
    NSLog(@"The size of cHost is: %lu", strlen(cHost)); 

    NSLog(@"Host is: %s", cHost); 
    // Define result variable. 
    OSStatus result; 

    // Establish connection to server. 
    PeerSpec peer; 
    result = MakeServerConnection(cHost, 2196, &socket, &peer); 

    // Create new SSL context. 
    result = SSLNewContext(false, &context); 

    // Set callback functions for SSL context. 
    result = SSLSetIOFuncs(context, SocketRead, SocketWrite); 

    // Set SSL context connection. 
    result = SSLSetConnection(context, socket); 

    // Set server domain name. 
    result = SSLSetPeerDomainName(context, cHost, strlen(cHost)); 

    result = SecIdentityCopyCertificate(_theIdentity, &(certificate)); 

    // Set client certificate. 
    CFArrayRef certificates = CFArrayCreate(NULL, (const void **)&_theIdentity, 1, NULL); 
    result = SSLSetCertificate(context, certificates); 
    CFRelease(certificates); 

    do 
    { 
     result = SSLHandshake(context); NSLog(@"SSLHandshake(): %d", result); 
    } while(result == errSSLWouldBlock); 

} 

然后设置在我的代码证书我读反馈数据并将标记添加到数组中,像这样:

- (NSMutableArray *)CheckFeedBackServer 
{ 
    OSStatus result; 

    NSMutableArray *feedbackTokens = [[NSMutableArray alloc]init]; 

    // Retrieve message from SSL. 
    size_t processed = 0; 
    char buffer[38]; 
    do 
    { 
     // Fetch the next item 
     result = SSLRead(context, buffer, 38, &processed); 
     if (result) break; 

     char *b = buffer; 

     // Recover Device ID 
     NSMutableString *deviceID = [NSMutableString string]; 
     b += 6; 
     for (int i = 0; i < 32; i++) 
     { 
      [deviceID appendFormat:@"%02x", (unsigned char)b[i]]; 
     } 
     [feedbackTokens addObject:deviceID]; 

    } while (processed > 0); 

    return feedbackTokens; 
} 
相关问题