Exemple #1
0
 /**
  * 从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";
 }