Y

Parse.comの代替としてAmazonSNSを使う

Parse.com終わりますね..

Top 5 Parse Alternatives

あちこちで悲鳴が聞こえます... Facebookに買収されたから安心していたんですけどね..

AmazonSNSにします

Amazon SNSでモバイルPush/HTTP Push通知

いろいろ比較しましたが乗り換え先はAmazonSNSに決めました。決め手はAmazonだから(..過去から学んでない)、価格、API、Webコンソールが便利。などです。

クラウドのサービスはGoogle Cloud Platformをメインに使っているのでFirebaseを検討しましたがPush通知機能が無いので諦めました。(今後に期待)

fastlane pemは便利だった

fastlane/pem

サンプルアプリでAmazonSNSの動作を確認しようとしてPush通知の設定を忘れていました。調べてみると最近はfastlane pemなるものがあり便利でした。(fastlaneは言語ごとのスクリーンショットを保存できたり他にも便利機能ありますよね)

インストール

$sudo gem install pem

証明書作成

$pem --development 

AmazonSNSの設定

(1)アプリケーション作成ボタンクリック

スクリーンショット 2016-02-13 22.33.05.png

(2)アプリケーション設定

fastlane pemで作成した.p12ファイルを選択した後に、Load Credentials from FileボタンをクリックするとCertificateとPrivate Key項目は自動で設定されます。

スクリーンショット 2016-02-13 22.01.16.png

(3)エンドポイント作成ボタンクリック

スクリーンショット 2016-02-13 22.01.49.png

(4)エンドポイント設定

スクリーンショット 2016-02-13 22.02.35.png

(5)Publishボタンクリック

スクリーンショット 2016-02-13 22.06.51.png

(6)Publish設定

スクリーンショット 2016-02-13 22.08.19.png

(7)Push通知受信

スクリーンショット 2016-02-13 22.36.39.png

無事通知来ました

AmazonSNS APIを使う

API経由でエンドポイント作成とパブリッシュを行います。

composer install

PHPのライブラリがあるので簡単です

"aws/aws-sdk-php": "3.*"

エンドポイント作成

Laravelのコマンドに実装しました

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Aws\Sns\SnsClient;

class PublishPushNotification extends Command
{
    protected $signature = 'aws-sns:publish';
    protected $description = 'This command will publish a notification';

    public function handle() {
        $sns = new SnsClient([
            'credentials' => [
                'key'    => 'xxxx',
                'secret' => 'xxxx'
            ],
            'region' => 'us-west-2',
            'version' => '2010-03-31'
        ]);

        // Create Endpoint
        $arn = 'arn:aws:sns:xxxx';
        $token = 'xxxx';
        $options = array(
                    'PlatformApplicationArn' => $arn,
                    'Token' =>$token,
                    'CustomUserData' => '',
        );

        try {
            $result = $sns->createPlatformEndpoint($options);
            echo $result['EndpointArn'];
        } catch (Exception $e) {
            echo $e->getMessage(); // TODO logging
        }
}

パブリッシュ

// Publish
$arn = 'arn:aws:sns:xxxx';
$options = array(
  'Message'   => 'Hello!',
  'TargetArn' => $arn
);

try {
  $result = $sns->publish($options);
  echo $result['MessageId'];
} catch (Exception $e) {
  echo $e->getMessage(); // TODO logging
}

まとめ

以下がTODOです。今度やります。

  • 言語毎のメッセージ分けを簡単にできないかな
  • IAMで権限を絞る

あとiOS9からプッシュ通知に変更があったの知らなかったのでメモしておきます。

WWDC 2015 – Big changes to Apple push notifications

  • Push notification actions
  • APNS token size
  • Providers API

参考

fastlane/pem

Amazon SNSでモバイルPush/HTTP Push通知

Top 5 Parse Alternatives

WWDC 2015 – Big changes to Apple push notifications

Amazon Simple Notification Service

AWS SDK Installation

Class SnsClient

AWS SDK for PHPのVersion 3に更新して、EC2自動起動処理を書き換えてみた

気軽なSNS Mobile Push の話

Amazon SNS 料金

TipMe

TipMe with IndieSquare