15

Tworzę aplikację na iOS, a dla powiadomień push korzystamy z usługi prostego powiadamiania Amazon (SNS).Format wiadomości JSON w języku APNS w języku Python do użytku z usługą Amazon SNS

SNS jest cudowna, ale dokumentacja jest dość rzadka. Używam boto, Python biblioteki Amazona, a ja zorientowali się, jak wysłać zwykły tekst powiadomień push:

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

Jednak to, co nie jest jasne, z dokumentacja jest jak stworzyć usługę powiadomienie Apple Push (APNS) wiadomość. Muszę wysłać dźwięk i znaczek wraz z powiadomieniem push, ale nie mogę wymyślić, jak sformatować JSON dla wiadomości.

Oto mój najlepszy przypuszczenie tak daleko:

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') 

Kiedy uruchomić ten kod, choć widzę na zgłoszeniu jest „domyślna wiadomość” - co oznacza, że ​​Amazon SNS odrzucone formatu moją wiadomość, a wyświetlany zamiast tego default.

Jak poprawnie sformatować ten JSON?

Odpowiedz

44

Wymyśliłem! Okazało się, że ładunek APNS musi być zakodowany jako ciąg znaków w większym ładunku - i to działa całkowicie.

Oto ostateczny, kod działa:

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') 

Oto solucja, co się dzieje w tym kodzie:

Najpierw utwórz słownika Pythona do APNS:

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

Po drugie, weź ten słownik i przekształć go w łańcuch w formacie JSON:

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

trzecie, umieścić ten ciąg do większej ładowności:

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

Następny, kodujemy że we własnym JSON sformatowanym wyrażenie:

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

Powstały ciąg może być następnie opublikowane przy użyciu boto:

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

Używam C# SDK i kluczowego brakującego elementu dla mnie, oprócz JSON'ing zawartość APS było ustawić MessageStructure = "json" ... raz zrobiłem, że wszystko było dobrze. THX – kingdango

+0

Dostosowałem to do GCM, z czym miałem problem. Pracował jak urok. Wklejam mój kod w celach informacyjnych: –

5

Gdy używam SNS publikuje narzędzie to autogenerates JSON, który wygląda tak:

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

To wygląda bliżej spec mówił o przez firmę Apple w swojej sekcji „Notification Payload”. Gdzie stwierdzają, że wiadomość powinna być:

Czy próbowałeś przekazać wiadomość bliżej tej specyfikacji? Coś takiego na przykład:

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

Albo wzorując się od publikowania SNS publikuje narzędzia:

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

Może również przy użyciu ich backslash ucieczkę.

+0

Odpowiedź okazała się być, że obiekt APNS musiał być zakodowany jako łańcuch, a nie słownik pod-JSON wewnątrz większego obiektu wiadomości. Dziękuję za napisanie! – bryanjclark

+2

Ach tak, to ma sens, ponieważ cytaty są ujęte w przykładzie SNS z Amazon. – aychedee

+0

tak! To mi wskazało - dziękuję! – bryanjclark