/** * 添加push任务接口 * * @param $message object 消息对象PushMessage * @param $taskDes string 任务描述 * @param $appIdList string 要发送的appid,以英文逗号分割 * @param $userIdList string 要发送的用户列表,用户Id以英文逗号分割 * @param $passThrough int 消息类型。1:透传消息,0:通知消息 * * @return boolean */ public static function addPush($message, $taskDes, $appIdList, $userIdList, $passThrough = 0) { if (empty($message) || !$taskDes || !$appIdList || !$userIdList) { return false; } $title = $message->bussiness_title; if (!$title) { $title = $taskDes; } $bubble = $message->bubble > 0 ? $message->bubble : 1; //将push消息存储到redis return \Util\Tools\PushRedis::addPushWaitSend(explode(',', $userIdList), $title, $message->bussiness_message, $message->bussiness_data, explode(',', $appIdList), $bubble, $passThrough); }
public static function run() { //第一步 从待插入数据库的队列里获取数据 $insertArr = \Util\Tools\PushRedis::popSqlWaitInsert(); if (!is_array($insertArr) || !$insertArr['database'] || !$insertArr['table'] || !$insertArr['keyValues']) { return false; } //生成sql $insertSql = self::getInsertSql($insertArr); $pdo = \Util\Db\Manager::getInstance('jianzhi_push'); //执行插入操作 $state = $pdo->insertSql($insertSql); }
/** * 从redis中获取待发送Push消息,将其推送到push服务中心,然后将入库数据临时写到redis */ public function run() { echo "start run..."; $startTime = time(); while (true) { $push = \Util\Tools\PushRedis::popPushWaitSend(); if ($push['title'] && $push['userIds'] && $push['message'] && $push) { foreach ($push['userIds'] as $userId) { foreach ($push['appIds'] as $appId) { $iosTokens = \Util\Tools\PushRedis::getIosToken($appId, $userId); foreach ($iosTokens as $token) { $app = self::$_appList[$appId]; if ($app['platform'] == self::IOS) { $connection = self::_getConnection($appId); $badgeCount = $push['bubble']; $body['aps'] = array('badge' => (int) $badgeCount, 'alert' => $push['message'], 'sound' => 'default'); if ($push['data']) { $body['p'] = json_decode($push['data']); } $messageId = self::_getMessageId(); $body['ID'] = $messageId; $payload = json_encode($body); $deviceToken = $token; $notification = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; fwrite($connection, $notification, strlen($notification)); self::_insertToSQL(self::IOS, $push, $token, $userId, $appId, $messageId); } } $androidTokens = \Util\Tools\PushRedis::getAndroidToken($appId, $userId); if ($androidTokens) { $app = self::$_appList[$appId]; if ($app['platform'] == self::ANDROID) { $secret = $app['xm_app_secret']; $package = $app['package_name']; Constants::setPackage($package); Constants::setSecret($secret); $UserRegIds = $androidTokens; $title = $push['title']; if ($title || empty($title)) { $title = "赶集"; } $desc = $push['message']; $payload = json_decode($push['data']); $messageId = self::_getMessageId(); $payload->push_message_id = $messageId; $sender = new Sender(); $message1 = new Builder(); $message1->passThrough($push['pass_though']); // 这是一条通知栏消息,如果需要透传,把这个参数设置成1,同时去掉title和descption两个参数 if ($push['pass_though'] != 1) { $message1->title($title); // 通知栏的title $message1->description($desc); // 通知栏的descption } $message1->payload(json_encode($payload)); // 携带的数据,点击后将会通过客户端的receiver中的onReceiveMessage方法传入。 $message1->extra(Builder::notifyForeground, 1); // 应用在前台是否展示通知,如果不希望应用在前台时候弹出通知,则设置这个参数为0 $message1->notifyId(2); // 通知类型。最多支持0-4 5个取值范围,同样的类型的通知会互相覆盖,不同类型可以在通知栏并存 $message1->build(); $targetMessage = new TargetedMessage(); $targetMessage->setMessage($message1); $sender->sendToIds($message1, $UserRegIds)->getRaw(); foreach ($androidTokens as $token) { $state = self::_insertToSQL(self::ANDROID, $push, $token, $userId, $appId, $messageId); } } } } } } $currentTime = time(); if ($currentTime - $startTime > 178) { break; } } echo "ran end"; }