2016-04-11 1 views
5

SmoochCarnivalと統合されたアプリケーションを作成しています。どちらのライブラリも、GCMインテントサービスを定義してメッセージを受信する標準的な手法を使用して、GCMプッシュメッセージを受信します。1つのアプリケーションで2つ以上のGCMインテントサービスを使用する

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

実際には、図書館が私のbuild.gradleに記載されている順序が、そのマニフェストがアプリケーションマニフェストにどのような順序でマージされるかに影響することがわかりました。だから、もし私がスミッチを最初に置くと、それはうまくいく(しかし、カーニバルは何も受け取らない)。私がカーニバルを最初に置くと、それは機能します(しかし、スモーキは何も受け取りません)。

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

答えて

6

CarnivalとSmoochの両方で動作することができない理由は、両方のライブラリが独自のGcmListenerServiceを登録していることです。また、Androidでは、マニフェストで定義された最初のGcmListenerServiceがすべてのGCMメッセージを受け取ります。 Multiple GCM listeners using GcmListenerService

最善の解決策はただ1つのGcmListenerServiceの実装を持っている、との両方のために、このハンドルのメッセージを持っているだろう:あなたは、主にSOは、次の資料オフに基づいため

は、私は解決策を持っています。

独自のGcmListenerServiceを指定するには、Google's Cloud Messaging Documentationの指示に従ってください。

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

そうするために、キスを初期化中に、単にsetGoogleCloudMessagingAutoRegistrationEnabledを呼び出す:

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); 
    } 
} 

EDITはキスバージョン3.2.0の時点で、あなたは今より簡単onMessageReceivedにGcmService.triggerSmoochGcmを呼び出してキスの通知をトリガすることができます。

@Override 
public void onMessageReceived(String from, Bundle data) { 
    final String smoochNotification = data.getString("smoochNotification"); 

    if (smoochNotification != null && smoochNotification.equals("true")) { 
     GcmService.triggerSmoochGcm(data, this); 
    } 
} 
+0

Smoochがこれを行うことができます。残念ながら私はカーニバルはしないと確信しています。しかし、私は同じアプローチを使用し、各サービスで 'startWakefulService'を2回呼び出すことができ、私の中継インテントサービスがマニフェストの最初にリストされていることを確認する必要があります。これを試してここで更新します。 –

+0

これは機能します。両方のサービスで同じ送信者IDとAPIキーを使用しているため、GCM登録を無効にする必要はありません。また、smoochNotificationフラグを使用してメッセージを適切な場所に送信することもできます。だから、すべての良い...ありがとう! –

0

あなたはgradle依存関係として両方を使用していますか?両方のライブラリをダウンロードしてモジュールとして使用する必要があります。同じサービスを使用している可能性があります。ダウンロードした場合は、サービス名を変更して、両方のコアになる問題を解決できます。

私の推測では、アプリケーションモジュールからGCMブロードキャストレシーバーを作成する必要があります(たとえそれがlibsサービスを呼び出しても)。

+0

申し訳ありませんが、私はあなたの答えを理解していません。サービス名は問題ではありません。どちらもすでに一意の名前を持っています。私は自分自身のサービスを定義して他の2つのサービスを呼び出すことを検討しましたが、問題が抱えているようです。 –

関連する問題