vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

【Android】【Kotlin】【Ruby】Google Cloud Messaging(GCM)を受信する 2 (送信側)

はじめに

前回の続きです。

環境

送信側

  • Windows10(64bit)
  • Ruby 2.3.0
  • GCM (Gem) 0.1.1

実装

送信側はRubyで実装します。

RubyにはGCMというそのものズバリなGemがあり、これを使うととてもシンプルに実装できてしまいます。
(必要なデータが理解できていれば)

当初VagrantUbuntuを入れて...と思っていたのですが、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を使うのが良さそうですが。

参考

GCM(Ruby)

N Release