我正在使用Google Cloud Messaging API向Android设备发送推送通知。我已经实现了IntentService
和相应的逻辑来处理来自GCM服务器的通知。问题是GCM有时需要花费十五分钟来发送消息,这使调试变得非常痛苦。
我已经搜索了如何模拟GCM,但没有找到适用于我的情况的任何解决方案。 我已经实施了第三方客户端服务器;问题是等待GCM实际将消息发送到Android设备。
Android设备上的入口点是具有挂钩方法IntentService
的{{1}}。似乎有一种可能性是编写另一个向系统发送“欺骗”意图的程序,这样系统就会加载我的handleIntent(Intent)
,其意图是行为,外观和感觉就像一个真实的GCM意图。这样,我的应用就可以即时接收消息。
有没有人遇到过这个问题,或者有任何关于如何解决它的提示?
答案 0 :(得分:2)
如果您想模拟某些内容并且您不知道如何执行此操作,请使用以下方法。
现在,类可以通过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"
}
}
我假设(但我还没有确认):
您可以将其他字段放在“数据”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());
}
}