首页 文章

使用django和GCM推送通知

提问于
浏览
10

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

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

我找到了这些链接:

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

An example for what I want is:

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

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

非常感谢!

--- EDIT ----

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

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

Now, when a user logs in, I send a request to my server which couples the logged in user with the Device ID.

When the user logs out - the user field is null again.

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

As a result - the notification will be lost (my server would not send it to the GCM).

Best would be if when the user logs in again, he will get all the notifications that were sent to him while he was logged out.

我怎样才能做到这一点?

谢谢!

4 回答

  • 2

    答案是你根本不需要任何包裹 . GCM非常简单,您需要做的就是将HTTP post设为google提供的网址,并且您可以使用自己喜欢的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来更新用户字段(或清除它)

  • 3

    即使这已得到回答 . 我建议你使用积极开发和支持的软件包 . 重新发明轮子是没有意义的 . 此外,您将获得将来可能需要的其他优势/功能(例如,APNS支持) . 我建议你使用以下任何一种方法:

    前者由我自己开发和维护 . 可用于分别向Android和IOS设备发送GCM和APNS通知,如果您使用的django型号也支持mongoengine . 这是documentation的链接 .

  • 1

    一个新的答案,以反映编辑问题中的更新信息和要求 .

    在未登录时将要发送给用户的消息排队正在远离GCM领域 . 这只是在服务器上维护消息副本的问题 .

    这可以使用Redis轻松实现,但也可以通过添加保存消息的新django模型来完成 . 即 . 你正在 Build 一个商店和转发系统 .

    一旦登录信号被触发,它应该查看这个新创建的表并触发消息(假设它们不是陈旧的)

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

相关问题