だいたいそれでいいんじゃないの

つれつれなるkixixixixiの技術的なストック。http://reload.co.jp

Amazon SNS から iOS Push Notification を送ってみた

自分のアプリ(https://itunes.apple.com/app/id668291003) へ Push Notification 送ってみました。

 

AWSから格安で送信できるときいて飛びついてみました。

http://aws.amazon.com/jp/sns/

 

参考にしたサイト:

http://www.aguuu.com/archives/2013/09/amazon-sns-mobile-push-ios-push-notification/

developmentのdevicetokenを手動で登録して手動で送信するところまですぐできた。

Amazonさんありがとうございます。

 

自動でdeviceTokenの登録をしてみた。

すこし横着ですが、AppDelegate.mで下記のようにDeviceTokenを送りつけました。

http://xxx.com/sns/register.phpに送って登録します。

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    NSString *tokenStr = [NSString stringWithFormat:@"%@",deviceToken];

    tokenStr = [tokenStr stringByReplacingOccurrencesOfString:@"<" withString:@""];

    tokenStr = [tokenStr stringByReplacingOccurrencesOfString:@" " withString:@""];

    tokenStr = [tokenStr stringByReplacingOccurrencesOfString:@">" withString:@""];

    NSString *str = [NSString stringWithFormat:@"Device Token=%@",tokenStr];

    NSString* url = [NSString stringWithFormat:@"http://xxx.com/sns/register.php?token=%@", tokenStr];

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];

    [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

}

 

register.phpではAWS SDK for PHPを使い、GETで受け取ったトークンをPlatformApplicationArnに送信して登録します。

<?php

require './aws.phar';

 

$sns = Aws\Sns\SnsClient::factory(array(

    'key'    => 'xxx_API_Key_xxx',

    'secret' => 'xxx_seacret_xxx',

    'region' => 'us-west-2'

));

 

$options = array(

    'PlatformApplicationArn' => 'xxx_PlatformApplicationArn_xxx',

    'Token'                  => $_GET['token'],

);

$sns->createPlatformEndpoint($options);

?>

 

通知を送信する場合はこちら

 

<?php

require './aws.phar';

 

$sns = Aws\Sns\SnsClient::factory(array(

    'key'    => 'xxx_API_Key_xxx',

    'secret' => 'xxx_seacret_xxx',

    'region' => 'us-west-2'

));

 

$AppArn = 'xxx_PlatformApplicationArn_xxx';

 

$nextToken = '';

 

while(1){

$Model = $sns->listEndpointsByPlatformApplication(array('PlatformApplicationArn' => $AppArn, 'NextToken' => $nextToken));

foreach ($Model['Endpoints'] as $Endpoint) {

$EndpointArn = $Endpoint['EndpointArn'];

try {

      $push_parameter = array(

        'MessageStructure' => 'json',

          'Message' => json_encode(array(

           'default' => 'message',

        'APNS' => json_encode(array(

            'aps' => array(

                'alert' => 'message',

                'badge' => 2,

                'sound' => 'default'

             )

        ))

    )),

    'TargetArn' => $EndpointArn

); 

 $sns->publish($push_parameter);

    }

    catch (Exception $e)

    {

      print( $EndpointArn . " Failed!\n");

    }

  }

  

  if(!$Model['NextToken']) break;

  $nextToken = $Model['NextToken'];

 

}

 

 listEndpointsByPlatformApplicationではエンドポイントを100個だけとってくるので、nextTokenをとって次のエンドポイントをとってきます。

 

iOSアプリではpush通知での集客効果が大きいですね。

通知した日はDAUが倍程度まで増加しました。

 

それでも料金が(まだ)かからないAmazonさんには感謝です。

 

来年もよろしくお願いします。