15

私はiOSアプリケーションを作成しています。プッシュ通知ではAmazonのSimple Notification Service(SNS)を使用しています。PythonでPythonでAPNS形式のJSONメッセージをフォーマットしてAmazon 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) 

しかし、どのような文書から明らかではないが、アップルのプッシュ通知サービスを作成する方法であります(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') 

私はこのコードを実行すると、しかし、私は通知に見るすべては、「デフォルトのメッセージ」である - アマゾンSNSが私のメッセージの形式を拒否して、表示されたことを意味代わりにdefault

このJSONを正しくフォーマットするにはどうすればよいですか?私はSNSツールを公開使用する場合、それはこのようになりますJSONを自動生成

答えて

44

私はそれを理解しました! 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'}} 
ここ

は、最終的な、動作するコードです

2番目に、その辞書をとり、JSON形式の文字列に変換します。

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

第三に、より大きなペイロードにその文字列を置く:

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

結果の文字列は、その後することができる:

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

次に、我々は独自のJSON形式の文字列にをコードbotoを使用して公開:

sns.publish(message=messageJSON,target_arn=device_arn,message_structure='json') 
+0

私はC#SDKとキーの欠けているものを私のために使用しています.JSONのAPSコンテンツに加えて、MessageStructure = "json"を設定していました。 THX – kingdango

+0

これを私が問題を抱えていたGCMに適用しました。魅力のように働いた。参照のために私のコードを貼り付ける: –

5

{ 
    "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>\" } }" 
} 

これはスペックが彼らの「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', 
    'APNS': { 
     'aps':{ 
      'alert':'inner message', 
      'sound':'mySound.caf' 
     }\ 
    } 
} 

は多分また彼らのバックスラッシュエスケープを使用して:

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

または公開SNSからの例を、以下のツールを公開します。

+0

回答が判明しましたより大きいメッセージオブジェクト内のサブJSONディクショナリではなく、APNSオブジェクトを文字列としてエンコードする必要があるということです。しかし、書面をいただきありがとうございます! – bryanjclark

+2

ああ、AmazonからのSNSの例で引用符がエスケープされているのを見るのは理にかなっている。 – aychedee

+0

それが私を去ったものです - ありがとう! – bryanjclark

関連する問題