我有一个Android客户端应用程序,我的服务器在django。
我想在服务器中实现推送通知,以便在发生与其相关的数据发生变化时通知特定用户,例如。
我找到了这些链接:
不确定我需要哪个链接以及什么链接。
我想要的一个例子是:
用户向服务器发出请求并更改数据,服务器向另一个用户发送推送通知。
那么我应该安装什么包?也许任何教程要遵循? 我正在寻找任何帮助我的信息。
非常感谢!
---编辑----
所以我按照e4c5的建议做了,我有一个包含设备ID和用户的表。
我在安装应用程序时将设备注册到GCM。
我还将Device_id添加到我的数据库中的表(目前用户字段为null
),并将Device_id保存在我的客户端应用程序中。
现在,当用户登录时,我向我的服务器发送请求,该请求将登录用户与设备ID耦合。
当用户退出时 - 用户字段再次为null
。
问题是 - 如果UserA当前已注销(不在我的数据库中)但应该收到通知 - 我的服务器将查看数据库 - >设备ID表,在任何用户字段中都找不到userA(因为他当前已注销)。
结果 - 通知将丢失(我的服务器不会将其发送到GCM)。
最好的情况是,当用户再次登录时,他会收到他在退出时发送给他的所有通知。
我该怎么做?
谢谢!
答案 0 :(得分:3)
答案是你根本不需要任何包裹。 GCM非常简单,您需要做的就是为谷歌提供的网址HTTP post,并且您可以使用自己喜欢的python http客户端库。如果您还没有,我建议python requests。大多数GCM库实际上做的是在http库之上添加一个薄层。
您需要有一个表来存储GCM注册ID。如果要求使用您应用的用户注册一个帐户,您的Django模型可能会是这样的。
class Device(models.Model) :
ANDROID = 1
IPHONE = 2
CHROME = 3
OTHER = 4
DEVICE_CHOICES = ( (ANDROID, 'Android'), (IPHONE, 'iPhone') , (CHROME,'Chrome'), (OTHER,'Others'))
device_id = models.CharField(unique = True, max_length = 1024, default='')
device_type = models.SmallIntegerField(choices = DEVICE_CHOICES)
user = models.ForeignKey(User, null = True)
当有人登录/退出时,您可能需要点按django login and logout signals来更新用户字段(或清除它)
答案 1 :(得分:2)
即使已经回答了这个问题。我建议你使用积极开发和支持的软件包。重新发明轮子是没有意义的。此外,您将获得将来可能需要的其他优势/功能(例如APNS支持)。我建议你使用以下任何一种方法:
前者由我自己开发和维护。可用于分别向Android和IOS设备发送GCM和APNS通知,如果您使用的django型号也支持mongoengine。这是指向documentation的链接。
答案 2 :(得分:1)
新的答案,以反映已编辑问题中的更新信息和要求。
在用户未登录时将要发送给用户的消息排除在远离GCM领域的位置。这只是在服务器上维护消息副本的问题。
这可以使用Redis轻松实现,但也可以通过添加保存消息的新django模型来完成。即。你现在正在建立一个商店和转发系统。
当登录信号被触发时,它应该查看这个新创建的表并触发消息(假设它们不是陈旧的)
答案 3 :(得分:0)
你不需要这一切。您可以通过向谷歌发送获取请求来向您的Android应用发送通知。请尝试以下代码。
notification_params={}
notification_params['event'] = event
notification_params['message'] = msg
notification_params['timstamp'] = datetime.datetime.now()
values = {
"to": [list of android gcm registration keys],
"collapse_key": "collapse key" ,
"data": json.dumps(notification_params)
}
headers = {
"UserAgent":"GCMServer",
"ContentType":"application/json",
"Authorization":"key="+GCM API key
}
requests.post(url="https://android.googleapis.com/gcm/send",data=values,headers=headers)