如何模拟从Google Cloud Messaging发送的邮件?

时间:2015-04-16 00:19:10

标签: android google-app-engine google-cloud-messaging

我正在使用Google Cloud Messaging API向Android设备发送推送通知。我已经实现了IntentService和相应的逻辑来处理来自GCM服务器的通知。问题是GCM有时需要花费十五分钟来发送消息,这使调试变得非常痛苦。

我已经搜索了如何模拟GCM,但没有找到适用于我的情况的任何解决方案。 我已经实施了第三方客户端服务器;问题是等待GCM实际将消息发送到Android设备。

Android设备上的入口点是具有挂钩方法IntentService的{​​{1}}。似乎有一种可能性是编写另一个向系统发送“欺骗”意图的程序,这样系统就会加载我的handleIntent(Intent),其意图是行为,外观和感觉就像一个真实的GCM意图。这样,我的应用就可以即时接收消息。

有没有人遇到过这个问题,或者有任何关于如何解决它的提示?

2 个答案:

答案 0 :(得分:2)

如果您想模拟某些内容并且您不知道如何执行此操作,请使用以下方法。

  1. 使用您需要模拟的依赖项(intentservice)创建一个适配器类(CAdpapter)。
  2. 制作一些称为依赖的公共方法。
  3. 创建一个接口(IAdapater),并确保适配器类实现此接口(只需将您在步骤2中创建的方法放在此接口中)。
  4. 确保需要与依赖性相关的类(如说意图服务所述)不直接执行此操作,它们与IAdapter的实例进行通信。
  5. 编写一个实现IAdapter(MockAdapter)的模拟类。如果您不喜欢这样,请使用模拟框架。
  6. 现在,类可以通过adapater或模拟器与intentservice通信。一个解决方案可以是让你自己的类与你需要模拟的依赖性对话。

    嘲弄可能很难。模拟需要实现与普通类相同的接口。但是,如果这个类有一个巨大的接口或根本没有接口,那么它可能是个问题(这些只是例子)。编写自己的类来调用需要模拟的类可以是一个解决方案

答案 1 :(得分:1)

我使用Postman伪造通知。

你需要标题:

// Please note that the authorization header's KEY is actually "key=<your GCM API key>"
Authorization: key=<your GCM API key> 
Content-Type: application/json

然后发送到https://android.googleapis.com/gcm/send(这是针对Android的,我假设那里的某个地方还有iOS,现在谷歌也支持iOS设备)。

你的身体必须如下:

{       
  "registration_ids":["<Your device registration token from GCM>"],
  "data": {
    "message" : "your message here"
  }
}

我假设(但我还没有确认):

  1. 您可以在registration_ids
  2. 上执行以逗号分隔的列表
  3. 您可以将其他字段放在“数据”json中;任何可以通过Bundle传递的东西。这是基于以下事实:

    public class PushNotificationListenerService extends GcmListenerService {
       private static final String TAG = "NotificationListener";
    
       /**
        * Called when message is received.
        *
        * @param from SenderID of the sender.
        * @param data Data bundle containing message data as key/value pairs.
        *             For Set of keys use data.keySet().
        */
        // [START receive_message]
        @Override
        public void onMessageReceived(String from, Bundle data) {
           // Pay attention to this line of code; this indicates
           // that you could have ANY key-value pair passed in
           // as long as it's capable of being serialized into a Bundle object
           String message = data.getString("message");
           Log.d(TAG, "From: " + from);
           Log.d(TAG, "Message: " + message);
    
            /**
             * In some cases it may be useful to show a notification 
             * indicating to the user that a message was received.
             */
            sendNotification(message);
    
            //TODO any of your own logic to handle the notification
        }
        // [END receive_message]
    
        /**
         * Create and show a simple notification containing the received GCM        
         * message.
         *
         * @param message GCM message received.
         */
        private void sendNotification(String message) {
           Intent intent = new Intent(this, MainActivity.class);
           intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
           PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 
               /* Request code */, intent,
               PendingIntent.FLAG_ONE_SHOT);
    
           Uri defaultSoundUri =      
             RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
             NotificationCompat.Builder notificationBuilder = new  
             NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_favorite_white_shadow_36dp)
                .setContentTitle("GCM Message")
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);
    
            NotificationManager notificationManager =
               (NotificationManager)    
               getSystemService(Context.NOTIFICATION_SERVICE);
    
            notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
        }
    }