使用django和GCM推送通知

时间:2015-09-04 08:39:04

标签: android django push-notification server google-cloud-messaging

我有一个Android客户端应用程序,我的服务器在django。

我想在服务器中实现推送通知,以便在发生与其相关的数据发生变化时通知特定用户,例如。

我找到了这些链接:

不确定我需要哪个链接以及什么链接。

我想要的一个例子是:

用户向服务器发出请求并更改数据,服务器向另一个用户发送推送通知。

那么我应该安装什么包?也许任何教程要遵循? 我正在寻找任何帮助我的信息。

非常感谢!

---编辑----

所以我按照e4c5的建议做了,我有一个包含设备ID和用户的表。

我在安装应用程序时将设备注册到GCM。 我还将Device_id添加到我的数据库中的表(目前用户字段为null),并将Device_id保存在我的客户端应用程序中。

现在,当用户登录时,我向我的服务器发送请求,该请求将登录用户与设备ID耦合。

当用户退出时 - 用户字段再次为null

问题是 - 如果UserA当前已注销(不在我的数据库中)但应该收到通知 - 我的服务器将查看数据库 - >设备ID表,在任何用户字段中都找不到userA(因为他当前已注销)。

结果 - 通知将丢失(我的服务器不会将其发送到GCM)。

最好的情况是,当用户再次登录时,他会收到他在退出时发送给他的所有通知。

我该怎么做?

谢谢!

4 个答案:

答案 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支持)。我建议你使用以下任何一种方法:

  1. django-instapush
  2. django-push-notifications
  3. 前者由我自己开发和维护。可用于分别向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)