使用实时通讯时,使用云引擎 Hook做自定义离线消息推送,在ios对ios聊天时,是可以收到离线推送。但是如果是安卓对ios设备聊天时,ios无法收到离线推送。云引擎hook 使用的是官网给的demo,

main.js 如下

require("cloud/app.js");undefined> //var msign = require('cloud/msign');
var mchat = require('cloud/mchat');
//var muser = require('cloud/muser');

    //AV.Cloud.define("conv_sign", msign.convSign);

    //AV.Cloud.define("_messageReceived",mchat.messageReceived);
    AV.Cloud.define("_receiversOffline", mchat.receiversOffline);
    //AV.Cloud.define("_conversationAdd",mchat.conversationAdd);
    //AV.Cloud.define("_conversationRemove",mchat.conversationRemove);
    //AV.Cloud.define("_conversationStart",mchat.conversationStart);
    //
    //AV.Cloud.afterDelete('_Followee',muser.afterDeleteFollowee);

    //if(!__production){
    //  AV.Cloud.define("test",muser.unfollowTest);
    //}
mchat.js 如下

var mlog = require('cloud/mlog');
var muser = require('cloud/muser');
var util = require('util');
var mutil = require('cloud/mutil');undefined> var msgTypeText = -1;
var msgTypeImage = -2;
var msgTypeAudio = -3;
var msgTypeVideo = -4;
var msgTypeLocation = -5;
var msgTypeEmotion = 1;

function messageReceived(req, res) {
 if (req.params.convId) {
    // api v2
    try{
      var pushMessage = getPushMessage(req.params);
      res.success({pushMessage: pushMessage});
    } catch(err) {
      // json parse error
      res.success();
    }
  } else {
    console.log("receiversOffline , conversation id is null");
    res.success();
  }
}

function getPushMessage(params) {
  var contentStr = params.content;
var convid = params.convId;
  var json = {
    badge: "Increment",
    sound: "default",
    convid: convid     //来支持点击弹框,跳转至相应对话
//    ,"_profile": "dev"      //设置证书,开发时用 dev,生产环境不设置
  };
  var msg = JSON.parse(contentStr);
  var msgDesc = getMsgDesc(msg);
  var userName = findOtherNameFormConversation(convid,params.offlinePeers[0]);
  if (userName) {
      json.alert = userName + ':' + msgDesc;
  } else {
      json.alert = msgDesc;
  }
    //此处设置iOS使用测试证书推送
//  if (msg._lcattrs && msg._lcattrs.dev) {
    json._profile = "dev";
//  }
  return JSON.stringify(json);
}
function findOtherNameFormConversation(convId,userId) {
  var q = new AV.Query('_Conversation');
    q.equalTo ('objectId', convId);
    q.limit (1);

    query.find({
  success: function(results) {
    // results is an array of AV.Object.
  },

  error: function(error) {
    // error is an instance of AV.Error.
  }
});
    q.get(convId).then(function (conversation) {
        console.log('1--------------------------'+conversation);
        p.resolve('aaa');
        console.log('1-1--------------------------'+p);
        }, function (error) {
        console.log('3--------------------------'+p);
         p.resolve();
  });    
     console.log('2--------------------------'+p);
     return p;
//    var conversation = results[0];
//    var convAttr = JSON.parse(conversation.attr);
//    var dict = convAttr[userId]; 
//    userName = dict['username'];
//    return results.get('attr')+convId;
}
function getMsgDesc(msg) {
  var type = msg._lctype;
  if (type == msgTypeText) {
    return msg._lctext;
  } else if (type == msgTypeImage) {
    return "[图片]";
  } else if (type == msgTypeAudio) {
    return "[语音]";
  } else if (type == msgTypeLocation) {
    return msg._lctext;
  } else if (type == msgTypeEmotion){
    return "[动态表情]";
  } else if (type == msgTypeVideo) {
    return "[视频]";
  } else {
    return "未知消息";
  }
}

function receiversOffline(req, res) {
  if (req.params.convId) {
    // api v2
    try{
//      var pushMessage = getPushMessage(req.params);
//      res.success({pushMessage: pushMessage});
        sendAPNSMessage(req,res);
//        console.log('4--------------------------');
    } catch(err) {
      // json parse error
//    console.log('5--------------------------'+err);
      res.success();
    }
  } else {
    console.log("receiversOffline , conversation id is null");
    res.success();
  }
}
function sendAPNSMessage(req, res){
    var params = req.params;
//    console.log('6--------------------------');
    var q = new AV.Query('_Conversation');
    q.equalTo ('objectId', params.convId);
    q.limit (1);
    q.find({
    success: function(results) {
        // results is an array of AV.Object.
        var dict = results[0].get('attr');
        var username = dict[params.fromPeer]['username']
        var pushMessage = getAPNSPushMessage(req.params,username);
//        console.log('1--------------------------'+params.offlinePeers[0]+'dsdsd'+);
        res.success({pushMessage: pushMessage});
    },
    error: function(error) {
        // error is an instance of AV.Error.
//         console.log('2--------------------------');
        res.success();
    }
    });
}

function getAPNSPushMessage(params,userName) {
  var contentStr = params.content;
  var json = {
    badge: "Increment",
    sound: "default",
    convid: params.convId     //来支持点击弹框,跳转至相应对话
//    ,"_profile": "dev"      //设置证书,开发时用 dev,生产环境不设置
  };
  var msg = JSON.parse(contentStr);
  var msgDesc = getMsgDesc(msg);
  if (userName) {
      json.alert = userName + ':' + msgDesc;
  } else {
      json.alert = msgDesc;
  }
  if (msg._lcattrs && msg._lcattrs.dev) {
    json._profile = "dev";
  }
  return JSON.stringify(json);
}


function conversationStart(req,res){
  console.log('conversationStart');
  res.success();
}

function conversationRemove(req,res){
  console.log('conversationRemove');
  res.success();
}

function conversationAdd(req,res){
  console.log('conversationAdd');
  res.success();
}

exports.messageReceived = messageReceived;
exports.receiversOffline = receiversOffline; // used by main.js
exports.getPushMessage = getPushMessage;
exports.conversationStart=conversationStart;
exports.conversationRemove=conversationRemove;
exports.conversationAdd=conversationAdd;

已经解决! 不会 js 的弄这个后台太难了