mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-03 16:51:40 +09:00
push 모듈 중간 커밋
This commit is contained in:
parent
2b961a2e8a
commit
4dcb8d741b
5 changed files with 162 additions and 14 deletions
|
|
@ -41,11 +41,49 @@ class APNs extends Base implements \Rhymix\Framework\Drivers\PushInterface
|
|||
* This method returns true on success and false on failure.
|
||||
*
|
||||
* @param object $message
|
||||
* @param array $tokens
|
||||
* @return bool
|
||||
*/
|
||||
public function send(\Rhymix\Framework\Push $message): bool
|
||||
public function send(\Rhymix\Framework\Push $message, array $tokens): bool
|
||||
{
|
||||
// TODO
|
||||
return false;
|
||||
$status = true;
|
||||
|
||||
// Set parameters
|
||||
$local_cert = $this->_config['certificate'];
|
||||
$passphrase = $this->_config['passphrase'];
|
||||
$alert = [];
|
||||
$alert['title'] = $message->getSubject();
|
||||
$alert['body'] = $message->getContent();
|
||||
if($message->getImage())
|
||||
{
|
||||
$alert['image'] = $message->getImage();
|
||||
}
|
||||
|
||||
$body['aps'] = array('alert' => $alert,'sound' => 'default');
|
||||
$payload = json_encode($body);
|
||||
|
||||
foreach($tokens as $token)
|
||||
{
|
||||
$ctx = stream_context_create();
|
||||
stream_context_set_option($ctx, 'ssl', 'local_cert', $local_cert);
|
||||
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
|
||||
|
||||
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 5, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
|
||||
if(!$fp)
|
||||
{
|
||||
$message->addError('Failed to connect socket - error code: '. $err .' - '. $errstr);
|
||||
$status = false;
|
||||
}
|
||||
$msg = chr(0) . pack('n', 32) . pack('H*', $token) . pack('n', strlen($payload)) . $payload;
|
||||
$result = fwrite($fp, $msg, strlen($msg));
|
||||
if(!$result)
|
||||
{
|
||||
$message->addError('APNs return empty response.');
|
||||
$status = false;
|
||||
}
|
||||
fclose($fp);
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -85,9 +85,10 @@ abstract class Base implements \Rhymix\Framework\Drivers\PushInterface
|
|||
* This method returns true on success and false on failure.
|
||||
*
|
||||
* @param object $message
|
||||
* @param array $tokens
|
||||
* @return bool
|
||||
*/
|
||||
public function send(\Rhymix\Framework\Push $message): bool
|
||||
public function send(\Rhymix\Framework\Push $message, array $tokens): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
namespace Rhymix\Framework\Drivers\Push;
|
||||
|
||||
use message;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
* The FCM (Google) Push driver.
|
||||
*/
|
||||
|
|
@ -41,11 +44,50 @@ class FCM extends Base implements \Rhymix\Framework\Drivers\PushInterface
|
|||
* This method returns true on success and false on failure.
|
||||
*
|
||||
* @param object $message
|
||||
* @param array $tokens
|
||||
* @return bool
|
||||
*/
|
||||
public function send(\Rhymix\Framework\Push $message): bool
|
||||
public function send(\Rhymix\Framework\Push $message, array $tokens): bool
|
||||
{
|
||||
// TODO
|
||||
return false;
|
||||
$status = true;
|
||||
|
||||
$url = 'https://fcm.googleapis.com/fcm/send';
|
||||
$api_key = $this->_config['api_key'];
|
||||
$headers = array('Authorization:key='.$api_key,'Content-Type: application/json');
|
||||
|
||||
// Set notification
|
||||
$notification = [];
|
||||
$notification['title'] = $message->getSubject();
|
||||
$notification['body'] = $message->getContent();
|
||||
if($message->getImage())
|
||||
{
|
||||
$notification['image'] = $message->getImage();
|
||||
}
|
||||
|
||||
// Set android options
|
||||
$options = [];
|
||||
$options['priority'] = 'normal';
|
||||
$options['notification']['click_action'] = 'RX_NOTIFICATION';
|
||||
|
||||
foreach($tokens as $i => $token)
|
||||
{
|
||||
$data = array('registration_ids' => $token, 'notification' => $notification, 'android' => $options, 'data' => $message->getData());
|
||||
$result = \FileHandler::getRemoteResource($url, $data, 5, 'POST', 'application/json', $headers);
|
||||
if($result)
|
||||
{
|
||||
$error = json_decode($result)->error_code;
|
||||
if($error)
|
||||
{
|
||||
$message->addError('FCM error code: '. $error);
|
||||
$status = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$message->addError('FCM return empty response.');
|
||||
$status = false;
|
||||
}
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,7 +51,8 @@ interface PushInterface
|
|||
* This method returns true on success and false on failure.
|
||||
*
|
||||
* @param object $message
|
||||
* @param array $tokens
|
||||
* @return bool
|
||||
*/
|
||||
public function send(\Rhymix\Framework\Push $message): bool;
|
||||
public function send(\Rhymix\Framework\Push $message, array $tokens): bool;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
namespace Rhymix\Framework;
|
||||
|
||||
use BaseObject;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
* The Push class.
|
||||
*/
|
||||
|
|
@ -14,8 +17,8 @@ class Push
|
|||
protected $to = array();
|
||||
protected $subject = '';
|
||||
protected $content = '';
|
||||
protected $image = '';
|
||||
protected $url = '';
|
||||
protected $image = '';
|
||||
protected $data = [];
|
||||
protected $errors = array();
|
||||
protected $sent = false;
|
||||
|
||||
|
|
@ -215,6 +218,28 @@ class Push
|
|||
{
|
||||
return $this->image;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a data to associate with this push notification.
|
||||
*
|
||||
* @param array $data
|
||||
* @return bool
|
||||
*/
|
||||
public function setData(array $data): bool
|
||||
{
|
||||
$this->data = $data;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the data associated with this push notification.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getData(): array
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a URL to associate with this push notification.
|
||||
|
|
@ -224,7 +249,7 @@ class Push
|
|||
*/
|
||||
public function setURL(string $url): bool
|
||||
{
|
||||
$this->url = $url;
|
||||
$this->data['url'] = $url;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -235,7 +260,7 @@ class Push
|
|||
*/
|
||||
public function getURL(): string
|
||||
{
|
||||
return $this->url;
|
||||
return $this->data['url'];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -261,8 +286,14 @@ class Push
|
|||
|
||||
try
|
||||
{
|
||||
//$this->getDriver('fcm');
|
||||
//$this->getDriver('apns');
|
||||
$tokens = $this->getDeviceToken();
|
||||
// Android FCM
|
||||
$fcm_driver = $this->getDriver('fcm');
|
||||
$this->sent = $fcm_driver->send($this, $tokens['android']);
|
||||
|
||||
// iOS APNs
|
||||
$apns_driver =$this->getDriver('apns');
|
||||
$this->sent = $apns_driver->send($this, $tokens['ios']);
|
||||
}
|
||||
catch(\Exception $e)
|
||||
{
|
||||
|
|
@ -278,6 +309,41 @@ class Push
|
|||
|
||||
return $this->sent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the device token
|
||||
*
|
||||
* @return array
|
||||
*
|
||||
*/
|
||||
protected function getDeviceToken(): array
|
||||
{
|
||||
$member_srl_list = $this->getRecipients();
|
||||
|
||||
$args = new stdClass;
|
||||
$args->member_srl = $member_srl_list;
|
||||
$output = executeQueryArray('member.getMemberDeviceByMemberSrl', $args);
|
||||
if(!$output->toBool())
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
$device_tokens = [];
|
||||
$device_tokens['android'] = array_map(function($device){
|
||||
if('android' === $device->device_type)
|
||||
{
|
||||
return $device->device_token;
|
||||
}
|
||||
}, $output->data);
|
||||
$device_tokens['ios'] = array_map(function($device){
|
||||
if('ios' === $device->device_type)
|
||||
{
|
||||
return $device->device_token;
|
||||
}
|
||||
}, $output->data);
|
||||
|
||||
return $device_tokens;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the message was sent.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue