Merhaba,
Bir çoğunuzun ihtiyacı olan push notification konusunda bugün bir makale yazma kararı aldım.
Hem ios hem android e notification gönderebileceğiniz bir sınıf yazdım. Kullanımı ile birlikte hızlıca ele alalım isterseniz.
Tabi herşeyden önce şunu belirtmek isterim; kullanımı hakkında daha detaylı bilgi ve kaynak kodlara Git üzerinden erişmek isterseniz: https://github.com/onurcanalp/pushNotification
Hadi başlayalım isterseniz..
<?php /** * Onur Canalp - 13 Ekim 2014 * * Mobil aygıtlara notification göndermek için.. * GMC - Google Mobile Cloud Push Notification * APN - Apple Push Notification */ class pushNotification { private $gmcApiKey = 'xxxxxxxxxxxxx'; //GOOGLE private $apnPassPhrase = 'onur12345'; //Apple private $apnPemFile = 'APNS.pem'; private $errorMessages = ""; public function __construct() { $this->apnPemFile = dirname(__FILE__).'/'.$this->apnPemFile; if (!file_exists($this->apnPemFile)) { echo "PEM Not Found! "; exit(); } } //Hazırlayalım ve gönderelim public function prepareAndSend($message = "", $devices = array()){ $data['d'] = $message['d']; $data['m'] = $message['m']; if(isset($message['i'])){ $data['i'] = $message['i']; } //ayıklayalım aygıtları ios - android foreach($devices as $key => $device){ if($device['type'] == 'ios'){ $iosIDS[] = $device['id']; } else{ $androidIDS[] = $device['id']; } } //android cihazlara gönderelim if (count($androidIDS) > 0){ $return['android'] = $this->sendGoogleCloudMessage($data, $androidIDS); } //ios cihazlara gönderelim if (count($iosIDS) > 0){ //sadece ios da badge kavramı var.. if(isset($message['badge'])){ $data['badge'] = $message['badge']; } $return['ios'] = $this->sendAPNS($data, $iosIDS); } return $return; } public function sendGoogleCloudMessage( $message, $ids ) { $url = 'https://android.googleapis.com/gcm/send'; $post = array( 'registration_ids' => $ids, 'data' => $message, ); $headers = array( 'Authorization: key=' . $this->gmcApiKey, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $post ) ); $result = curl_exec( $ch ); if ( curl_errno( $ch ) ) { $result['result'] = array('result' => false, 'hata' => 'GCM error: ' . curl_error( $ch )); } curl_close( $ch ); return json_decode($result); } public function sendAPNS($message = "", $ids = array()){ $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', $this->apnPemFile); stream_context_set_option($ctx, 'ssl', 'passphrase', $this->apnPassPhrase); // 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){ $this->errorMessages = "Failed to connect: $err $errstr" . PHP_EOL; return false; } //Body $body['aps']['alert'] = $message['m']; $body['aps']['d'] = $message['d']; if(isset($message['badge'])){ $body['aps']['badge'] = $message['badge']; } if(isset($message['i'])){ $body['aps']['i'] = $message['i']; } $apnsBodyContent = json_encode($body); $errorNum = 0; foreach($ids as $deviceToken){ $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($apnsBodyContent)) . $apnsBodyContent; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result){ $errorNum++; $errors[] = 'Message not delivered'. $deviceToken . PHP_EOL; } } // Close the connection to the server fclose($fp); if($errorNum > 0){ //detaylı bilgi istenirse $this->errorMessages = $errors; $object = new stdClass(); $object->success = 0; $object->failure = $errorNum; $object->results = $errors; } else{ $object = new stdClass(); $object->success = 1; $object->failure = 0; } return $object; } public function getAllDevices(){ global $db; $devices = $db->fetchAll("SELECT device_id, device_type FROM mobile_devices GROUP BY device_id"); foreach($devices as $device){ $ret[] = array('id' => $device['device_id'], 'type' => $device['device_type']); } unset($devices); return $ret; } }
APNS.pem dosyası dikkatinizi çekmiştir belki.. .cer formatında sertifikanız varsa ve .pem nereden çıktı diyorsanız buyrun çözümü:
http://www.onurcanalp.com/2014/12/04/linuxunix-ve-os-x-uzerinde-cer-p12-sertifikalarini-pem-yapmak/
Şimdi bu sınıfı kullanarak mesajı gönderen fonksiyonumu yazacağım..
<?php * * Push Notification * * m: mesaj * d: display(açılmasını istediğimiz ekran) * 0 - Kategoriler * 1 - Sepet * 2 - Son görüntülenen ürünler * 3 - Profil * 4 - Bilgi Merkezi * 5 - Sipariş Listesi * 6 - Hediye Çekleri * 7 - Kupon Kodları * 8 - Destek Listesi * 9 - Kampanya * 10 - Ürün * 11 - Sipariş * 12 - Destek Detayı * i: id (varsa id) * badge: ios için üstteki rakam */ function sendPushNotification($mesaj = "", $display = 0, $devices = array(), $id = 0, $badge = 0){ require("includes/class.pushNotification.php"); $pushObj = new pushNotification(); //hatalı display geldi ise default profili açtıralım $display = (int)$display; if($display > 12){ $display = 0; $id = 0; } //hatalı array(device_id - device_type) gönderildiyse tümüne gönderelim if (empty($devices) || !is_array($devices)){ $devices = $pushObj->getAllDevices(); } $parameters['m'] = $mesaj; $parameters['d'] = $display; if($id > 0){ $parameters['i'] = $id; } //parametrelere ekleyelim, sonra prepareAndSend metodunda android ise temizliyoruz. if($badge > 0){ $parameters['badge'] = $badge; } $result = $pushObj->prepareAndSend($parameters,$devices); $success = true; $failCount = 0; if(isset($result['android']) && $result['android']->failure > 0){ $success = false; $failCount += $result['android']->failure; } if(isset($result['ios']) && $result['ios']->failure > 0){ $success = false; $failCount += $result['ios']->failure; } unset($pushObj, $parameters); if($success){ //Tümü başarılı return true; } else{ //biri veya bir kaçı hatalı gitti.. Hatalı giden adeti döndürelim return $failCount; } }
Yeterli olacağını umuyorum anlamanız için, kod aralarında yorumlarda yazdım..
Kolay gelsin
Merhaba Onur Bey,
.net tarafında bu kod üzerine bilgileriniz örnek verecbileceğiniz bir paylaşımınız var mı ?
Teşekkürler
İyi Çalışmalar
Malesef.. Kolay gelsin..