Parse.com unterstützt Push-Benachrichtigung. Ich kann eine Push-Benachrichtigung vom Dashboard mit einer leicht verständlichen Benutzeroberfläche senden. Alternativ können Sie die REST-API verwenden, um Push-Benachrichtigungen von der App-Seite zu senden. Es war ein wenig schwierig zu verstehen, wie man mit DeviceToken fein steuert, deshalb werde ich darüber schreiben.
Für die Push-Benachrichtigung ist mindestens "alert" erforderlich. Wenn Sie also "curl" verwenden, geben Sie Folgendes an und senden Sie. Die "X-Parse-Anwendungs-ID" (Anwendungs-ID) und "X-Parse-REST-API-Schlüssel" (REST-API-Schlüssel) können aus der Dashboard-Übersicht abgerufen werden. Wenn Sie danach angemeldet sind und das Dokument anzeigen, können Sie es so ausführen, wie es ist, da der Schlüssel direkt in das Codebeispiel eingebettet ist !!
curl -X POST \
-H "X-Parse-Application-Id: <Application ID>" \
-H "X-Parse-REST-API-Key: <REST API Key>" \
-H "Content-Type: application/json" \
-d '{
"data": {
"alert": "The Giants won against the Mets 2-3."
}
}' \
https://api.parse.com/1/push
Einfach ausgedrückt liegt es im folgenden JSON-Format vor. Da die Bedingung in "where" angegeben ist, können Sie Push Notificaiton an ein bestimmtes Terminal senden, indem Sie hier "deviceToken" angeben.
--Geben Sie iOS- oder Android-Benachrichtigungsdaten anstelle von "Daten" ein
where
angegeben werdenparse_push.py
{'where': {'deviceToken': [], #Bedingungsspezifikation unter Verwendung der Abfrage-API
},
'push_time': '2013-01-23T12:00:00Z', #Datum und Uhrzeit des Beginns der Benachrichtigung(iso)
'expiration_interval': '518400', #Haltbarkeitsdatum
'expiration_time': '2013-01-23T21:08:39Z', #Ablaufdatum und -zeit angegeben(iso)
'data': {
'alert': 'message',
'badge': 'Increment', # Number or 'Increment'(iOS only).
'sound': 'sound bundle', # iOS only.
'content-available': '1', # Newsstand content count(iOS only).
'action': 'Intent', # Android only.
'title': 'Notification!!', # Android only.
}
}
Wenn Sie einen bedingten Operator angeben, sieht dies folgendermaßen aus.
parse_push2.py
{'data': {'alert': 'push notification message!',
'badge': 'Increment',
'sound': 'default'},
'where': {'deviceToken': {'$in': [u'<deviceToken1>', u'<deviceToken2>']}}}
In Python geschrieben sieht es so aus.
apn.py
# coding: utf-8
PARSE_API_BASE = 'https://api.parse.com'
PARSE_PUSH_API = '/1/push'
PARSE_PUSH_URL = PARSE_API_BASE + PARSE_PUSH_API
#Geben Sie den Schlüssel an, der für die Push-Benachrichtigung mit HTTP-Header erforderlich ist
HEADERS = {
"X-Parse-Application-Id": "<Application ID>",
"X-Parse-REST-API-Key": "<REST API Key>",
"X-Parse-Master-Key": "<Master Key>",
"Content-Type": "application/json"
}
class APNMessageQueue(object):
""" APN(Apple Push notification)Nachrichten speichern für
"""
structure = {
'user_id': lambda x: (x is not None and len(x) > 0),
'notify_token': lambda x: (x is not None and len(x) > 0),
'message': lambda x: (x is not None and len(x) > 0),
}
def __init__(self, *args, **kwargs):
for k in self.structure.keys():
self.__setattr__(k, kwargs.get(k, None))
@classmethod
def create(cls, user_id, notify_token, message):
src_props = dict(
user_id=user_id,
notify_token=notify_token,
message=message,
)
props = {}
for k, func in cls.structure.iteritems():
value = src_props.get(k)
if func(value):
props[k] = value
if props:
return APNMessageQueue(**props)
return None
def create_notify_message(message, badge='Increment', sound='default'):
"""Erstellen Sie das Push-Benachrichtigungsformat aus der Benachrichtigungsnachricht
Args:
message:Warnmeldung.
badge:Chargenanzahl('Increment'Ist Parse.com original).
sound:Benachrichtigungston.
Return:
String im PushNotification-Format.
"""
return {'alert': message, 'badge': badge, 'sound': sound}
def create_request_data(notify_token, apn_data):
"""Analysieren des Benachrichtigungsformats Erstellen von Daten im Vorlagenformat
Args:
notify_token:Geräte-Token oder Liste davon.
apn_data:Apple Push-Benachrichtigungsdaten.
Returns:
Analysieren des Benachrichtigungsformats Daten im Vorlagenformat.
"""
request_data = {'data': apn_data}
if isinstance(notify_token, list):
request_data['where'] = {'deviceToken': {'$in': notify_token}}
else:
request_data['where'] = {'deviceToken': notify_token}
return request_data
def process_do_send(request_data):
"""ParseNotification-Format Senden Sie PushNotification, indem Sie Daten im Vorlagenformat übergeben
Args:
request_data:Analysieren des Benachrichtigungsformats Daten im Vorlagenformat
Returns:
Gibt die normale Beendigung oder den Fehler zurück
"""
import json
from urllib2 import Request, urlopen, URLError
payload = json.dumps(request_data)
request = Request(PARSE_PUSH_URL, payload, HEADERS)
try:
response = urlopen(request)
data = json.loads(response.read())
if isinstance(data, dict):
return data.get('result', False)
except URLError, e:
if hasattr(e, 'reason'):
print 'We failed to reach a server.'
print 'Reason: %s' % e.reason
elif hasattr(e, 'code'):
print 'The server couldn\'t fulfill the request.'
print 'Error code: %d' % e.code
return False
def send_notification(notify_queue_list):
"""Push-Benachrichtigung an APNs senden
Broadcast-Push-Benachrichtigungsnachricht an den APN-Server
Args:
notify_queue_list:APNMessageQueue-Liste
"""
from itertools import groupby
notify_sorted_queue_list = sorted(notify_queue_list, key=lambda x: x.message)
#Senden Sie die gleiche Nachricht zusammen
for message, group in groupby(notify_sorted_queue_list, key=lambda x: x.message):
distict_tokens = list(set([user.notify_token for user in group]))
aps_data = create_notify_message(message)
request_data = create_request_data(distict_tokens, aps_data)
print request_data
process_do_send(request_data)
Die Benutzerseite ist so
main.py
# coding: utf-8
def send_push_parse_for_apn(message):
import models
import apn
#Rufen Sie eine Liste der deviceTokens for Notification aus Benutzerdaten ab
targets = [x for x in models.User.find_by_existing_notify_token() if x is not None]
notify_token_list = [apn.APNMessageQueue(x.user_id, x.notify_token, message) for x in targets]
if len(notify_token_list) > 0:
#Starten
apn.send_notification(notify_token_list)
if __name__ == '__main__':
send_push_parse_for_apn('Abo!!')
Recommended Posts