web-dev-qa-db-ja.com

AmazonSNSで使用するためにAPNSスタイルのJSONメッセージをPython

IOSアプリを作成していますが、プッシュ通知にはAmazonのSimple Notification Service(SNS)を使用しています。

SNSは素晴らしいですが、ドキュメントはかなりまばらです。私は boto 、AmazonのPythonライブラリを使用しており、プレーンテキストのプッシュ通知を送信する方法を理解しました:

device_arn = 'MY ENDPOINT ARN GOES HERE'
plain_text_message = 'a plaintext message'
sns.publish(message=plain_text_message,target_arn=device_arn)

ただし、ドキュメントから明らかでないのは、Appleプッシュ通知サービス(APNS)メッセージを作成する方法です。プッシュ通知と一緒にサウンドとバッジを送信する必要がありますが、できます」メッセージのJSONをフォーマットする方法を理解します。

これが私のこれまでの最良の推測です:

message = {'default':'default message', 'message':{'APNS_SANDBOX':{'aps':{'alert':'inner message','sound':'mySound.caf'}}}}
messageJSON = json.dumps(message,ensure_ascii=False)
sns.publish(message=messageJSON,target_arn=device_arn,message_structure='json')

ただし、このコードを実行すると、通知に表示されるのは「デフォルトメッセージ」だけです。これは、Amazon SNSがメッセージの形式を拒否し、代わりにdefaultを表示したことを意味します。

このJSONを正しくフォーマットするにはどうすればよいですか?

18
bryanjclark

私はそれを考え出した! 結局、APNSペイロードはより大きなペイロード内の文字列としてエンコードする必要があります-そしてそれは完全に機能します。

これが最終的な動作コードです:

apns_dict = {'aps':{'alert':'inner message','sound':'mySound.caf'}}
apns_string = json.dumps(apns_dict,ensure_ascii=False)
message = {'default':'default message','APNS_SANDBOX':apns_string}
messageJSON = json.dumps(message,ensure_ascii=False)
sns.publish(message=messageJSON,target_arn=device_arn,message_structure='json')

このコードで何が起こっているかについてのウォークスルーは次のとおりです:

まず、APNSのpython辞書を作成します。

apns_dict = {'aps':{'alert':'inner message','sound':'mySound.caf'}}

次に、その辞書を取得して、JSON形式の文字列に変換します。

apns_string = json.dumps(apns_dict,ensure_ascii=False)

第三に、その文字列をより大きなペイロードに入れます。

message = {'default':'default message','APNS_SANDBOX':apns_string}

次に、thatを独自のJSON形式の文字列にエンコードします。

messageJSON = json.dumps(message,ensure_ascii=False)

結果の文字列は、botoを使用して公開できます。

sns.publish(message=messageJSON,target_arn=device_arn,message_structure='json')
48
bryanjclark

SNS公開ツールを使用すると、次のようなJSONが自動生成されます。

{ 
    "default": "<enter your message here>", 
    "email": "<enter your message here>", 
    "sqs": "<enter your message here>", 
    "http": "<enter your message here>", 
    "https": "<enter your message here>", 
    "sms": "<enter your message here>", 
    "APNS": "{\"aps\":{\"alert\": \"<message>\",\"sound\":\"default\"} }", 
    "GCM": "{ \"data\": { \"message\": \"<message>\" } }", 
    "ADM": "{ \"data\": { \"message\": \"<message>\" } }" 
 }

これは、Appleの " Notification Payload "セクションで説明されている仕様に近いように見えます。メッセージは次のようになっているはずです。

a JSON dictionary object (as defined by RFC 4627). 
This dictionary must contain another dictionary identified by the key aps.
The aps dictionary contains one or more properties

その仕様に近いメッセージを提供しようとしましたか?たとえば、次のようなものです。

{
    'default':'default message', 
    {
        'aps':{
            'alert':'inner message',
            'sound':'mySound.caf'
         }
    }
 }

または、SNS公開ツールの例に従ってください。

{
    'default':'default message',
    'APNS': {
        'aps':{
            'alert':'inner message',
            'sound':'mySound.caf'
         }\
     }
 }

たぶん、バックスラッシュのエスケープも使用します。

5
aychedee