我正在处理的应用程序有两个使用GCM进行推送通知的服务(Pushwoosh和Helpshift)。我试图在Pushwoosh文档中实现此处显示的功能,以允许两个系统运行; https://docs.pushwoosh.com/v1.0/docs/gcm-integration-legacy。然而,我的Android知识让我失败了,因为我实际上将收到的捆绑包路由到了相关的处理程序。该项目在Unity中很有用,但这是Android领域。
这是我创建的GcmListenerService
类,与示例非常相似;
import android.os.Bundle;
import android.content.Intent;
import android.util.Log;
import com.google.android.gms.gcm.*;
import android.content.ComponentName;
public class GCMListenerRouterService extends GcmListenerService
{
public GCMListenerRouterService()
{
super();
Log.i("Unity", "GCMListener - Constuctor");
}
private void dispatchMessage(String component, Bundle data)
{
Log.i("Unity", "GCMListener - dispatchMessage: " + (data != null ? data.toString() : "<null>") + " component: " + component);
Intent intent = new Intent();
intent.putExtras(data);
intent.setAction("com.google.android.c2dm.intent.RECEIVE");
intent.setComponent(new ComponentName(getPackageName(), component));
GcmReceiver.startWakefulService(getApplicationContext(), intent);
}
@Override
public void onMessageReceived(String from, Bundle data)
{
Log.i("Unity", "GCMListener - onMessageReceived: " + (data != null ? data.toString() : "<null>") + " from: " + from);
// Base GCM listener service removes this extra before calling onMessageReceived
// Need to set it again to pass intent to another service
//data.putString("from", from);
//if (TextUtils.equals(from, getString(R.string.PUSHWOOSH_PROJECT_ID)))
//{
// dispatchMessage(PushGcmIntentService.class.getName(), data);
//}
//else if (TextUtils.equals(from, getString(R.string.PRIVATE_PROJECT_ID)))
//{
// dispatchMessage(PrivateGCMListenerService.class.getName(), data);
//}
}
}
我能够确认推送通知来自正确的消息服务,我可以确定推送通知是来自一个插件还是另一个插件。如何将这些捆绑对象路由到正确的处理程序?我不明白以下示例代码;
if (TextUtils.equals(from, getString(R.string.PUSHWOOSH_PROJECT_ID)))
{
dispatchMessage(PushGcmIntentService.class.getName(), data);
}
else if (TextUtils.equals(from, getString(R.string.PRIVATE_PROJECT_ID)))
{
dispatchMessage(PrivateGCMListenerService.class.getName(), data);
}
我很欣赏这是示例代码,但我无法在Android文档中找到与dispatchMessage
具有相同签名的任何功能。我是否需要为所需的每种不同类型的消息提供意图服务?
我知道对于Helpshift,我需要使用签名handlePush(Context context, Bundle data)
调用一个函数,但我不确定Context
对象是什么。对于Pushwoosh,我不确定处理程序是什么。当我谈论两个特定的服务时,我假设这个设置是接收消息和处理它们的标准方法。
答案 0 :(得分:0)
事实证明,对于GCM,Bundle
个对象是您需要处理的原始推送详细信息。不需要进一步处理,并且支持GCM的插件/框架应具有处理此问题的功能,例如,对于helpshift,该函数位于com.helpshift.Core
handlePush(Context context, Bundle data)
。
请注意,GCM实际上已弃用,Firebase Cloud Messenger是未来的新系统。此服务有一种不同的处理多个推送处理程序的方法,您应该检查插件以获取相关文档。