2012-05-03 19 views

Odpowiedz

2

Poniższy kod dotyczy PHP.

Nie ma takiego Kodeksu łatwo dostępnego. Możesz to zrobić tak, jak utrzymujesz 1 pole znaczników w tabeli bazy danych jak 1 na urządzeniu z iOS i 2 na urządzeniu z Androidem. Zaimplementowałem tę samą funkcjonalność, a poniżej jest kod do wysyłania powiadomień push odpowiednio.

//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; 
} 

UWAGA: Zapraszam do kontaktu w przypadku jakichkolwiek wątpliwości/zapytania. Pozostaw komentarz

+0

Dzięki za odpowiedź. Mam kilka pytań, ponieważ jestem nowy w tym. Czy są jakieś ramy wymagane do wdrożenia tego? I mogę bezpośrednio użyć swojego kodu do mojego serwisu lub powinienem dokonać zmian. – Developer

+0

Możesz bezpośrednio dodać swój kod, ale musisz zmienić zapytanie. Musisz zadeklarować kilka stałych w pliku konfiguracyjnym. Przepraszam, ale ten kod jest dla PHP. Poczekaj chwilę, a otrzymasz rozwiązanie dla .net również dla powiadomień push systemu iOS. –

+0

Sprawdź moją drugą odpowiedź dla kodu opartego na .Net dla powiadomienia Push. –

3

Użyj następującego code from github dostępnego dla powiadomienia .Net push. Musisz podać plik .p12 i musisz ustawić tryb programisty/produkcyjny zgodnie z wymaganiami.

+0

Czy tak jest? Nigdzie nie wspominam o tej zasadzie na naszej społeczności. –

+0

Możesz zainteresować się tym http://meta.stackexchange.com/questions/25209/what-is-the-official-etiquette-on-answering-a-question-twice –

+0

Patrz Jeff Atwood's (który jest Moderator) Komentarz poniżej odpowiedzi Lance'a Roberta i samej odpowiedzi Jeffa. –

Powiązane problemy