结合ios(推送通知)和android(GCM)API(webservice)进行通知

我是一个Android开发人员,所以我不太了解PHP。

我们正在开发Android和IOS的考试纸应用程序。 并创build通知function完美的作品。 但问题是IOS使用推送通知和Android使用GCM。 而这两个是使用不同的api。

我的问题是如何结合这两个API。 我想将这两个API(web服务)合并为一个。 当pipe理员上传文件,然后所有用户通知使用通知天气它是Android或IOS设备。

我该怎么办? 非常感谢提前帮助。 我正在使用这个链接

这是我的努力

Android API

<?php require_once('connect.php'); // API access key from Google API's Console define( 'API_ACCESS_KEY', 'AIzaSyBWcc6ONXvNEHECxzLwFDSDCTKDTjEhfT8' ); //$registrationIds = array( $_GET['id'] ); $conn = new mysqli('host name', 'server name', 'password', 'database name'); $select_qury = "SELECT gcm_registration_id FROM gtu_registration"; $result = $conn->query($select_qury); $registrationIds = array(); while($row = $result->fetch_assoc()){ array_push($registrationIds, $row['gcm_registration_id']); } // prep the bundle $msg = array ( 'message' => 'here is a message. message', 'title' => 'This is a title. title', 'subtitle' => 'This is a subtitle. subtitle', 'tickerText'=> 'Ticker text here...Ticker text here...Ticker text here', 'vibrate' => 1, 'sound' => 1, 'largeIcon' => 'large_icon', 'smallIcon' => 'small_icon' ); //Creating a new array fileds and adding the msg array and registration token array here $fields = array ( 'registration_ids' => $registrationIds, 'data' => $msg ); //Adding the api key in one more array header $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' ); curl_setopt( $ch,CURLOPT_POST, true ); curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers ); curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false ); curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) ); $result = curl_exec($ch ); curl_close( $ch ); //Decoding json from result $res = json_decode($result); $flag = $res->success; //if success is 1 means message is sent if($flag == 1){ //Redirecting back to our form with a request success header('Location: index.php?success'); }else{ //Redirecting back to our form with a request failure header('Location: index.php?failure'); } echo $result; 

IOS API

 <?php $token ='f1088d1c0603218b31b5a26210c4b0e60e4884225235c7f5c2e55c47b937a03d'; $deviceToken = $token; // token dell'iPhone a cui inviare la notifica // Passphrase for the private key (ck.pem file) $pass = "mac12345"; // Get the parameters from http get or from command line $message = 'Notification text'; $badge = 1; $sound = 'default'; // Construct the notification payload $body = array(); $body['aps'] = array('alert' => $message); if ($badge) $body['aps']['badge'] = $badge; if ($sound) $body['aps']['sound'] = $sound; / End of Configurable Items / $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl','local_cert', 'Gtuck.pem'); // assume the private key passphase was removed. stream_context_set_option($ctx, 'ssl', 'passphrase', $pass); $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 120, STREAM_CLIENT_CONNECT, $ctx); $payload = json_encode($body); $msg = chr(0).pack('n',32).pack('H*', str_replace(' ', '', $deviceToken)).pack('n',strlen($payload)).$payload; print "" . $payload . "\n"; fwrite($fp, $msg); fclose($fp); ?> 

有没有可能? 如果有任何build议或其他方式来完成这个请告诉我。

下面的代码是由我使用,你可以改变你的方式

根据设备Os

 if($gcm_id_array['os'] == 'android') { $v[$index] = scs_single_gcm($gcm_id_array['gcm_id'],$message); $index++; }else{ $v[$index] = scs_single_gcm_ios($gcm_id_array['gcm_id'],$message); $index++; } 

ios的functionscs_single_gcm_ios

 function scs_single_gcm_ios($regids,$message) { try{ $deviceToken = $regids; $passphrase = 'Kookdokoo'; $title = $message['title']; $id = $message['noti_id']; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); $fp = stream_socket_client( 'ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); $body['aps'] = array( 'alert' => $title, 'sound' => 'default', 'id' =>$id ); // Encode the payload as JSON $payload = json_encode($body); // 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) $result = 0; else $result = 1; // Close the connection to the server fclose($fp); return $result; } catch(Exception $e){ $e->getMessage(); } } 

对于android

 function scs_single_gcm($regids,$message) { if(is_array($regids)){ $fields = array( 'registration_ids' => $regids, 'data' => array( "data" => $message ), ); }else { $fields = array( 'registration_ids' => array($regids), 'data' => array( "data" => $message ), ); } // Open connection $ch = curl_init(); if (FALSE === $ch) throw new Exception('failed to initialize'); // Set the url, number of POST vars, POST data curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSLVERSION, 3); curl_setopt( $ch, CURLOPT_URL,url ); curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_HTTPHEADER,array(key,content_type)); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) ); // Execute post $result = curl_exec($ch); /* if (FALSE === $result) echo curl_error($ch).curl_errno($ch); // Close connection curl_close($ch); if (curl_errno( $ch ) ){ 'GCM error: ' . curl_error( $ch ); } */ $result = json_decode($result); $notification = 1; if($result->success){ $nm = 'push notification success'; $p = 1; }else{ if($result->results[0]->error == "NotRegistered") { $nm = 'push notification success'; $p = 1; }else{ $nm = 'push notification failed'; $p = 0; } } 

我看到这里没有问题。 您需要devise一种推送令牌存储。 这个存储的每个logging将包含关于用户设备的信息:push_token(如果它是Android设备,则为gcm_registration_id),平台types(iOS / android),如果您有某个帐户系统,则可能是user_id。 当你获取这个表时,你会调用相关的函数(根据平台属性的值,将它们命名为send_ios_push($token, $msg)send_android_push($reg_id, $msg) )。

  //ios push notification script // database query if(yourdevice == 'ios') { $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer'); 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; // Create the payload body $body['aps'] = array( 'alert' => $message, 'sound' => 'incoming123.wav' ); // Encode the payload as JSON $payload = json_encode($body); // 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); } else { //Android Notification define( 'API_ACCESS_KEY', 'AIzaSyBWcc6ONXvNEHECxzLwFDSDCTKDTjEhfT8' ); //$registrationIds = array( $_GET['id'] ); $conn = new mysqli('host name', 'server name', 'password', 'database name'); $select_qury = "SELECT gcm_registration_id FROM gtu_registration"; $result = $conn->query($select_qury); $registrationIds = array(); while($row = $result->fetch_assoc()){ array_push($registrationIds, $row['gcm_registration_id']); } // prep the bundle $msg = array ( 'message' => 'here is a message. message', 'title' => 'This is a title. title', 'subtitle' => 'This is a subtitle. subtitle', 'tickerText'=> 'Ticker text here...Ticker text here...Ticker text here', 'vibrate' => 1, 'sound' => 1, 'largeIcon' => 'large_icon', 'smallIcon' => 'small_icon' ); //Creating a new array fileds and adding the msg array and registration token array here $fields = array ( 'registration_ids' => $registrationIds, 'data' => $msg ); //Adding the api key in one more array header $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' ); curl_setopt( $ch,CURLOPT_POST, true ); curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers ); curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false ); curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) ); $result = curl_exec($ch ); curl_close( $ch ); //Decoding json from result $res = json_decode($result); $flag = $res->success; //if success is 1 means message is sent if($flag == 1){ //Redirecting back to our form with a request success header('Location: index.php?success'); }else{ //Redirecting back to our form with a request failure header('Location: index.php?failure'); } echo $result; } 

我在github中find了解决scheme,它适用于AndroidIOSWindows
感谢joashp。

使用这两个文件。

test.php的

 <?php include_once('connect.php'); require_once('notification.php'); $device_type = $_GET['device_type']; $sql = "SELECT gcm_registration_id from gtu_registration where device_type = 'Android'"; $result = mysqli_query($con, $sql); while($row = mysqli_fetch_array($result)) { // $output[] = $row; // $message = $row['message']; $gcm_registration = $row['gcm_registration_id']; // print(json_encode($gcm_registration)); //print(json_encode($gcm_registration)); } $sql = "SELECT title ,message from gtu_message"; $result = mysqli_query($con, $sql); while($row = mysqli_fetch_array($result)) { // $output[] = $row; $title = $row['title']; $message = $row['message']; // print(json_encode($gcm_registration)); //print(json_encode($gcm_registration)); } $msg_payload = array ( 'mtitle' => $title, 'mdesc' => $message, ); PushNotifications::android($msg_payload, $gcm_registration); //echo 'Success'; if(!$gcm_registration) { echo 'Failure'; }else { echo 'Android Success'; } $query = "select * from gtu_registration where device_type = 'IOS'"; $results = mysqli_query($con, $query); while($rows = mysqli_fetch_array($results)) { $gcm_registrations = $rows['gcm_registration_id']; } $sql = "SELECT title ,message from gtu_message"; $result = mysqli_query($con, $sql); while($row = mysqli_fetch_array($result)) { // $output[] = $row; // $message = $row['message']; $message = $row['message']; $title = $row['title']; // print(json_encode($gcm_registration)); //print(json_encode($gcm_registration)); } $msg_payload = array ( 'mtitle' => $title, 'mdesc' => $message, ); PushNotifications::iOS($msg_payload, $gcm_registrations); if(!$gcm_registrations) { echo 'Failure'; } else { echo 'IOS Success'; } ?> 

notification.php

 <?php // Server file class PushNotifications { // (Android)API access key from Google API's Console. private static $API_ACCESS_KEY = 'AIzaSyBWcc6ONXvNEHECxzLwFDSDCTKDTjEhfT8'; // (iOS) Private key's passphrase. private static $passphrase = 'mac12345'; // (Windows Phone 8) The name of our push channel. // Change the above three vriables as per your app. public function __construct() { exit('Init function is not allowed'); } // Sends Push notification for Android users public function android($data, $reg_id) { $url = 'https://android.googleapis.com/gcm/send'; $message = array( 'title' => $data['mtitle'], 'message' => $data['mdesc'], 'subtitle' => '', 'tickerText' => '', 'msgcnt' => 1, 'vibrate' => 1 ); $headers = array( 'Authorization: key=' .self::$API_ACCESS_KEY, 'Content-Type: application/json' ); $fields = array( 'registration_ids' => array($reg_id), 'data' => $message, ); self::useCurl($url, $headers, json_encode($fields)); } // Sends Push's toast notification for Windows Phone 8 users public function WP($data, $uri) { $delay = 2; $msg = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" . "<wp:Notification xmlns:wp=\"WPNotification\">" . "<wp:Toast>" . "<wp:Text1>".htmlspecialchars($data['mtitle'])."</wp:Text1>" . "<wp:Text2>".htmlspecialchars($data['mdesc'])."</wp:Text2>" . "</wp:Toast>" . "</wp:Notification>"; $sendedheaders = array( 'Content-Type: text/xml', 'Accept: application/*', 'X-WindowsPhone-Target: toast', "X-NotificationClass: $delay" ); $response = $this->useCurl($uri, $sendedheaders, $msg); $result = array(); foreach(explode("\n", $response) as $line) { $tab = explode(":", $line, 2); if (count($tab) == 2) $result[$tab[0]] = trim($tab[1]); } return $result; } // Sends Push notification for iOS users public function iOS($data, $devicetoken) { $deviceToken = $devicetoken; $ctx = stream_context_create(); // ck.pem is your certificate file stream_context_set_option($ctx, 'ssl', 'local_cert', 'Gtuck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', self::$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); // Create the payload body $body['aps'] = array( 'alert' => array( 'title' => $data['mtitle'], 'body' => $data['mdesc'], ), 'sound' => 'default' ); // Encode the payload as JSON $payload = json_encode($body); // 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)); // Close the connection to the server fclose($fp); if (!$result) return 'Message not delivered' . PHP_EOL; else return 'Message successfully delivered' . PHP_EOL; } private function useCurl( $url, $headers, $fields = null) { // Open connection $ch = curl_init(); if ($url) { // Set the url, number of POST vars, POST data curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Disabling SSL Certificate support temporarly curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); if ($fields) { curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); } // Execute post $result = curl_exec($ch); if ($result === FALSE) { die('Curl failed: ' . curl_error($ch)); } // Close connection curl_close($ch); return $result; } } // Curl } ?> 

而且它是完美的工作。 只是使用你的数据库。