こんにちは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を使用しています。

” “
” “
” “
” “
日本時間の場合は、9時間前の値を確認する形です。これは21時なので、3時50分,55分のデータを確認しました。
備考
AWSのLambdaで、push通知を音声ありremote通知する方法を下記の記事でコードで記載しています。remoteに使用するペイロードは専用のjson形式になります。HelloWorldの部分がメッセージで表記されます。
音声を可変する場合は、アプリに導入する必要があります。defaultとAPNS_SANDBOXの部分は記載必須です。
今後
AWSのDynamoDB,GCPのStorageにもデータ連携していきます。
まとめ
4連休はAWSのSNSについて知見を深めました。iOSのプログラムの方では、画像や音声を取扱う場合に少し応用が必要ですが、海外サイトで紹介があり、対応済みです。動画や音声、文字などをハード問わず、連携できる技術は向上出来ると確信しました。
以上、貴重なお時間お読みくださいまして、誠にありがとうございます。
コメントを残す