the Web Design Speciailist
Apns & GCM 統整一隻Class
2016-07-15 10:47:03  PHP

之前做APP在進行推撥時,IOS 、ANDROID 程式碼都是猜拆開進行推撥,很不方便
我把他整理統整為一隻PHP程式,呼叫此程式即可進行推撥,最下方有頁面進行觀看程式碼。

手機推撥ID    請APP設計人員進行產生
手機環境OS   為兩種 android 、ios (皆小寫)

申請資料
google gcm   api key  
apple   apns   xxx.pem   請產生 .pem 檔 (如何產生就..網路上爬文了)
                       password

以下我皆有註解,在請各位看一下了

  1. $phone_id = ""; //手機推撥ID
  2. $phone_os = ""; //android 、ios
  3. $message  = ""; //留言訊息
  4. $gcm = new ApnsGCM();
  5. $gcm->pushNotification( $phone_id ,$phone_os, $message );    
  6. //===================     GCM Apns     ===================//
  7. class ApnsGCM{
  8.    
  9.     //android
  10.     var $GOOGLE_CLOUD_MESSAGING      = "https://android.googleapis.com/gcm/send";
  11.     var $GOOGLE_API_KEY              = ""; //google api
  12.    
  13.       //ios
  14.     var $ApplePushNotificationServer = "ssl://gateway.push.apple.com:2195";
  15.     var $PEMfile                           = ""; // Apple FILE (Apns.pem)
  16.     var $PEMpassphrase               = ""; // Apple password
  17.  
  18.  
  19.     function pushNotification( $phone_id ,$phone_os, $message ){
  20.      
  21.        //-------------------------------------------------------- android
  22.        if( $phone_os == 'android' ){
  23.            
  24.             //資料定義
  25.             $device_id  = $phone_id;
  26.             $message    = $message;
  27.            
  28.             //id判斷是否為陣列如不為陣列改為陣列
  29.             if(!is_array($device_id)) {
  30.                 $device_id = array($device_id);
  31.             }
  32.            
  33.             //資料處理陣列[1]
  34.             $post_fields = array(
  35.                 "registration_ids" => $device_id,
  36.                 'data'             => array( "message" => $message )
  37.             );
  38.            
  39.             //資料處理陣列[2]
  40.             $headers = array(
  41.                 'Authorization: key='.$GOOGLE_API_KEY,
  42.                 'Content-Type: application/json'
  43.             );      
  44.    
  45.             //發送資料處理
  46.             $curl = curl_init();
  47.             curl_setopt($curl , CURLOPT_URL , $GOOGLE_API_KEY );
  48.             curl_setopt($curl , CURLOPT_POST , true );
  49.             curl_setopt($curl , CURLOPT_HTTPHEADER  ,$headers);
  50.             curl_setopt($curl , CURLOPT_RETURNTRANSFER , true );
  51.             curl_setopt($curl , CURLOPT_POSTFIELDS , json_encode( $post_fields ) );
  52.             $pushResult = curl_exec( $curl );
  53.             curl_close($curl);
  54.            
  55.            
  56.         }else
  57.         //-------------------------------------------------------- ios
  58.         if( $phone_os == 'ios' ){            
  59.            
  60.             //資料定義
  61.             $device_id  = $phone_id;
  62.             $message    = $message;
  63.                        
  64.             //連結資料
  65.             $ctx = stream_context_create();
  66.             stream_context_set_option($ctx, 'ssl', 'local_cert', $this->PEMfile);
  67.             stream_context_set_option($ctx, 'ssl', 'passphrase', $this->PEMpassphrase);
  68.            
  69.             //資料Json
  70.             $fp = stream_socket_client( $this->ApplePushNotificationServer, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
  71.             $aps_struct['aps'] = array(
  72.                 'alert' => $message,
  73.                 'badge' => 'default',
  74.                 'sound' => '0'
  75.             );
  76.             $payload = json_encode($aps_struct);
  77.            
  78.             $msg = chr(0) . pack('n', 32) . pack('H*', $device_id) . pack('n', strlen($payload)) . $payload;
  79.             $result = fwrite($fp, $msg, strlen($msg));
  80.             fclose($fp);    
  81.            
  82.         }
  83.     }  
  84. }