pusher.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /**
  2. * 消息推送服务工具,包装消息推送方法。
  3. *
  4. * 当前使用个推的推送服务。
  5. */
  6. "use strict";
  7. let RedisModel = require('../redis.model');
  8. let GeTui = require('getui/GT.push');
  9. let Target = require('getui/getui/Target');
  10. let APNTemplate = require('getui/getui/template/APNTemplate');
  11. let BaseTemplate = require('getui/getui/template/BaseTemplate');
  12. let APNPayload = require('getui/payload/APNPayload');
  13. let SimpleAlertMsg = require('getui/payload/SimpleAlertMsg');
  14. let NotyPopLoadTemplate = require('getui/getui/template/NotyPopLoadTemplate');
  15. let LinkTemplate = require('getui/getui/template/LinkTemplate');
  16. let NotificationTemplate = require('getui/getui/template/NotificationTemplate');
  17. let TransmissionTemplate = require('getui/getui/template/TransmissionTemplate');
  18. let SingleMessage = require('getui/getui/message/SingleMessage');
  19. let AppMessage = require('getui/getui/message/AppMessage');
  20. let log = require("../../util/log.js");
  21. let configFile = require('../../include/commons').CONFIG_FILE;
  22. let config = require('../../resources/config/' + configFile);
  23. class Pusher extends RedisModel {
  24. constructor() {
  25. super();
  26. this.getuiConfig = config.getTuiConfig;
  27. this.gt = new GeTui(this.getuiConfig.HOST, this.getuiConfig.APPKEY, this.getuiConfig.MASTERSECRET);
  28. }
  29. /**
  30. * iOS单个推送。使用APN简单推送。
  31. *
  32. * @param message
  33. * @param customData
  34. * @param type
  35. * @param deviceToken
  36. * @param handler
  37. */
  38. pushToSingleViaAPN(message, customData, type, deviceToken,badge, handler) {
  39. try {
  40. let simpleAlertMsg = new SimpleAlertMsg();
  41. simpleAlertMsg.alertMsg = message;
  42. let payload = new APNPayload();
  43. payload.alertMsg = simpleAlertMsg;
  44. payload.badge = badge;
  45. payload.contentAvailable = 1;
  46. payload.category = type;
  47. payload.customMsg.payload1 = customData;
  48. let template = new APNTemplate();
  49. template.setApnInfo(payload);
  50. let singleMessage = new SingleMessage();
  51. singleMessage.setData(template);
  52. this.gt.pushAPNMessageToSingle(this.getuiConfig.APPID, deviceToken, singleMessage, function (err, res) {
  53. if (err) {
  54. log.error('Push via APN failed:' + e);
  55. } else {
  56. handler(null, res);
  57. }
  58. });
  59. } catch (e) {
  60. log.error('Push via APN failed:'+deviceToken+":" + e);
  61. }
  62. }
  63. /**
  64. * 安卓单个推送。
  65. *
  66. * @param title
  67. * @param message
  68. * @param customData
  69. * @param clientId
  70. * @param appInBg
  71. * @param handler
  72. */
  73. pushToSingleViaAndroid(title, message, customData, clientId, appInBg, handler) {
  74. if (appInBg == 1) {
  75. this._pushAndroidNotify(clientId, title, message, customData, handler);
  76. } else {
  77. this._pushAndroidTransmission(clientId, customData, handler);
  78. }
  79. }
  80. _pushAndroidNotify(clientId, title, msg, data, handler) {
  81. let transmissionContent = {
  82. pushtype: 'notify',
  83. data: data
  84. };
  85. let template = new NotificationTemplate({
  86. appId: this.getuiConfig.APPID,
  87. appKey: this.getuiConfig.APPKEY,
  88. title: title,
  89. text: msg,
  90. logo: '',
  91. isRing: true,
  92. isVibrate: true,
  93. isClearable: true,
  94. transmissionType: 1,
  95. transmissionContent: JSON.stringify(transmissionContent)
  96. });
  97. //个推信息体
  98. let message = new SingleMessage({
  99. isOffline: true, //是否离线
  100. offlineExpireTime: 3600 * 12 * 1000, //离线时间
  101. data: template, //设置推送消息类型
  102. pushNetWorkType: 0 //是否wifi ,0不限,1wifi
  103. });
  104. //接收方
  105. let target = new Target({
  106. appId: this.getuiConfig.APPID,
  107. clientId: clientId
  108. });
  109. this.gt.pushMessageToSingle(message, target, function (err, res) {
  110. if (err != null && err.exception != null && err.exception instanceof RequestError) {
  111. let requestId = err.exception.requestId;
  112. console.log(err.exception.requestId);
  113. this.gt.pushMessageToSingle(message, target, requestId, function (err, res) {
  114. handler(err, res);
  115. });
  116. } else {
  117. handler(err, res);
  118. }
  119. });
  120. }
  121. _pushAndroidTransmission(clientId, customData, handler) {
  122. let transmissionContent = {
  123. pushtype: 'transmission',
  124. data: customData
  125. };
  126. let template = new TransmissionTemplate({
  127. appId: this.getuiConfig.APPID,
  128. appKey: this.getuiConfig.APPKEY,
  129. transmissionType: 2,
  130. transmissionContent: JSON.stringify(transmissionContent)
  131. });
  132. // 个推信息实体
  133. let message = new SingleMessage({
  134. isOffline: true, //是否离线
  135. offlineExpireTime: 3600 * 12 * 1000, //离线时间
  136. data: template, //设置推送消息类型
  137. pushNetWorkType: 0 //是否wifi ,0不限,1 wifi
  138. });
  139. // 接收方
  140. let target = new Target({
  141. appId: this.getuiConfig.APPID,
  142. clientId: clientId
  143. });
  144. this.gt.pushMessageToSingle(message, target, function (err, res) {
  145. if (err != null && err.exception != null && err.exception instanceof RequestError) {
  146. let requestId = err.exception.requestId;
  147. log.info("Push android single failed without rquestId, retry with requestId: ", err.exception.requestId);
  148. this.gt.pushMessageToSingle(message, target, requestId, function (err, res) {
  149. if (err) {
  150. log.error("Push android single via transmission with requestId failed: ", err);
  151. }
  152. });
  153. }
  154. });
  155. }
  156. }
  157. let pusher = new Pusher();
  158. module.exports = pusher;