AWS_Subscription_Check

こんにちはEveryDaySoft代表の永田です。

今回は、iOSのアプリがアンインストールされた場合に、AWS上のSNS機能を通じて、アプリがアンインストールされ、Push通知が機能しなくなっている状態を検知する方法をご紹介します。

確認した中で、ドキュメントで記載していなく、完全に確実なものではないのですが、一つのTipsとして記載いたします。ドキュメントに記載のSNSのステータス確認方法。

            
delivery = json.dumps(
                {"http": {"defaultHealthyRetryPolicy": {"minDelayTarget":1,"maxDelayTarget": 5,"numRetries": 5}}}
            )
response7 = sns.set_topic_attributes(
TopicArn=subscription['TopicArn'],
AttributeName='DeliveryPolicy',
AttributeValue=delivery
)
print(response7)

ログではtrueとfalseでプリントしていますが、falseは無効のsubscritionです。ResponseMetadataと記載されている箇所が、response7のログです。trueのログと違いがありませんでした。trueと記載されている箇所は、AWS PythonSDKのboto3 メソッド get_endpoint_attributesから、response[‘Attributes’][‘Enabled’] のレスポンス結果です。日本の場合は夜中3時頃〜午前中までの間でEnabledの値に変化がありました。subscrition[‘TopicArn’]の取得は、後に解説いたします。

目的

長期的に考えて、データを定期的にUpdate、整理する設計の方が良いと思いました。関連するデータをどう扱うかという点でも、ユーザーに責任を任せて良いものは、データをなるべく保持しない方が安全と考えました。

目標

定期実行でpush通知の有効無効を判定し、無効の場合は削除し、有効のデータのみにします。

懸念

大量に無効データがある場合、挙動を今後確認していく形になります。

方法

import json
import boto3
import datetime
from botocore.exceptions import ClientError

def lambda_handler(event, context):
    TargetArn = 'SNS-TargetArn'
    sns = boto3.client('sns')
    response = sns.list_subscriptions_by_topic(
        TopicArn=TargetArn
    )
    for subscription in response['Subscriptions']:
        try:
            response2 = sns.get_endpoint_attributes(
            EndpointArn=subscription['Endpoint']
            )
            if response2['Attributes']['Enabled'] =='true':
                print("true")
                response3 = sns.publish(
                TargetArn=subscription['Endpoint'],
                Message="Check"
                )
            else:
                deleate = sns.unsubscribe(
                SubscriptionArn=subscription['SubscriptionArn']
                )
                print("false")
        except ClientError as e:
            print(e)

上記のコードにあるようにtrueかfalseか、判定してfalseはunsubscribeします。list_subscriptions_by_topicメソッドで引数にSNSのTargetArnという項目を指定して、Listのレスポンスを取得し、for文でsubscriptionにネスト内のデータを代入しています。

挙動

こちらは取得で確認した場合の挙動ですが、定期実行はAWSではとても簡単で、Amazon EventBridgeを使用しています。

https://twitter.com/dbank0208/status/1308169357088841728?s=20

” “

” “

” “

” “

日本時間の場合は、9時間前の値を確認する形です。これは21時なので、3時50分,55分のデータを確認しました。

備考

AWSのLambdaで、push通知を音声ありremote通知する方法を下記の記事でコードで記載しています。remoteに使用するペイロードは専用のjson形式になります。HelloWorldの部分がメッセージで表記されます。 

音声を可変する場合は、アプリに導入する必要があります。defaultとAPNS_SANDBOXの部分は記載必須です。

今後

AWSのDynamoDB,GCPのStorageにもデータ連携していきます。

まとめ

4連休はAWSのSNSについて知見を深めました。iOSのプログラムの方では、画像や音声を取扱う場合に少し応用が必要ですが、海外サイトで紹介があり、対応済みです。動画や音声、文字などをハード問わず、連携できる技術は向上出来ると確信しました。

以上、貴重なお時間お読みくださいまして、誠にありがとうございます。