推送通知不起作用

问题描述:

我正在开发需要推送通知的应用程序。 我按照这个tutorial来实现推送通知与PHP。 所以我使用生产证书。 这是applicationDelegate代码:推送通知不起作用

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
    const unsigned* tokenBytes = [deviceToken bytes]; 
    NSString* tok = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x", 
           ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]), 
           ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]), 
           ntohl(tokenBytes[6]), ntohl(tokenBytes[7])]; 
    NSLog([NSString stringWithFormat:@"token 1 = %@",tok]); 
    [[NSUserDefaults standardUserDefaults] setObject:tok forKey:@"token"]; 
} 

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
} 
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    NSLog(@"Received notification: %@", userInfo); 
} 

,这是服务器端的PHP页面:当我启动的PHP页面

<?php 
    //$token = $_GET['t']; 
    $token = "xxxxxxxxxxx....xxxxxx"; 
    $who =$_GET['c']; 
    $notification = $_GET['n']; 
    $message = 'Hello'; 
    $badge = 3; 
    $sound = 'default'; 
    $payload = array(); 
    $payload['aps'] = array('alert' => $message, 'badge' => intval($badge), 'sound' => $sound); 
    $payload = json_encode($payload); 
    $apns_url = NULL;  
    $apns_cert = NULL; 
    $apns_port = 2195; 
$apns_url = 'gateway.push.apple.com'; 
$apns_cert = 'cert-prod.pem'; 

    $stream_context = stream_context_create(); 
    stream_context_set_option($stream_context, 'ssl', 'local_cert', $apns_cert); 
    $apns = stream_socket_client('ssl://' . $apns_url . ':' . $apns_port, $error, $error_string, 2, STREAM_CLIENT_CONNECT, $stream_context); 
    $device_tokens = array(); 
    $device_tokens[0] = $token; 
    foreach($device_tokens as $key=>$device_token) 
    { 
     $apns_message = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $device_token)) . chr(0) . chr(strlen($payload)) . $payload; 
     fwrite($apns, $apns_message); 
    } 
    @socket_close($apns); 
    @fclose($apns); 
?> 

没有发生..为什么?谁能帮我?

我认为你的令牌不正确。尝试:

NSString *token = [NSString stringWithCString:[deviceToken bytes]]; 
+0

这样的aÂÑ5ΔC≤¸u令牌..是正确的? – JackTurky 2011-12-30 13:31:49

+0

添加UbQNâo-ù€xxxxxaÂÑ5ΔC≤¸u到PHP代码没有任何事情发生:( – JackTurky 2011-12-30 13:33:21

+0

不看起来很好尝试:NSString *标记= [[NSString分配] initWithBytes:[deviceToken字节]长度:deviceToken.length编码:NSASCIIStringEncoding] ; – CarlJ 2011-12-30 13:45:47

这应该帮助:这样的NSLog打印的东西

NSString *deviceTokenStr = [[[[deviceToken description] 
           stringByReplacingOccurrencesOfString: @"<" withString: @""] 
           stringByReplacingOccurrencesOfString: @">" withString: @""] 
           stringByReplacingOccurrencesOfString: @" " withString: @""]; 

    NSLog(@"Device Token: %@", deviceTokenStr); 
+0

so令牌必须与任何空格或是真的?我尝试,但是当我启动php代码它不会去:(没有通知到达 – JackTurky 2011-12-30 14:50:19

+0

1.是的,没有 .so现在我可以出来它。你是APN的证书PHP代码? – CarlJ 2011-12-30 14:53:12