3

GCMをAndroidアプリに統合しました。私のアプリはGCMで3ヶ月前から公開されています。GCM(Google Cloud Messaging)は登録ユーザー全員にアクセスできない

私はGoogleの指示に従い、デバイス(Nexus HTC 9とテストした他のデバイスのデバイス)ですべて正常に動作します。

一般に、データメッセージ(「通知」キーなし)を送信し、onMessageReceivedメソッドで受信し、デバイスがデータを取得して受信データを処理するコードを実行すると、サーバーにpingを送信します例えば、通知を示します)。

アプリがフォアグラウンド、バックグラウンド、または(デバイスを再起動した後も)で閉じていても、デバイスはデータを取得します。

しかし...

毎週1〜2週間、私は私のすべてのユーザーにデータメッセージを送信するが、私はまだ存在している登録トークンのうち、そのもののためにそれに気づきましたGCMの回答から「成功」と「メッセージID」が得られました。最終的にユーザーの約50%に達するようになりました(一部の国ではさらに少なくなっています)。 例えば、これは応答である、場合:

{ "multicast_id": 108, 
    "success": 5000, 
    "failure": 300, 
    "canonical_ids": 0, 
    "results": [ 
    { "message_id": "1:08" }, 
    { "message_id": "1:09" } 
... 
.... 
.... 
... 
    ] 
} 

「成功」は5000を言いますが、onMessageReceived方法が唯一の2500人のユーザーで実行されます...私はまた、FCMを確認するための診断だった

メッセージのステータスがidsで、デバイスがメッセージを受信して​​いるようです。

GCMから提供された登録トークンを使用してユーザーが自分のサーバーに正常に登録すると、すぐに「テスト/ダミー」データが表示されますユーザーがそれを取得し、私のコードが実行されていることを確認し、私のサーバーにpingを送信する - この "ループ"は、ユーザーのほぼ100%のために働いた...

それで1-2週間後には、ユーザーは約100%から50%に低下します...?

(私は私のアプリをアンインストールしていなかったもののためにのみ話している)これは私がGcmListenerServiceの実装で使用するものです。

public class GcmMessageHandler extends GcmListenerService { 

    @Override 
    public void onMessageReceived(String from, Bundle data) { 
     ... 
     ... 
     Context context = getBaseContext(); 
     sendPingtoMyServer(context) 
    } 
} 

、これはマニフェストです:

<service 
    android:name="[MY_PACKAGE].GcmMessageHandler" 
    android:exported="false" > 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
    </intent-filter> 
</service> 

<receiver 
    android:name="com.google.android.gms.gcm.GcmReceiver" 
    android:exported="true" 
    android:permission="com.google.android.c2dm.permission.SEND" > 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     <category android:name="[MY_PACKAGE]" /> 
    </intent-filter> 
</receiver> 

ご協力いただければ幸いです。

おかげで、この私の経験で

+0

トピックメッセージングを試してみましたが、ケースも同じですか? (機能のような*配送確認*を実装せずにトピックを通して送信されたメッセージを追跡することはできませんが) –

+0

テストしませんでしたが、あなたが言ったように、それを追跡することはできません:)おそらく同じ問題。私にとって奇妙なのは、サーバーにpingしていないメッセージIDを取得し、FCM診断ツールを使用して確認すると、ツールにはIDが正常にデバイスに配信されたことが示されます。 – JohnSKat

+0

この問題の解決策を見つけましたか? –

答えて

0

、と私はそれらのAPI呼び出しであるため、問題ではないはずメッセージを送信するノード-GMCを使用しています。

私の場合、私はとにかく、次のパラメータ

var message = new gcm.Message({ 
    priority: 'high', 
    contentAvailable: true, 
    content_available: true, 
    notification: { 
     sound: true, 
     title: "StockAlert Notification", 
     icon: "ic_launcher", 
     body: notification, 
    } 
}) 

を送って、私が助けたパラメータで遊んで、同じ問題を持っていました。 何らかの理由でcontentAvailable:trueが一部の電話機で動作しましたが、content_available:trueを追加する必要がありました。

私はまだこれも検討しています

+0

私が理解しているところでは、contentAvailableはiOSデバイス専用ですが、現在はAndroidデバイスのみについて話しています。また、私は "通知"メッセージではなく "データ"メッセージを送信しています( "通知"キーなしで送信すると、onMessageReceived内のコードは通知を表示します) – JohnSKat

関連する問題