2012-07-03 291 views
3

我是一名php开发人员。我正在为iPhone实施推送通知模块。为此,我使用PHP进行服务器端实现。虽然我正在连接到APNS {“aps”:{“alert”:“HI Push”,“badge”:1,“sound”:“default”}}消息已成功传递“消息,iPhone未收到任何通知。我的PHP代码如下:?推送通知未在iPhone中收到

<? php 
    include('include/connect.php'); 
    $device = mysql_query("SELECT device_token,badge,alert,sound FROM push_notification WHERE device_status='1' "); 
    while($res = mysql_fetch_array($device)){ 
    // Put your device token here (without spaces): 
    $deviceToken = $res['device_token']; 
    // Put your private key's passphrase here: 
    $passphrase = "pushchat"; 
    // Put your alert message here: 
    //$message = trim($_REQUEST['alert']); 
    $message = "HI Push" ; 
//////////////////////////////////////////////////////////////////////////////// 
    $ctx = stream_context_create(); 
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); 
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 
    // Open a connection to the APNS server 
    $fp = stream_socket_client(
     'ssl://gateway.sandbox.push.apple.com:2195', $err,$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);    
    if (!$fp) 
     exit("Failed to connect: $err $errstr" . PHP_EOL);   echo 'Connected to APNS' . PHP_EOL;   
     $body['aps'] = array('alert' => $message,'badge' => 1,'sound' => 'default');  // Encode the payload as JSON 
    $payload = json_encode($body); 
    echo $payload; 
    // Build the binary notification 
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 

    // Send it to the server 
    $result = fwrite($fp, $msg, strlen($msg)); 

    if (!$result) 
     echo 'Message not delivered' . PHP_EOL; 
    else 
     echo 'Message successfully delivered' . PHP_EOL; 

    // Close the connection to the server 
     fclose($fp); 
} 

>

目标C代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 

    // Register for Push Notification Type  

    deviceTokenString=[[NSString alloc]init]; 


    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound) ]; 

    /*---------------Increasing Badge No-----------*/ 

    application.applicationIconBadgeNumber=0; 


} 

#pragma mark- 
#pragma mark PushNotification Delegate methods 
/*------ Provide a user explanation for a place to get Device Token-------*/ 
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
{ 
    /*---------Get The Device Token here--------------*/ 




    deviceTokenString = [deviceToken description]; 
    deviceTokenString = [deviceTokenString stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; 
    deviceTokenString = [deviceTokenString stringByReplacingOccurrencesOfString:@" " withString:@""]; 






} 



    /*------ Provide a user explanation for when the registration fails-------*/ 
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 
{ 

    NSLog(@"Error in registration. Error: %@", error); 

} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 

    NSLog(@"Received Notification"); 

    NSLog(@"remote notification: %@",[userInfo description]); 
    NSDictionary *apsInfo = [userInfo objectForKey:@"aps"]; 

    NSString *alert = [apsInfo objectForKey:@"alert"]; 
    NSLog(@"Received Push Alert: %@", alert); 

    NSString *sound = [apsInfo objectForKey:@"sound"]; 
    NSLog(@"Received Push Sound: %@", sound); 

    NSString *badge = [apsInfo objectForKey:@"badge"]; 
    NSLog(@"Received Push Badge: %@", badge); 

    application.applicationIconBadgeNumber = [[apsInfo objectForKey:@"badge"] integerValue]; 


} 
+0

您是否拥有正确的证书组合 - 使用测试证书和开发人员证书的沙箱服务器构建应用程序? –

回答

2

请检查是否匹配的证书。例如。如果iphone处于调试模式,服务器也使用开发人员证书进行推送通知,并且如果iPhone在发行版中生成,则服务器使用生产证书发送推送通知。请验证您的证书是否匹配。同时检查iPhone设置是否为您的应用启用了通知。

+0

非常感谢,它与开发人员证书正常工作。 – Bappa

+0

但是在生产证书中,我无法获取设备令牌。我们的服务器是否需要更改?请帮帮我。 – Bappa

+1

在使用生产证书时,您不能使用沙箱发送推送通知。必须使用直接apns服务器url发送推送通知。 –