FJCT_ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

プッシュ通知をお知らせ一覧に利用する(条件配信におけるデータ保存編)

f:id:mbaasdevrel:20200408172245p:plain

プッシュ通知をアプリ内でお知らせ一覧として利用する試みです。それによってデータストアでわざわざお知らせ用のクラスを作成、管理しなくてもよくなるでしょう。

今回はプッシュ通知時に配信先を条件指定して送っている場合における、データ保存法を紹介します。

条件配信とは

プッシュ通知は大きく分けて3つの配信方法があるといえます。

  • 全体配信
  • 条件配信
  • 個別配信

f:id:mbaasdevrel:20200408172220p:plain

全体配信とは、登録されているデバイストークン全体に対して配信するものです。条件を指定しない分、シンプルな管理が可能ですが、セグメント化されていない分、役立たない内容の配信も行われてしまうことも多くなります。そのため開封率はそれほど高くないでしょう。

f:id:mbaasdevrel:20200408172245p:plain

条件配信はデバイストークンに条件を指定しておいて、絞り込み条件として使うものです。例えば性別、年齢層、興味のある情報、居住地域などです。配信条件を絞り込む分、より確度の高い配信が可能になります。利用者にとってもマッチした情報が配信される傾向にあるので、開封率も高くなります。

f:id:mbaasdevrel:20200408172252p:plain

個別配信はよりセグメントを細かくした配信方法です。また、チャットアプリなどで個人宛にメッセージが来た際のプッシュ通知としても使われます。mBaaSの管理画面では配信したプッシュ通知ごとに開封率を取っているため、表示は若干煩雑になりがちです。

今回はこの中の2つ目、条件配信について考えます。

条件配信の特徴

条件配信は配信端末の絞り込みを指定します。例えばアプリのバージョンやカテゴリなどが指定できます。installationsクラスは自由に項目が追加できますので、ユーザが選んだ興味ある情報であったり、年齢層、位置情報などに基づいてターゲットを絞り込むことが可能です。installationsクラスに1万件データがあったとして、実際に配信されるのは1,000件だったり、5,000件だったりします。

データの保存について

今回はJavaScript SDKでの実装例を紹介します。スクリプト機能を使えばサーバレスでも実装可能です。まずNCMBを初期化します。

const NCMB = require('NCMB');
const applicationKey = '70d...934';
const clientKey = '4d0...dff';
const ncmb = new NCMB(applicationKey, clientKey);

次に配信したプッシュ通知を取得します。配信した直後に実行することを想定し、最新の1件をターゲットとします。

const push = await ncmb.Push.order('createDate', true).fetch();

そして配信対象になったデバイストークンを取得します。 push.searchCondition はプッシュ通知を配信する対象を絞り込んだ時の検索条件が入っています。そして push.target はiOSとAndroidの指定が入っています。この2つが配信対象の絞り込みに使われています。取得する件数は最大の1,000件としていますが、もっとある場合には繰り返し取得が必要です。

const where = push.searchCondition;
const targets = push.target;
const installations = await ncmb.Installation
  .where(where)
  .limit(1000)
  .in('deviceType', targets)
  .fetchAll();

取得したデバイストークン一覧に対して、プッシュ通知を結びつけていきます。この時、プッシュ通知は今後も増えていくデータになりますのでリレーションを使いたいところなのですが、プッシュ通知のクラスはリレーションが使えないようです。そのため、 pushes というカラムに対してプッシュ通知のobjectIdを追加していく形にしています。

for (let installation of installations) {
  if (!installation.pushes) {
    installation.set('pushes', [push.objectId]);
  } else {
    installation.add(push.objectId);
  }
  await installation.update();
}

これでデバイストークンと配信したプッシュ通知の紐付けが完了です。

データの取り出し方

次にデータの取り出し方の解説です。各スマートフォンでは自分のデバイストークンは分かっていることとします。そのデバイストークンを使えば自分のinstallationは簡単に取得できます。

const installation = await ncmb.Installation.equalTo('deviceToken', 'eBI...cft').fetch();

この installationのpushesカラムにプッシュ通知のオブジェクトIDが入っていますので、検索をします。配列になるのでinを使います。

const pushes = await ncmb.Push.in('objectId', installation.pushes).fetchAll();

これで受信したプッシュ通知の一覧が得られました。後はこのプッシュ通知一覧を表示してあげればいいだけです。

まとめ

条件配信で行う際には、配信したであろうプッシュ通知とデバイストークンを紐付けて残しておく必要があります。今回の実装を参考にお知らせ一覧機能を実装してみてください。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。