15

के साथ उपयोग के लिए पायथन में एपीएनएस-शैली जेएसओएन संदेश प्रारूपित करें, मैं एक आईओएस ऐप बना रहा हूं, और हमारी पुश अधिसूचनाओं के लिए, हम अमेज़ॅन की सरल अधिसूचना सेवा (एसएनएस) का उपयोग कर रहे हैं।अमेज़ॅन एसएनएस

एसएनएस अद्भुत है, लेकिन दस्तावेज़ीकरण बहुत दुर्लभ है। मैं boto, अमेज़न के अजगर पुस्तकालय का उपयोग कर रहा है, और मैं समझ गए होंगे कि कैसे सादे-पाठ पुश सूचनाएं भेजने के लिए:

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

हालांकि, स्पष्ट नहीं है प्रलेखन से एक एक Apple Push अधिसूचना सेवा बनाने का तरीका है (एपीएनएस) संदेश। मुझे पुश अधिसूचना के साथ एक ध्वनि और बैज भेजने की ज़रूरत है, लेकिन यह पता नहीं लगा सकता कि संदेश के लिए 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') 

मुझे इस कोड को चलाने, हालांकि, सब मैं अधिसूचना पर देख "डिफ़ॉल्ट संदेश" है - जिसका अर्थ है कि अमेज़न एसएनएस मेरा संदेश के प्रारूप को अस्वीकार कर दिया, और प्रदर्शित इसके बजाय default

मैं इस JSON को सही ढंग से कैसे प्रारूपित करूं?

उत्तर

44

मैंने इसे समझ लिया! बाहर निकलता है, एपीएनएस पेलोड को बड़े पेलोड के भीतर एक स्ट्रिंग के रूप में एन्कोड किया जाना चाहिए - और यह पूरी तरह से काम करता है।APNS के लिए

पहले, अजगर शब्दकोश बनाने के लिए::

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

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

यहाँ क्या इस कोड में हो रहा है की एक पूर्वाभ्यास बताया गया है:

यहाँ अंतिम, काम कर कोड है

दूसरा, उस शब्दकोश को लें, और इसे JSON- स्वरूपित स्ट्रिंग में बदलें:

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

तीसरा, बड़ा पेलोड में कि स्ट्रिंग डाल:

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

इसके बाद, हम सांकेतिक शब्दों में बदलना अपनी ही JSON- प्रारूपण स्ट्रिंग में कि:

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

जिसके परिणामस्वरूप स्ट्रिंग तो हो सकता है प्रकाशित का उपयोग कर Boto:

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

मैं सी # एसडीके और मेरे लिए महत्वपूर्ण गायब चीज का उपयोग कर रहा हूं, एपीएस सामग्री JSON'ing के अलावा संदेश संरचना = "जेसन" सेट करना था ... एक बार मैंने यह सब किया था। THX – kingdango

+0

मैंने इसे जीसीएम में अनुकूलित किया, जिसमें मुझे परेशानी हो रही थी। एक जादू की तरह काम किया। संदर्भ के लिए मेरे कोड चिपका रहा है: –

5

जब मैं का उपयोग एसएनएस उपकरण प्रकाशित यह JSON कि इस तरह दिखता है autogenerates:

{ 
    "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', 
    { 
     'aps':{ 
      'alert':'inner message', 
      'sound':'mySound.caf' 
     } 
    } 
} 

या एसएनएस प्रकाशित प्रकाशित उपकरण से उदाहरण का पालन करना:

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

शायद भी अपने बैकस्लैश से बचने का उपयोग कर।

+0

जवाब निकला यह सुनिश्चित करने के लिए कि एपीएनएस ऑब्जेक्ट को बड़े संदेश ऑब्जेक्ट के अंदर उप-JSON शब्दकोश के बजाय स्ट्रिंग के रूप में एन्कोड करने की आवश्यकता है। लिखने के लिए धन्यवाद, यद्यपि! – bryanjclark

+2

आह हां, यह समझ में आता है क्योंकि उद्धरण अमेज़ॅन से एसएनएस उदाहरण में भाग गए हैं। – aychedee

+0

हाँ! यही कारण है कि मुझे बंद कर दिया - धन्यवाद! – bryanjclark

संबंधित मुद्दे