20460


Amazon SNSを用いてPUSH通知を実装しようと思っているのですが、
ダッシュボードでの"enable"がfalseになってしまいPUSHが送れません。

[code]

    public function testPush(){
        $my_id = 4;//Pushを送信するユーザーのID
        $user_id_array = [3,6];//Pushを受け取るユーザーのID
        $my_name = $this->getUser($my_id);//ユーザーの名前を取得する関数
        foreach($user_id_array as $user_id){
       //DBに保存した各ユーザーのデバイストークンを取得する。
            $device_token = $this->getToken($user_id);
    
            $user_name = $this->getUser($user_id);
            if($device_token != null && $user_name != null){
    
                $msg = "$user_name".'さん'."$my_name".'さんよりメッセージが届いています。';
    
                $this->PushTo->PushSNS($msg,$device_token);
            }
        }
    }
    
    //PUSH通知を送信
    public function pushSNS($msg,$device_token){        
        $sns = SnsClient::factory(array(
                                        'credentials' => array(
                                                               //アクセスのための公開鍵と秘密鍵を指定                      
                                                               'key' => '************',
                                                               'secret' => '************',
                                                               ),
                                        'region' => 'ap-northeast-1', // AP_NORTHEAST_1はtokyo region                         
                                        'version' => '2010-03-31',
                                        ));
    
        //アプリケーションを指定（Application ARN：Amazon SNS上に表記されている） 
        //Product
        $iOS_AppArn = 'arn:aws:sns:ap-northeast-1:****************'; 
        $iOS_model = $sns->listEndpointsByPlatformApplication(array(
                                                                    'PlatformApplicationArn' => "$iOS_AppArn",
                                                                                                             ));
    
        //通知メッセージ
        $alert = $msg;
        // それぞれのエンドポイントへメッセージを送る
        foreach ($iOS_model['Endpoints'] as $endpoint){
                $endpointArn = $endpoint['EndpointArn'];
                $enable = $endpoint['Attributes']['Enabled'];
                $endpoint_device_token =$endpoint['Attributes']['Token'];
                if($device_token == $endpoint_device_token){
                    if($enable == true){
                        $content = array(
                                         'TargetArn' => $endpointArn,
                                         'MessageStructure' => 'json',
                                         'Message' => json_encode(array(
                                                                        'APNS' => json_encode(array(
                                                                                                    'aps' => array(
                                                                                                                   'alert' => $alert,
                                                                                                                   'sound' => 'default',
                                                                                                                   'badge' => 1
                                                                                                                   ),
                                                                                                    //カスタム可能
                                                                                                    'transition_index' => 3,//１：Atab ２：Btab ３：Ctab ４：Dtabへの遷移に適宜カスタムする。
                                                                                                    ))
                                                                        ))
                                         );
                        try{
                            $sns->publish($content);
                            //return true;
                        }catch (Exception $e){
                            print($e->getMessage());
                        }       
                    }elseif($enable == false){
                        echo 'bud';
                    }
                }
        }
        return 0;
    }
    
[/code]

DBにはユーザーIDが3と6のデバイストークンは保存されていて、  
片方（ID3のユーザー）にPush通知を送ることはできていますが、  
もう片方に送信できません。  
ダッシュボードで確認すると送信できていない方のトークンの"enable"が"false"になってしまっていました。

[![画像の説明をここに入力](https://i.stack.imgur.com/5t7cf.png)](https://i.stack.imgur.com/5t7cf.png)

一時的に"enable"を"false"にしても、再度Pushを試すと元に戻ってPushも送れていない状態になってしまいます。

なにかありましたら、随時補足させていただきますので、よろしくお願い致します。

参考サイト

[Amazon SNSでリモート通知（Push通知）をおこなう [AWS SDK for PHP][iOS]](http://noumenon-
th.net/webstrategy/2015/06/09/amazonsns/)


CC BY-SA 4.0
2015-12-25T07:33:44.860
20359
2021-06-15T11:09:10.613
2021-06-15T11:09:10.613
3060
12470
question
php cakephp amazon-sns
Amazon SNS を用いたプッシュ通知が送れない


ユーザーID=6のEndPointに関連づけられたデバイストークンが、古いものになっている(既に他の新しいトークンが発行されている)可能性はないでしょうか。

Amazon
SNSでは、アプリ側で新しいトークンが発行済である、アプリがアンインストールされているなどの理由で無効になったトークンに通知を行い、失敗した場合にEndPointのEnabledがfalseに更新されるとのことです。

参考：

  * [Amazon SNS のモバイルトークン管理についてのベストプラクティス](http://dev.classmethod.jp/cloud/aws/sns-mobile-token/#toc-2)
  * [iOS8アップデートでアプリへのプッシュ通知でハマる点](http://qiita.com/ykf/items/4978a9ccf0dd1cc6a19b#2-2)


CC BY-SA 3.0
2015-12-29T17:52:00.920
20460
2015-12-29T17:52:00.920
9017
20359
answer


有効なはずの端末でも何故かenabledがfalseになってしまうことがあります。  
強引にenabledにtrueをセットして送ってみてはどうでしょう  
それでもダメならその端末とアプリのインスタンスはもう無効となっているのではないでしょうか？


CC BY-SA 3.0
2016-09-28T01:58:49.720
29198
2016-09-28T01:58:49.720
18944
20359
answer