如何使用 quickblox 从 javascript 发送推送通知

Posted

技术标签:

【中文标题】如何使用 quickblox 从 javascript 发送推送通知【英文标题】:How to send push notifications form javascript using quickblox 【发布时间】:2015-01-13 10:44:30 【问题描述】:

我正在尝试从我的后端服务器通过 Quickblox 发送推送通知消息。执行此操作的代码如下所示:

    app.post('/requests', function(req, res) 

    var mobileNumber = req.param('mobile_number');

    if (typeof mobileNumber === 'undefined') 
        return res.badRequest("Parameters missing: [mobile_number]");
    

    var query = 
        international_number: mobileNumber
    
    User.findOne(query, function(err, user) 
        if (err) 
            return res.dbError(err);
        
        if (!user) 
            console.log("User not found");
            return res.apiError("NOT_FOUND");
        

        var request = new Request();
        request.sender_id = req.user._id;
        request.receiver_id = user._id;
        request.status = 'pending';

        request.save(function(err) 
            if (err) 
                return res.dbError(err);
            
            var response = ;
            response.image_url = user.image_url;
            response.id = request._id;

            // ¡TODO! Notify the end user -- Quickblox 
            QB.createSession(function(err, result) 
                if (err) 
                    console.log(err);
                    return res.apiError();
                
                console.log("**** SESSION CREATE ****")
                console.log(result);
                var params = 
                    login: req.user.qb_username,
                    password: req.user.qb_password
                
                console.log("LOGIN PARAMS");
                console.log(params);
                QB.login(params, function(err, result) 
                    if (err) 
                        console.log(err);
                        return res.apiError();
                    
                    console.log("**** USER LOGIN ****")
                    console.log(result);
                    var params = 
                        notification_type: 'push',
                        environment: 'production',
                        user : 
                            ids: user.qb_id
                        ,
                        message: 'SSBsb3ZlIE0mTSdzISBFc3BlY2lhbGx5IHJlZCBvbmUh',
                        push_type: user.device.notification_channel
                    
                    console.log("EVENTS CREATE PARAMS");
                    console.log(params);
                    QB.messages.events.create(params, function(err, result) 
                        if (err) 
                            console.log(err);
                            return res.apiError();
                        
                        console.log("**** MESSAGE EVENT CREATE ****");
                        console.log(result);
                        console.log(result.event.subscribers_selector);
                        QB.messages.events.list(function(err, result) 
                            if (err) 
                                console.log(err);
                                return res.apiError();
                            
                            console.log(result);
                            console.log("**** EVENTS LIST ****");
                            console.log(result.items);
                            res.apiSend(response);

                        );
                    );
                );
            );
        );
    );
);

请注意,我会在每个 Quickblox 请求之后记录响应。所以 QB.messages.events.create() 之后的日志如下:

**** MESSAGE EVENT CREATE ****
 event: 
    active: true,
   application_id: 18113,
   created_at: '2015-01-13T10:32:45Z',
   date: null,
   end_date: null,
   event_type: 'one_shot',
   id: 1809320,
   message: 'data.message=SStsb3ZlK00lMjZNJTI3cyUyMStFc3BlY2lhbGx5K3JlZCtvbmUlMjE=',
   name: null,
   occured_count: 0,
   period: null,
   updated_at: '2015-01-13T10:32:45Z',
   user_id: 2185263,
   notification_channel:  name: 'gcm' ,
   subscribers_selector: 
       environment: 'production',
        tags_query: null,
        user_ids: [Object]   

当我使用 QB.messages.events.list() 列出事件时,我得到以下响应:

 current_page: 1,
  per_page: 10,
  total_entries: 19,
  items: 
     [  event: [Object] ,
        event: [Object] ,
        event: [Object] ,
        event: [Object] ,
        event: [Object] ,
        event: [Object] ,
        event: [Object] ,
        event: [Object] ,
        event: [Object] ,
        event: [Object]  ] 

因此它说消息队列中有 19 个条目,并且一切似乎都正常。 但是,当我登录我的 Quickblox 帐户并检查消息队列时,它始终是空的,因此没有计划发送任何消息。另请注意,订阅显示用户订阅了推送通知服务,例如“gcm”和“apns”。谁能帮我看看为什么会这样?

【问题讨论】:

quickblox.com/developers/Messages#Messages_API - 你有没有:A)为用户创建了一个推送令牌,B)订阅了他们推送通知?如果没有可用的(订阅)用户可以将它们发送到,QB 不会将它们添加到队列中。 【参考方案1】:
    您需要将消息编码为 base64。 您需要确保您的移动应用能够理解解码后的消息。

例如,

发送推送通知到 android qb_user_id: 20290 (来自我 - 我的 qb_user_id: 12121):

function b64EncodeUnicode(str) 
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]2)/g, function(match, p1) 
    return String.fromCharCode('0x' + p1);
));

function send_push() 
var params = 
    notification_type: 'push',
    push_type: 'gcm',
    user: ids: [20290],
    environment: "production", 
    message: b64EncodeUnicode('"message":"HELLO WORLD","user_id":12121,"device_type":"WEB","message_qb_id":"563a55a44cedaa83885724cf","message_type":"Text","send_status":"BeingProcessed","send_time":1446663588607')
  ;

  QB.messages.events.create(params, function(err, response) 
    if (err) 
      console.log("QB.messages.events.create::error:" +err);
     else 
      console.log("QB.messages.events.create::response:" + response);
    
  );
 

在此示例中,移动应用正在查找以下格式的消息: "message","user_id","device_type","message_qb_id","message_type","send_status","send_time"

【讨论】:

以上是关于如何使用 quickblox 从 javascript 发送推送通知的主要内容,如果未能解决你的问题,请参考以下文章

如何管理 quickblox 会话 Javascript SDK

Quickblox:使用自定义对象登录 (Android)

如何在 Quickblox iOS 中从远程视频中捕获视频帧

Quickblox 管理会话和召回?

QuickBlox:推送通知设置

如何清除 Quickblox 中的聊天记录?