From ed7add6d9c8fc5ff99897e92c6fd3862c0febd21 Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Wed, 28 Oct 2020 00:37:55 +0900 Subject: [PATCH] Separate device type (android/ios) from token type (fcm/apns) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 애플 기기에서도 FCM을 사용하여 푸시알림을 구현할 수 있으므로 디바이스의 운영체제와 무관하게 토큰 타입을 지정하도록 변경합니다. 기존에 등록된 토큰은 운영체제 및 포맷에 따라 자동 변환합니다. --- common/framework/push.php | 31 +++++++++---------- modules/member/member.class.php | 11 +++++++ modules/member/member.controller.php | 21 ++++++------- .../getMemberDeviceTokensByMemberSrl.xml | 4 +-- modules/member/queries/insertMemberDevice.xml | 1 + modules/member/schemas/member_devices.xml | 1 + 6 files changed, 39 insertions(+), 30 deletions(-) diff --git a/common/framework/push.php b/common/framework/push.php index e1512570e..3dd1b7236 100644 --- a/common/framework/push.php +++ b/common/framework/push.php @@ -290,10 +290,10 @@ class Push $output = null; // Android FCM - if(count($tokens->android)) + if(count($tokens->fcm)) { $fcm_driver = $this->getDriver('fcm'); - $output = $fcm_driver->send($this, $tokens->android); + $output = $fcm_driver->send($this, $tokens->fcm); $this->sent = count($output->success) ? true : false; $this->success_tokens = $output ? $output->success : []; $this->deleted_tokens = $output ? $output->invalid : []; @@ -303,10 +303,10 @@ class Push } // iOS APNs - if(count($tokens->ios)) + if(count($tokens->apns)) { $apns_driver =$this->getDriver('apns'); - $output = $apns_driver->send($this, $tokens->ios); + $output = $apns_driver->send($this, $tokens->apns); $this->sent = count($output->success) ? true : false; $this->success_tokens += $output ? $output->success : []; $this->deleted_tokens += $output ? $output->invalid : []; @@ -339,26 +339,25 @@ class Push */ protected function _getDeviceTokens() { - $member_srl_list = $this->getRecipients(); $result = new \stdClass; - $result->android = []; - $result->ios = []; + $result->fcm = []; + $result->apns = []; $args = new \stdClass; - $args->member_srl = $member_srl_list; - $args->device_type = []; + $args->member_srl = $this->getRecipients(); + $args->device_token_type = []; $driver_types = config('push.types') ?: array(); - if(!count($driver_types)) - { - return $result; - } if(isset($driver_types['fcm'])) { - $args->device_type[] = 'android'; + $args->device_token_type[] = 'fcm'; } if(isset($driver_types['apns'])) { - $args->device_type[] = 'ios'; + $args->device_token_type[] = 'apns'; + } + if(!count($args->device_token_type)) + { + return $result; } $output = executeQueryArray('member.getMemberDeviceTokensByMemberSrl', $args); @@ -369,7 +368,7 @@ class Push foreach($output->data as $row) { - $result->{$row->device_type}[] = $row->device_token; + $result->{$row->device_token_type}[] = $row->device_token; } return $result; diff --git a/modules/member/member.class.php b/modules/member/member.class.php index cd2027dd8..b27616fa2 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -200,6 +200,8 @@ class member extends ModuleObject { if(!$oDB->isIndexExists('member_nickname_log', 'idx_after_nick_name')) return true; if(!$oDB->isIndexExists('member_nickname_log', 'idx_user_id')) return true; + if(!$oDB->isColumnExists('member_devices', 'device_token_type')) return true; + $config = ModuleModel::getModuleConfig('member'); // Check members with phone country in old format @@ -372,6 +374,15 @@ class member extends ModuleObject { $oDB->addIndex('member_nickname_log', 'idx_user_id', array('user_id')); } + // Add device token type 2020.10.28 + if(!$oDB->isColumnExists('member_devices', 'device_token_type')) + { + $oDB->addColumn('member_devices', 'device_token_type', 'varchar', '20', '', true, 'device_token'); + $oDB->addIndex('member_devices', 'idx_device_token_type', array('device_token_type')); + $oDB->query("UPDATE member_devices SET device_token_type = 'fcm' WHERE device_type = 'android' OR LENGTH(device_token) > 64"); + $oDB->query("UPDATE member_devices SET device_token_type = 'apns' WHERE device_type = 'ios' AND LENGTH(device_token) = 64"); + } + $config = ModuleModel::getModuleConfig('member'); $changed = false; diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index cc4fe425b..0c6453c9d 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -68,7 +68,7 @@ class memberController extends member $args = new stdClass(); $args->member_srl = $member_info->member_srl; executeQuery('member.deleteAuthMail', $args); - + if(!$config->after_login_url) { $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', ''); @@ -99,6 +99,7 @@ class memberController extends member if(!$password && !$allow_guest_device) return new BaseObject(-1, 'NULL_PASSWORD'); if(!$device_token) return new BaseObject(-1, 'NULL_DEVICE_TOKEN'); + // Get device information $browserInfo = Rhymix\Framework\UA::getBrowserInfo(); $device_type = strtolower($browserInfo->os); $device_version = $browserInfo->os_version; @@ -107,23 +108,18 @@ class memberController extends member $device_model = escape($browserInfo->device); } - if('ios' === $device_type) + // Detect device token type + if (preg_match('/^[0-9a-z]{64}$/', $device_token)) { - if(!preg_match("/^[0-9a-z]{64}$/", $device_token)) - { - return new BaseObject(-1, 'INVALID_DEVICE_TOKEN'); - } + $device_token_type = 'apns'; } - elseif('android' === $device_type) + elseif (preg_match('/^[0-9a-zA-Z:_-]+$/', $device_token) && strlen($device_token) > 64) { - if(!preg_match("/^[0-9a-zA-Z:_-]+$/", $device_token)) - { - return new BaseObject(-1, 'INVALID_DEVICE_TOKEN'); - } + $device_token_type = 'fcm'; } else { - return new BaseObject(-1, 'NOT_SUPPORTED_OS'); + return new BaseObject(-1, 'INVALID_DEVICE_TOKEN'); } if($user_id && $password) @@ -151,6 +147,7 @@ class memberController extends member $args->device_srl = getNextSequence(); $args->member_srl = $member_srl; $args->device_token = $device_token; + $args->device_token_type = $device_token_type; $args->device_key = $device_key; $args->device_type = $device_type; $args->device_version = $device_version; diff --git a/modules/member/queries/getMemberDeviceTokensByMemberSrl.xml b/modules/member/queries/getMemberDeviceTokensByMemberSrl.xml index bafd4571b..3e7cb9969 100644 --- a/modules/member/queries/getMemberDeviceTokensByMemberSrl.xml +++ b/modules/member/queries/getMemberDeviceTokensByMemberSrl.xml @@ -4,10 +4,10 @@ - + - + diff --git a/modules/member/queries/insertMemberDevice.xml b/modules/member/queries/insertMemberDevice.xml index fc67efcf6..518f72284 100644 --- a/modules/member/queries/insertMemberDevice.xml +++ b/modules/member/queries/insertMemberDevice.xml @@ -6,6 +6,7 @@ + diff --git a/modules/member/schemas/member_devices.xml b/modules/member/schemas/member_devices.xml index cb39ba8de..60d1aa94b 100644 --- a/modules/member/schemas/member_devices.xml +++ b/modules/member/schemas/member_devices.xml @@ -2,6 +2,7 @@ +