Parse.comのREST APIを使ったPush通知

複数のアプリに対してParse.comを介してPush通知を送りたい場合、Webインターフェースでポチポチやるのは効率が悪く、とても辛い作業になってしまいます。Parse.comのサイトはレスポンスが少し遅いなと感じる程度である上に、1回1回が退屈な作業を何度も繰り返すことになるのでミスも入り込み易いのです。当然ですが、自動化・半自動化をするのが望ましいでしょう。

複数種類のiPhoneアプリを同時開発するときのTips - 株式会社CFlatの明後日スタイルのブログ複数種類のiPhoneアプリを同時開発するときのTips - 株式会社CFlatの明後日スタイルのブログはてなブックマーク - 複数種類のiPhoneアプリを同時開発するときのTips - 株式会社CFlatの明後日スタイルのブログ

REST API用のKEY

REST APIを使うためには、アプリケーションIDとREST API用のアプリケーションキーが必要です。これらのキーを自動化スクリプトなり、専用のファイルなり、どこかに転載しておきます。

なお、iOS用のアプリケーションキーREST API用のアプリケーションキーは異なります。

Rubyクライアント

REST APIcurlのようなコマンドから呼び出すことも可能ですが(Push Developer Guide | Parse)、スクリプト言語から呼び出した方が楽だと個人的には思います。

私が常用しているRubyにはparse-ruby-clientというgemがあったのでこちらを使うことにしました。

data = { :alert => "This is a notification from Parse" } push = Parse::Push.new(data, "user_1") push.type = "ios" push.save

使い方

user_1というチャンネルに該当するiOSバイスにデータを送る、という処理を次のコードで実現できます。

require "parse-ruby-client"

Parse.init(application_id: id, application_key: key)

data = { :alert => "This is a notification from Parse" }
push = Parse::Push.new(data, "user_1")
push.type = "ios"
push.save

全デバイスに送る

先ほどの例はとあるチャンネルに該当するユーザーにのみ通知を出す方法なんですが、今回はチャンネルではなくユーザー全体を対象にしようとしていました。

そこでチャンネルを空にしてやればいいだろうとParse::Push.new(data, "")Parse::Push.new(data, nil)などを試したところ、これでは0人に対してのpush通知を発行するという意味になるらしく失敗に終わりました。

どうやらREST API本体に存在しているwhereというパラメータに空のjsonを渡せばいいということでした。このラッパーの場合はこのように書く必要があります。

require "parse-ruby-client"

Parse.init(application_id: id, application_key: key)

data = { :alert => "This is a notification from Parse" }
push = Parse::Push.new(data) 
push.where = {}
push.save

データファイルのサンプル

複数のアプリケーションにプッシュ通知を送るスクリプトですが、実際にはRakeタスクとして定義しました。前提としては、アプリケーションIDやREST用のキーはyamlファイルに書いてあります。

app1:
  parse_id: APP_ID_1
  parse_rest_key: APP_REST_KEY_1
  ...
app2:
  parse_id: APP_ID_2
  parse_rest_key: APP_REST_KEY_2
  ...
app3:
  ...

タスク本体はこんな感じです。

require "yaml"
require "parse-ruby-client"

task :push do
  config = YAML.load_file( File.expand_path("../../data.yml", __FILE__) )
  config.keys.each_with_index do |key|
    parse_id  = config[key]["parse_id"]
    rest_key = config[key]["parse_rest_key"]

    data = {
      alert: "alert title",
      message: "alert message"
    }

    # ParseのREST APIを使うコード
    Parse.init(application_id: parse_id, api_key: rest_key)
    push = Parse::Push.new(data)
    push.where = {}
    push.save
  end
end

これで半自動化できるようになりました。通知内容がハードコードされているので何回も使うのには適しません。そのような場合は通知内容の部分を分離し、引数のjsonファイルから読み込むなどの工夫が必要となります。