3

ユースケース: Android デバイスが Ruby On Rails サーバーに直接接続できず (ファイアウォールの背後にある)、リクエストを直接受信するためのインターネット サーバーを使用できません。Android デバイスからメッセージを取得するには内部 Rails サーバーが必要であり、プーリング戦略の代わりに、GCM + XMPP が完全に適合することがわかりました。

しかし、Ruby/Rails でそのようなシナリオをコーディングする方法に関する情報は見つかりませんでした。

Ruby On Rails サーバーからプッシュ通知を送信するだけでなく、Ruby On Rails サーバーを Google CCS サーバーに接続している GCM (Google Cloud Messaging)からアップストリーム メッセージを受信するにはどうすればよいですか?

  • アップストリームの場合、メッセージは Android デバイスから発信されますが、それは質問の範囲ではありません
  • そのためには XMPP を使用する必要があることはわかっています。
  • RailsサーバーからAndroidデバイスにプッシュ通知を送信するためのRuby gemがあることは知っていますが、それらはすべてHTTPベースであり(少なくとも、私が見たものはすべて)、必要なことを行うことができません
  • アップストリーム メッセージを受信するために、Rails サーバーは Google の CCS サーバー (GCM Cloud Connection Server) への接続 (XMPP) を開いたままにしておくことを知っています。
  • XMPP4r gem は知っていますが、Rails と統合するのに十分なコード例が見つかりません

どんな助けでも大歓迎です。


ログ(または私がこれまでに行ったこと...)

  • 17/12/15:この投稿を出発点として使用しようとしています。Google コンソールでプロジェクトを作成し、サーバー API キーを追加し、API も有効にしましGoogle Cloud Messaging for Androidた。このコード(このブログ投稿に基づく) でテストしましたが、これまでのところ、エラーなしで実行されます。

    require 'stella_gcm_xmpp'
    id = '[project_number]@gcm.googleapis.com'
    password = [API_KEY]
    
    gcm = StellaGcmXmpp.new(id, password, true, true)
    gcm.connect
    gcm.callback
    


アップストリーム メッセージ テスト

クライアント側(完全を期すために、質問の範囲外):

$ ionic start gcm-test
$ ionic platform add android
$ ionic plugin install cordova-plugin-chrome-apps-gcm 
$ ionic run android

open Chrome-Dev-Tools console:

   > chrome.gcm.register( ['2195xxxxx718'], function(regId) { console.log('regId:' + regId); } )
   > regId:APA91bG_5QIpVrBvuooVp7xO...KiVt3ozcf2HKIkHq_42UAPAU4w
   > chrome.gcm.send( {destinationId: '2195xxxxx718@gcm.googleapis.com', messageId: '111', timeToLive: 10, data: {my: 'my message'} }, function(messageId) { console.log(messageId); } )
   > 8

サーバ側

Ruby (irb) コンソールでアップストリーム メッセージの受信を確認します。

D, [2015-12-18T10:09:05.664007 #4019] DEBUG -- : RECEIVED:
    <message from='devices@gcm.googleapis.com' to='2195xxxxx718@gcm.googleapis.com' type='normal'><gcm xmlns='google:mobile:data'>{"data":{"my":"my message"},"time_to_live":86400,"from":"APA91bG_5QIpVrBvuooVp7xOos_EYzA4XNH0CeGzVudbJXxW4avE4NpZO84Q3mC2I-FKAGMTfFdGumSGmkUYViZVwp5gbbC38NDS4GWyaIsABJfhZd3J5KMJBLKgah6lC4LwkbLHKiVt3ozcf2HKIkHq_42UAPAU4w","message_id":"8","category":"com.ionicframework.gcmtest908063"}</gcm></message>
D, [2015-12-18T10:09:05.665623 #4019] DEBUG -- : PROCESSING:
    <message from='devices@gcm.googleapis.com' to='2195xxxxx718@gcm.googleapis.com' type='normal' xmlns='jabber:client'><gcm xmlns='google:mobile:data'>{"data":{"my":"my message"},"time_to_live":86400,"from":"APA91bG_5QIpVrBvuooVp7xOos_EYzA4XNH0CeGzVudbJXxW4avE4NpZO84Q3mC2I-FKAGMTfFdGumSGmkUYViZVwp5gbbC38NDS4GWyaIsABJfhZd3J5KMJBLKgah6lC4LwkbLHKiVt3ozcf2HKIkHq_42UAPAU4w","message_id":"8","category":"com.ionicframework.gcmtest908063"}</gcm></message> (Jabber::Message)
D, [2015-12-18T10:09:05.665760 #4019] DEBUG -- : TRYING stanzacbs...
D, [2015-12-18T10:09:05.665859 #4019] DEBUG -- : TRYING message/iq/presence/cbs...
[2015-12-18 10:09:05] GCM send Failed id: 8 error: 

     *The 'GCM send Failed id: 8 error:' occurs not because of an error, but because message-type is empty*

ダウンストリーム メッセージ テスト(完全を期すため、質問の範囲外)

クライアント側

chrome.gcm.onMessage.addListener(function(msg) { console.log('msg: ' + JSON.stringify(msg)) } )

サーバ側

gcm.send 'APA91bG_5QIpVrBvuooVp7x...kHq_42UAPAU4w', '999', { msg: 'teste' }

クライアント側

msg: {"data":{"msg":"teste"}}

4

1 に答える 1

0

CCS (GCM の XMPP サーバー) は、Android クライアントと Ruby サーバーの間に位置します。ruby サーバーが CCS への XMPP 接続を確立できるようになると、クライアントからサーバーへ、またはその逆にメッセージを配信するために特別なことを行う必要はありません。ruby サーバーは、CCS とのメッセージの送受信を担当します。

于 2015-12-16T16:28:12.747 に答える