クラウドインテグレーションサービス「雲斗」のブログ

芝公園にある創研情報株式会社がAWS を 中心にクラウドの基本から便利な使いかたまでをお伝えしていきます。

Amazon SNS

Cordovaを利用したPush通知の実装

2017/04/21

【Push通知とは?】

ユーザーがアプリを起動していなくとも、
スマホへ通知を送る仕組みのことです。
メールアプリならメールの受信、ゲームアプリならイベント情報などが
送られてくるサービスのことです。

【Amazon SNSとは?】

「Amazon Simple Notification Service」
iOSやAndroidのPush通知の他、同じAWSのAmazon SQSへ通知を飛ばす事もできます。
他にもSMSやEメールによる通知にも対応しています。

【Amazon SNSのメリット】

価格が安い
モバイルプッシュ通知の料金は、100万件あたり0.5ドルです。(2015年12月7日時点)
また、従量課金制のため、一切使わなければ費用はゼロ、
配信数の上限に困ることもありません。
Amazon SNS料金

無効な配信先を自動判定
Amazon SNSはPush通知を配信するとき、配信できなかった配信先には
次回送信しないように、自動で設定します。
これにより、配信数を抑える効果もあり、価格面でもメリットとなります。

その他、速度面・AWSの他のサービスとの連携などにおいてもメリットがあります。

【Amazon SNSのデメリット】

時間・条件指定配信ができない
Amazon SNSはリクエストを受けたらすぐに配信するため、
予約配信や条件設定をして自動的に配信することはできません。
ただし、自前のサーバーで特定の時間・条件でリクエストを
投げるようなプログラムを作ることで対応可能です。

配信の分析ができない
Amazon SNSからわかることはあくまで配信した数のみです。
Push通知からのアプリへの誘導率など、
ユーザーがどう反応したのかについて分析することはできません。
ただしこちらも、アプリ側に分析するための仕組みを用意することで対応可能です。

【作業手順】

それぞれ以下のサイトを参考にさせていただきました。
Android
Cordova GCMから送信したAndoroidのプッシュ通知を受け取るアプリケーションの作成
[AWS] Amazon SNS の新機能「Mobile Push」を Android で使ってみた

iOS
Amazon SNS Mobile Pushを使ってiOSのPush Notificationを実装する

【欲しかった情報】

証明書周りの仕組み
以下のサイトが分りやすかったです。
iOSアプリのプロビジョニング周りを図にしてみる
[iOS] プロビジョニングファイルと証明書の意味

デバイストークン取得の方法
調査をしてみると、ネイティブアプリでの取得方法がほとんどで、あまり参考にならず、、、
この点をngCordovaがなんとかしてくれました。
ngCordova-pushNotifications
今回の開発ではAngularJSを使っていたのでこのライブラリが非常に役に立ちました。
サンプルソースも載っているため、それを参考に下記のように実装しました。
※細かい部分は割愛


// iOS
module.run(function($cordovaPush) {
  var iosConfig = {
    "badge": true,
    "sound": true,
    "alert": true,
  };

  document.addEventListener("deviceready", function(){
    $cordovaPush.register(iosConfig).then(function(deviceToken) {
      console.log("deviceToken: " + deviceToken)
    });
  }, false);
});


// Android
module.run(function($cordovaPush) {
  var androidConfig = {
    "senderID": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
  };

  document.addEventListener("deviceready", function(){
    $cordovaPush.register(androidConfig).then(function(result) {
      // Success
    }, function(err) {
      // Error
    })

    $rootScope.$on('$cordovaPush:notificationReceived', function(event, notification) {
      switch(notification.event) {
        case 'registered':
          if (notification.regid.length > 0 ) {
            console.log('registration ID = ' + notification.regid);
          }
          break;
        
        default:
          alert('An unknown GCM event has occurred');
          break;
      }
    });
  }, false);
});

◆クラウドインテグレーションサービス「雲斗」以下のページからアクセス出来ます。

-Amazon SNS

Bitnami