2015-10-29 3 views
1

Я создаю приложение, основанное на GCM. на данный момент мне удается получить уведомление, но сообщение, которое я получаю, является нулевым объектом, и я не понимаю, почему это происходит.не могу получить сообщение от GCM

это на стороне сервера ГКМ:

<?php 


class GCM { 



    function __construct() { 

     } 

     public function send_notification($registatoin_ids, $message) { 
      // include config 
      include_once 'connection.php'; 

      // Set POST variables 
      $url = 'https://android.googleapis.com/gcm/send'; 

      $fields = array(
       'registration_ids' => $registatoin_ids, 
       'data'    => array("message" => $message), 
      ); 

      $headers = array(
       'Authorization: key=' .GOOGLE_API_KEY, 
       'Content-Type: application/json' 
      ); 
      // Open connection 
      $ch = curl_init(); 

      // Set the url, number of POST vars, POST data 
      curl_setopt($ch, CURLOPT_URL, $url); 
      curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 
      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); 

      curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 

      // Execute post 
      $result = curl_exec($ch); 
      if ($result === FALSE) { 
       die('Curl failed: ' . curl_error($ch)); 
      } 

      // Close connection 
      curl_close($ch); 
      return $result; 
     } 
    } 
    ?> 

и это ГКМ на стороне клиента implementetion: GcmBroadcastReciever:

package com.example.matant.gpsportclient.GoogleCloudNotifications; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 


public class GcmBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     ComponentName comp = new ComponentName(context.getPackageName(), 
       GCMIntentService.class.getName()); 
     context.startService((intent.setComponent(comp))); 
     setResultCode(Activity.RESULT_OK); 
    } 

} 

GCMIntentService:

 package com.example.matant.gpsportclient.GoogleCloudNotifications; 


    import java.util.Timer; 
    import java.util.TimerTask; 

    import android.app.Notification; 
    import android.app.NotificationManager; 
    import android.app.PendingIntent; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.os.PowerManager; 
    import android.util.Log; 

    import com.example.matant.gpsportclient.R; 
    import com.google.android.gcm.GCMBaseIntentService; 


    public class GCMIntentService extends GCMBaseIntentService { 

     private static final String TAG = "GCM Tutorial::Service"; 

     // Use your PROJECT ID from Google API into SENDER_ID 
     public static final String SENDER_ID = "8462XXXXXX"; 

     public GCMIntentService() { 
      super(SENDER_ID); 
     } 

     @Override 
     protected void onRegistered(Context context, String registrationId) { 

      Log.i(TAG, "onRegistered: registrationId=" + registrationId); 
     } 

     @Override 
     protected void onUnregistered(Context context, String registrationId) { 

      Log.i(TAG, "onUnregistered: registrationId=" + registrationId); 
     } 

     @Override 
     protected void onMessage(Context context, Intent data) { 
      String message; 
      // Message from PHP server 
      message = data.getStringExtra("message"); 
      // Open a new activity called GCMMessageView 
      Intent intent = new Intent(this, GCMMessageView.class); 
      // Pass data to the new activity 
      intent.putExtra("message", message); 
      // Starts the activity on notification click 
      PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 
        PendingIntent.FLAG_UPDATE_CURRENT); 
      // Create the notification with a notification builder 
      Notification notification = new Notification.Builder(this) 
        .setSmallIcon(R.drawable.gpsport_logo_icon) 
        .setWhen(System.currentTimeMillis()) 
        .setContentTitle("GPSport Notification") 
        .setContentText(message).setContentIntent(pIntent) 
        .getNotification(); 
      // Remove the notification on click 
      notification.flags |= Notification.FLAG_AUTO_CANCEL; 

      NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
      manager.notify(R.string.app_name, notification); 

      { 
       // Wake Android Device when notification received 
       PowerManager pm = (PowerManager) context 
         .getSystemService(Context.POWER_SERVICE); 
       final PowerManager.WakeLock mWakelock = pm.newWakeLock(
         PowerManager.FULL_WAKE_LOCK 
           | PowerManager.ACQUIRE_CAUSES_WAKEUP, "GCM_PUSH"); 
       mWakelock.acquire(); 

       // Timer before putting Android Device to sleep mode. 
       Timer timer = new Timer(); 
       TimerTask task = new TimerTask() { 
        public void run() { 
         mWakelock.release(); 
        } 
       }; 
       timer.schedule(task, 5000); 
      } 

    } 

    @Override 
    protected void onError(Context arg0, String errorId) { 

     Log.e(TAG, "onError: errorId=" + errorId); 
    } 
} 

ответ

1

GCM возвращает данные в комплекте, Попробуйте использовать массив вместо использования сообщения v ALUE непосредственно

$data=array(); 
    $data['message']=$message; 
    $data['new_data']=$newData; 

А потом добавить передать этот массив в массив GCMfield

$fields = array(
      'registration_ids' => $gcmids, 
      'data' => $data, 
    ); 

Также убедитесь, что при вызове функции send_notification вы передаете! пустое сообщение :)

+0

что такое вар "$ NewData"? Я не понимаю, зачем мне это нужно. –

+0

Я имел в виду, что вы также можете добавить новые данные в будущем таким образом – Zohair

+0

OK Я попробую то, что вы предлагаете, и его решение проблемы, поэтому большое вам спасибо. кроме того, я просто взял следующий код: $ data = array(); $ data ['message'] = $ message; и chnage «$ fields», как вы сказали. –

Смежные вопросы