【Android】【Kotlin】【Ruby】Google Cloud Messaging(GCM)を受信する 2 (送信側)
はじめに
前回の続きです。
環境
送信側
- Windows10(64bit)
- Ruby 2.3.0
- GCM (Gem) 0.1.1
実装
送信側はRubyで実装します。
RubyにはGCMというそのものズバリなGemがあり、これを使うととてもシンプルに実装できてしまいます。
(必要なデータが理解できていれば)
当初VagrantにUbuntuを入れて...と思っていたのですが、API KeyはWindowsで取得していたので、一旦Windows環境にRubyをインストールして動作させてみることにしました。
今から思えば、Android側のAPI Keyではフィンガープリントが必要となるためWindowsでのBuildが必要ですが、サーバー側はそうではないのでVagrant側からでも送信できたのだろうなぁ、と考えています。
gcmSender.rb
ENV['SSL_CERT_FILE'] = File.expand_path('ca-bundle.crt') require 'gcm' gcm = GCM.new("取得したServer API Key") registration_ids= ["受信側のAndroidアプリを実行して取得したtoken"] option = {priority: 'high', data: {message: 'Wake up!'} } response = gcm.send_notification(registration_ids, option) # jsonをとりあえずコンソールに出力. puts response
- この中で、optionとしてPriorityをHighに設定すると受信側がDozeモード中でもほぼリアルタイムにMessageを受信させることができます。 Priorityの項目を削除、または「normal」に設定すると、Dozeモード中は受信されず、MaintenanceWindowまたは手動でDozeモードを解除した時に受信されます。
- 上記を「ruby gcmSender.rb」のように実行するとjsonが表示されますが、この中の「success」の値が1以上であれば送信成功です。
- もし「success」が0、「failure」が1のようになっている場合は、おそらく「registration_ids」にセットしているTokenが間違っているものと思います。
- gcm(Gem)のGitHubにあるような、「12」などの値を適当に入力していたため、しばらくハマりました...orz
ca-bundle
実はWindows環境で今回のようにネットワークに接続する処理を実行しようとすると、OpenSSLのエラーが発生します。
そのため以下のようなサイトからca-bundle.crtを取得して、上記コードのように「ENV['SSL_CERT_FILE'] = File.expand_path('ca-bundle.crt')」を追記する必要があります。
N
今回はAndroid6.0を対象にしており、NetworkやAlarm、JobSchedulerなどが使用できないDozeモードで叩き起こす方法を調べていました。
N ReleaseではこれまでのDozeモードに切り替わる前に、「浅い」Dozeモードと呼ばれる制限の緩いモードが追加されたようです。
浅いDozeモードであれば、WakelockやAlarmが使用できるため、これらを使って叩き起こす、ということもできそうです。
とはいえ、最終的にはこれまでと同じ「深い」Dozeモードに切り替わるため、確実にリアルタイムで実行するならGCMを使うのが良さそうですが。