2012-05-03 10 views

Respuesta

2

El siguiente código es para PHP.

No existe tal código disponible. Puede hacerlo como mantener 1 campo de etiqueta en la tabla de la base de datos, como 1 para el dispositivo iOS y 2 para el dispositivo Android. He implementado la misma funcionalidad y abajo está el código para enviar notificación de inserción en consecuencia.

//This function determines which is the device and send notification accordingly. 
function sendPushNotificaitonToAllUser($NotificationMsg) 
{ 
    $sql = "select ID,DeviceToken,DeviceType from TblDeviceToken"; 
    $rs = mysql_query($sql); 
    $num = mysql_num_rows($rs); 

    if($num >= 1) 
    { 
     while($row = mysql_fetch_array($rs)) 
     { 
      $deviceToken = $row['DeviceToken']; 
      if($deviceToken!='' || $deviceToken!='NULL') 
      { 
       if($row['DeviceType']==1) 
        deliverApplePushNotification($deviceToken,$NotificationMsg); 
       else if($row['DeviceType']==2) 
        sendAndroidPushNotification($deviceToken,$NotificationMsg); 
      } 
     } 
    }  
} 

//APPLE PUSH NOTIFICATION DELIVERY 
function deliverApplePushNotification($deviceToken,$message) 
{ 
    //Create context 
    $ctx = stream_context_create(); 
    stream_context_set_option($ctx, 'ssl', 'local_cert', PEM_FILE_NAME); 
    stream_context_set_option($ctx, 'ssl', 'passphrase', APPLE_PEM_PASSPHRASE); 

    //Establish connection 
    $fp = stream_socket_client(APPLE_URL, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

    /* 
     if (!$fp) 
      exit("Failed to connect: $err $errstr" . PHP_EOL); 
    */ 

    $body['aps'] = array('alert' => $message, 'sound' => 'default'); // Create the payload body 
    $payload = json_encode($body); // Encode the payload as JSON 
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;// Build the binary notification 
    $result = fwrite($fp, $msg, strlen($msg));// Send it to the server 


    //If want to keep track of delivery can be done from here. 
    /*if (!$result) 
     echo '<br/>Message not delivered-->$deviceToken' . PHP_EOL; 
    else 
     echo '<br/>Message successfully delivered-->$deviceToken' . PHP_EOL;   
    */ 

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

function sendAndroidPushNotification($deviceRegistrationId,$messageText) 
{ 
    $authenticationID=googleAuthenticate(ANDROID_USERNAME,ANDROID_PASSWORD,ANDROID_SOURCE,ANDROID_SERVICE); 
    $result= sendMessageToPhone($authenticationID,$deviceRegistrationId,ANDROID_MSGTYPE,$messageText); 
} 

function googleAuthenticate($username, $password, $source="Company-AppName-Version", $service="ac2dm") 
{  
    session_start(); 
    if(isset($_SESSION['google_auth_id']) && $_SESSION['google_auth_id'] != null) 
     return $_SESSION['google_auth_id']; 

    // get an authorization token 
    $ch = curl_init(); 
    if(!ch){ 
     return false; 
    } 

    curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin"); 
    $post_fields = "accountType=" . urlencode('HOSTED_OR_GOOGLE') 
     . "&Email=" . urlencode($username) 
     . "&Passwd=" . urlencode($password) 
     . "&source=" . urlencode($source) 
     . "&service=" . urlencode($service); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);  
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    // for debugging the request 
    //curl_setopt($ch, CURLINFO_HEADER_OUT, true); // for debugging the request 

    $response = curl_exec($ch); 

    //var_dump(curl_getinfo($ch)); //for debugging the request 
    //var_dump($response); 

    curl_close($ch); 

    if (strpos($response, '200 OK') === false) { 
     return false; 
    } 

    // find the auth code 
    preg_match("/(Auth=)([\w|-]+)/", $response, $matches); 

    if (!$matches[2]) { 
     return false; 
    } 

    $_SESSION['google_auth_id'] = $matches[2]; 
    return $matches[2]; 
} 

function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText) 
{ 
    $headers = array('Authorization: GoogleLogin auth=' . $authCode); 
    $data = array(
          'registration_id' => $deviceRegistrationId, 
          'collapse_key' => $msgType, 
          'data.message' => $messageText //TODO Add more params with just simple data instead   
         ); 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send"); 
    if ($headers) 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 

    $response = curl_exec($ch); 

    curl_close($ch); 

    return $response; 
} 

NOTA: No dude en ponerse en contacto en caso de cualquier duda/consulta. Deje el comentario

+0

Gracias por responder. Tengo algunas preguntas, ya que soy nuevo en esto. ¿Hay algún marco requerido para implementar esto? ¿Y puedo usar directamente su código en mi servicio web o debo hacer cambios para eso? – Developer

+0

Puede agregar directamente su código pero necesita hacer cambios en la consulta de selección. Debe declarar algunas constantes en su archivo de configuración. Lo disculpo, pero este código es para PHP. Espere mientras que le dará la solución para .NET también para la notificación de inserción de iOS. –

+0

Verifique mi otra respuesta para el código basado en .Net para notificaciones automáticas. –

3

Utilice el siguiente code from github disponible para la notificación .Net push. Debe proporcionar el archivo .p12 y debe establecer el modo de desarrollador/producción de acuerdo con sus requisitos.

+0

¿Es así? No encuentro tal regla en ningún lado mencionada en nuestra comunidad. –

+0

Puede estar interesado en consultar esto http://meta.stackexchange.com/questions/25209/what-is-the-official-etiquette-on-answering-a-question-twice –

+0

Consulte Jeff Atwood (que es un Moderador) Comentario debajo de la respuesta de Lance Robert y la respuesta de Jeff misma lo explica. –

Cuestiones relacionadas