5

SmoochCarnivalを統合するアプリケーションを作成しています。これらのライブラリは両方とも、メッセージを受信するために GCM インテント サービスを定義する標準的なアプローチを使用して、GCM プッシュ メッセージを受信します。

Smooch だけを使用すると、すべてがうまく機能します。カーニバルだけを使用すると、すべてがうまく機能します。両方を使おうとすると問題が発生します。私が見つけたのは、GCM レシーバーは、インテントを定義するマニフェストにリストされている最初のサービスを単純​​に開始するということcom.google.android.c2dm.intent.RECEIVEです。

実際、ライブラリがリストされているbuild.gradle順序は、マニフェストがアプリケーションマニフェストにマージされる順序に影響することがわかりました。したがって、smooch を最初に配置すると、機能します (ただし、Carnival は何も受け取りません)。Carnival を最初に設定すると、うまくいきます (ただし、Smooch は何も受け取りません)。

どちらも制御できない場合、複数の GCM インテント サービスを処理するにはどうすればよいですか? 一般に、アプリケーションは複数の GCM インテント サービスをどのように定義および管理する必要がありますか?

4

2 に答える 2

6

Carnival と Smooch の両方でプッシュを機能させることができない理由は、両方のライブラリが独自の GcmListenerService を登録しており、Android ではマニフェストで定義された最初の GcmListenerService がすべての GCM メッセージを受信するためです。

主に次の SO 記事に基づいた解決策があります: GcmListenerService を使用する複数の GCM リスナー

最善の解決策は、GcmListenerService 実装を 1 つだけ用意し、これで両方のメッセージを処理することです。

独自の GcmListenerService を指定するには、Google の Cloud Messaging Documentation の指示に従います。

Smooch は、独自の GCM 登録がある場合に内部 GCM 登録を無効にするために必要なツールを提供します。

これを行うには、setGoogleCloudMessagingAutoRegistrationEnabledSmooch の初期化中に呼び出すだけです。

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.triggerSmoochGcmSmooch バージョン 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);
    }
}
于 2016-04-11T14:12:25.363 に答える
0

両方をgradleの依存関係として使用していますか? 両方のライブラリをダウンロードしてモジュールとして使用する必要があります。おそらく同じサービスを使用しています。ダウンロードすると、サービス名を変更して、両方に関連する問題を解決できます。

私の推測では、アプリ モジュールから GCM ブロードキャスト レシーバーを作成する必要があると思います (libs サービスを呼び出す場合でも)。

于 2016-04-11T00:45:15.777 に答える