こんにちは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のプログラムの方では、画像や音声を取扱う場合に少し応用が必要ですが、海外サイトで紹介があり、対応済みです。動画や音声、文字などをハード問わず、連携できる技術は向上出来ると確信しました。
以上、貴重なお時間お読みくださいまして、誠にありがとうございます。