Carnival と Smooch の両方でプッシュを機能させることができない理由は、両方のライブラリが独自の GcmListenerService を登録しており、Android ではマニフェストで定義された最初の GcmListenerService がすべての GCM メッセージを受信するためです。
主に次の SO 記事に基づいた解決策があります:
GcmListenerService を使用する複数の GCM リスナー
最善の解決策は、GcmListenerService 実装を 1 つだけ用意し、これで両方のメッセージを処理することです。
独自の GcmListenerService を指定するには、Google の Cloud Messaging Documentation の指示に従います。
Smooch は、独自の GCM 登録がある場合に内部 GCM 登録を無効にするために必要なツールを提供します。
これを行うには、setGoogleCloudMessagingAutoRegistrationEnabled
Smooch の初期化中に呼び出すだけです。
Settings settings = new Settings("<your_app_token>");
settings.setGoogleCloudMessagingAutoRegistrationEnabled(false);
Smooch.init(this, settings);
そして、独自ので、トークンを使用してGcmRegistrationIntentService
呼び出します。Smooch.setGoogleCloudMessagingToken(token);
それが完了すると、GCM メッセージを任意の GCM レシーバーに渡すことができます。
@Override
public void onMessageReceived(String from, Bundle data) {
final String smoochNotification = data.getString("smoochNotification");
if (smoochNotification != null && smoochNotification.equals("true")) {
data.putString("from", from);
Intent intent = new Intent();
intent.putExtras(data);
intent.setAction("com.google.android.c2dm.intent.RECEIVE");
intent.setComponent(new ComponentName(getPackageName(), "io.smooch.core.GcmService"));
GcmReceiver.startWakefulService(getApplicationContext(), intent);
}
}
編集
GcmService.triggerSmoochGcm
Smooch バージョン 3.2.0 の時点で、onMessageReceivedを呼び出すことで、Smooch の通知をより簡単にトリガーできるようになりました。
@Override
public void onMessageReceived(String from, Bundle data) {
final String smoochNotification = data.getString("smoochNotification");
if (smoochNotification != null && smoochNotification.equals("true")) {
GcmService.triggerSmoochGcm(data, this);
}
}