
ãã¥ãŒããªã¢ã«ã®äžç°ãšããŠãGCMãµãŒããŒã«ã¡ãã»ãŒãžãéä¿¡ããããã®æ¬æ Œçãªã¯ã©ã¹ãäœæããŸãã
- éä¿¡çšã®å
¥åããŒã¿é
åãåãåããŸã
- ããããæ倧4096kbãéä¿¡ããããã®ããã±ãŒãžã圢æããŸãã
- 䞊åãªã¯ãšã¹ãã§ãã±ãããéä¿¡ããŸãã
- çãã解æããç¥ã£ãŠããïŒ
- ã¡ãã»ãŒãžãæ£åžžã«é
ä¿¡ããããã©ãã
- ãšã©ãŒã®çš®é¡
Google Cloud Messaging-ç°¡æœãã€æ確
GCMã¯ã€ã³ã¹ã¿ã³ãã¡ãã»ãŒãžã³ã°ãµãŒãã¹ã§ãã æšæºã®ããŒãªã³ã°ãšé·ãããŒãªã³ã°ã®ä»£æ¿æ段ã§ãããæä»çã§ã¯ãããŸããããããããè£å®ããŸãã Googleã¯ãã¡ãã»ãŒãžãé
ä¿¡ãããããšãä¿èšŒããŸããïŒãã ããé
ä¿¡ã®ä¿¡é Œæ§ãšé床ã¯ãC2DMã®ç¥å
ã«æ¯ã¹ãŠåçŽã«ã¹ããŒã¹ã«ãªããŸããïŒã é»è©±ã§ã€ã³ã¿ãŒãããããªãã®å Žåãã¡ãã»ãŒãžã¯æ倧4é±éGCMãµãŒããŒã«ä¿åãããŸãã ã€ãŸãããŠãŒã¶ãŒãé»è©±ããªãã«ããŠäŒæãåããå°çãããšã¡ãã»ãŒãžãåä¿¡ããªããªãå¯èœæ§ããããŸãã ãã®ãããGCMã¯ãããšãã°åºæ¬ããŒãªã³ã°-Nåããšã«ãµãŒããŒã«httpèŠæ±ãéä¿¡ãããªã©ãä¿¡é Œã§ããé
ä¿¡æ¹æ³ã§ã®ã¿åäœããå¿
èŠããããŸãã
ã©ã®Androidã¢ããªã±ãŒã·ã§ã³ããGCMããã®ã¡ãã»ãŒãžã®åä¿¡è
ãšããŠèªåèªèº«ãç»é²ã§ããŸãã ã€ã³ã¿ãŒãããããªã³ã«ãªã£ãŠãããšãç»é²ã¯æ°ç§ã§è¡ãããŸãã ãããçºçãããšããã«ãã¢ããªã±ãŒã·ã§ã³ã¯GCMãµãŒããŒããRegistrationIdãåãåããŸããããã¯ãµãŒããŒã«éä¿¡ããå¿
èŠããããŸãã ãã®çµæããµãŒããŒããŒã¿ããŒã¹ã«ã¯ãããšãã°ãRegistrationIdãå«ãããã€ã¹ã«é¢ããæ
å ±ãæ ŒçŽããDevicesããŒãã«ããããŸãã
ããã€ã¹ãã¡ãã»ãŒãžã®åä¿¡ãéå§ããã«ã¯ããµãŒããŒã³ãŒããPOSTèŠæ±ãjson圢åŒã§GCMãµãŒããŒã«éä¿¡ããå¿
èŠããããŸãïŒéåžžã®ããŒ=>å€ãéä¿¡ããããšãã§ããŸãããjsonããå§ãããŸãïŒã ãµãŒããŒå¿çã«ã¯jsonãå«ãŸããŸããããã«ãããã¡ãã»ãŒãžãé
ä¿¡ããããã©ãããé
ä¿¡ãããŠããªãå Žåã¯ã©ã®ãšã©ãŒãçºçããããåæã§ããŸãã
ããå§ããŸããã
GcmPayloadãšGcmSenderã®2ã€ã®ã¯ã©ã¹ãäœæããŸãããã
ãªã¹ãã£ã³ã°class GcmPayload { public function __construct($regId, $jsons) {} public $regId; public $jsons; } class GcmSender { public function __construct($payloads) {} public function send() {} protected function getPackages() {} protected function isReadyToFlush($items, $json) {} public function onResponse($response, $info, RollingCurlRequest $request) {} }
GCMã®çšèªã§ã¯ããã€ããŒãã¯åä¿¡è
ã«éä¿¡ããããŒã¿ã§ãã ãã®ããŒã¿ã¯ãããŒã¿ããŒã®å€ã«æ ŒçŽããå¿
èŠãããã4096ãã€ãã®å¶éããããŸãã
èŠæ±åœ¢åŒã«é¢ãã詳现 ã
GcmPayload-1人ã®åä¿¡è
ããããã£ãŠ1ã€ã®RegistrationIdã®ããŒã¿ã¢ãã«ã $ jsonsãã£ãŒã«ãã¯ããã®åä¿¡è
ã«éä¿¡ãããããŒã¿ãå«ãæåå圢åŒã®json'ovã®é
åã§åæåããå¿
èŠããããŸãã ãã¥ãŒããªã¢ã«ãç°¡çŽ åããããã«ãããã¯ã¯ã©ã¹ã®å€éšã§ãããšãã°æ¬¡ã®ããã«è¡ããããšèããŠããŸãã
ãªã¹ãã£ã³ã° $recipients = $messagesRepository->getRecipientsWithNewMessages(); $payloads = array(); foreach ($recipients as $recipient) { $jsons = array(); foreach ($recipient->messages as $message) { $jsons[] = json_encode($message); } $payloads[] = new GcmPayload($recipient['regId'], $jsons); } $gcm = new GcmSender(); $gcm->send($payloads);
Gcmsender
å®æ°ãšã¯ã©ã¹ã¡ã³ããŒ
const GCM_API_KEY = 'your api key'; // Google APIã³ã³ãœãŒã«ããŒãžã«ã¢ã¯ã»ã¹ããå¿
èŠããã
const CURL_TIMEOUT = 10; // GoogleãµãŒããŒã®ã¿ã€ã ã¢ãŠãïŒç§ïŒ
const GCM_MAX_DATA_SIZE = 4096; //éä¿¡ããŒã¿ã®ãã€ãåäœã®å¶é
const GCM_SERVER_URL = 'https://android.googleapis.com/gcm/send'; // GCMãµãŒããŒã¢ãã¬ã¹
const GCM_MAX_CONNECTIONS = 10; //åæãªã¯ãšã¹ãã®æ°
const KEY_REG_IDS = 'registration_ids'; // JSONãªã¯ãšã¹ãã®åä¿¡è
ããŒ
const KEY_DATA = 'data'; // JSONãªã¯ãšã¹ãã®ããŒã¿ããŒ
const KEY_ITEMS = 'items'; //ããŒã¿é
åãå«ãããŒã¿ãªããžã§ã¯ããããŒå
¥åããŸã
const REGID_PLACEHOLDER = '_REGID_'; // JSONãªã¯ãšã¹ããã³ãã¬ãŒãã®RegistrationIdã®ãã¬ãŒã¹ãã«ããŒ
const ITEMS_PLACEHOLDER = '_ITEMS_'; // JSONãªã¯ãšã¹ããã³ãã¬ãŒãå
ã®ããŒã¿ã®é
åã®ãã¬ãŒã¹ãã«ããŒ
const GCM_ERROR_NOTRcture = 'NotRegistered'; //ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ãã¢ã³ã€ã³ã¹ããŒã«ããå Žåã®ãšã©ãŒã®å®æ°
ä¿è·ããã$ _template; // JSONãªã¯ãšã¹ããã³ãã¬ãŒã
protected $ _baseDataSize; //é
ç®ããŒãæ¬åŒ§åŒçšç¬Šãªã©ãå«ãåæããŒã¿ãµã€ãº
ã³ã³ã¹ãã©ã¯ã¿ãŒ
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãgetPackagesã¡ãœããã§äœ¿çšãããèŠæ±ãã³ãã¬ãŒããäœæããŸãã ããŒã¿ããã4096ãã€ãã®å¶éãæœåšçã«è¶
ããªãããã«ããã³ãã¬ãŒãã®åæããŒã¿ã®ãµã€ãºãèŠããŠèæ
®ããå¿
èŠãããããšã«æ³šæããŠãã ããïŒ{"items"ïŒ[]}
ãªã¹ãã£ã³ã° public function __construct() { $dataObj = '{"'.self::KEY_ITEMS.'": ['.self::ITEMS_PLACEHOLDER.']}'; $this->_template = '{ "'.self::KEY_REG_IDS.'": ["'.self::REGID_PLACEHOLDER.'"], "'.self::KEY_DATA.'": '.$dataObj.' }'; $baseDataJson = str_replace(self::ITEMS_PLACEHOLDER, '', $dataObj); $this->_baseDataSize = strlen($baseDataJson); }
éä¿¡æ¹æ³
GCMãµãŒããŒã«ããŒã¿ãçŽæ¥éä¿¡ããã«ã¯ããã®ãããªãã¯ã¡ãœãããåŒã³åºãå¿
èŠããããŸãã ãã®ã¡ãœããã¯éä¿¡çšã®ããŒã¿ãåãå
¥ããŸããããã¯getPackagesã¡ãœããã«ãã£ãŠããŒã¿ãã±ããã«å€æãããŸã-json圢åŒã®æºåæžã¿ãã¹ãããŒã¿ïŒ1ãã±ãã-1èŠæ±ïŒã§ã4096ãã€ããè¶
ããªãããšãä¿èšŒãããŸãã æ®ãã®ã¡ãœããã¯ãçŽ æŽããã
RollingCurlã©ã€ãã©ãªã®åæåã§ãããã®ã©ã€ãã©ãªã¯curl_multi_execã䜿çšããŠäœæ¥ãã«ãã»ã«åãããªã¯ãšã¹ãã䞊è¡ããŠéä¿¡ããééçãªã³ãŒããèšè¿°ã§ããããã«ããŸãã RollingCurlãã³ãŒã«ããã¯ã¡ãœããonResponseã§åæåããéä¿¡çµæãåæããŸãã 次ã¯ãããŒã¿éä¿¡èªäœã§ãã
ãªã¹ãã£ã³ã° public function send($payloads) { $packages = self::getPackages($payloads); if (!$packages || count($packages) == 0) return; $rc = new RollingCurl(array($this, 'onResponse')); $headers = array('Authorization: key='.self::GCM_API_KEY, 'Content-Type: application/json'); $rc->__set('headers', $headers); $rc->options = array( CURLOPT_SSL_VERIFYPEER => false,
GetPackagesã¡ãœãã
ãã®ã¡ãœããã§ã¯ãã¯ã©ã¹ã«æž¡ããããã€ããŒãã®é
åããœãŒããããã³ã³ã¹ãã©ã¯ã¿ãŒã§äœæããããã³ãã¬ãŒãã¯ããã±ããã4096ãã€ãã®å¶éãè¶
ããããåä¿¡è
ã®ããŒã¿ãçµäºããªããŸã§åŸã
ã«æºããããŸãã ãšããã§ããã®äŸã§ã¯ã1ã€ã®ãã±ããã1ã€ã®åä¿¡è
ã§ãããšèŠãªããŸãã ããã¯ã©ãããæå³ã§ããïŒ ããšãã°ãããã¹ãã¡ãã»ãŒãžã1人ã ãã«å®ãŠãããŠããå Žåããã®ãããªèŠåã¯åœãŠã¯ãŸããŸãã ãã ããã°ã«ãŒãäŒè©±ã§ã¯ãåãã¡ãã»ãŒãžãè€æ°ã®äººã«éä¿¡ã§ããŸããGCMã§ã¯ãregistration_idsããŒã®å€ã«è€æ°ã®RegistrationIdãæå®ããããšã§ãããèš±å¯ããŠããŸãã ãã ãããã®äŸã§ã¯ãäžå¿
èŠãªå䜵çãé¿ããããããã®ã±ãŒã¹ã¯èæ
®ãããŠããŸããã
getPackagesã¡ãœããã«æ»ããŸãã å®éãisReadyToFlushé¢æ°ã¯ããã§éèŠã§ããããã¯ãããã±ãŒãžã«æ°ããjsonãè¿œå ãããš4096ãã€ãã®å¶éãè¶
ãããã©ããã決å®ããŸãã ã¯ãã®å Žåãããã±ãŒãžã¯ããã«çµäºãããã®jsonãæ°ããããã±ãŒãžã«è¿œå ãããŸãã
ãªã¹ãã£ã³ã° protected function getPackages($payloads) { $packages = array(); foreach($payloads as $payload) { $template = str_replace(self::REGID_PLACEHOLDER, $payload->regId, $this->_template); $items = ''; foreach($payload->jsons as $json) { if ($this->isReadyToFlush($items, $json)) { $package = str_replace(self::ITEMS_PLACEHOLDER, $items, $template); $packages[] = $package; $items = ''; } if ($items) $items .= ','.$json; else $items = $json; } if ($items) {
OnResponseã¡ãœãã
ã¡ãã»ãŒãžãéä¿¡ããã ãã§ãªããã¡ãã»ãŒãžãé
ä¿¡ããããã©ããããŸãé
ä¿¡ãããªãå Žåã¯ããã®çç±ãç解ããããšãéèŠã§ãã onResponseã¯ãsendã¡ãœããã§RollingCurlãåæåããã³ãŒã«ããã¯ã§ãã Kolbekã¯3ã€ã®ãã©ã¡ãŒã¿ãŒãåãå
¥ããŸãã
- $ response-æååã¬ã¹ãã³ã¹
- $ infoã¯curl_getinfoé¢æ°php.net/manual/en/function.curl-getinfo.phpã®çµæã§ãããå¿çhttpã³ãŒãããå§ãŸãã¢ããããŒã/ããŠã³ããŒãé床ã§çµããããŒã¿è»¢éããŒã¿ã®é
åãè¿ããŸãã ãã ãããã®ãã¥ãŒããªã¢ã«ã§ã¯ãhttpå¿çã³ãŒãã®ã¿ãèå³æ·±ããã®ã§ãã
- RollingCurlRequest $ request-ãªã¯ãšã¹ãæ
å ±ã $ request-> post_dataã«èå³ããããŸã
é¢æ°ãªã¹ãã®ã³ã¡ã³ãã¯ããéåŒã«ãªããŸãã
ãªã¹ãã£ã³ã° public function onResponse($response, $info, RollingCurlRequest $request) {
ã¢ããããŒã1jcrowã¯ãRegistrationIdã®æŽæ°äžã«åŸ
æ©ããå¯èœæ§ããã
èœãšãç©Žã«ã€ããŠã®
ã³ã¡ã³ããæ±ããŸãã ç¶æ³ïŒãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ãã¢ã³ã€ã³ã¹ããŒã«ããã€ã³ã¹ããŒã«ãã=>å床åç»é²ããŠãæ°ããRegistrationIdãåãåããŸããã ããŒã¿ããŒã¹ã«ã¯ãåããŠãŒã¶ãŒã®2ã€ã®ã¬ã³ãŒããæ¢ã«ãããŸãã ãããŠã1ã€ã®ã¬ã³ãŒãã¯å€ãRegistrationIdã§ããã1ã€ã®ã¬ã³ãŒãã¯æ°ããRegistrationIdã§ãã äž¡æ¹ã®RegistrationIdã«ã¡ãã»ãŒãžãéä¿¡ãããšãå€ããã®ã«ã¯æ°ããRegistrationIdãå±ããŸãã ãã®çµæãåãRegistrationIdãæã€1人ã®ãŠãŒã¶ãŒã«å¯ŸããŠ2ã€ã®ãšã³ããªããããŸãã
ãã®çµæãããŒã¿ããŒã¹ã®RegistrationIdãã£ãŒã«ãã«äžæã®ã€ã³ããã¯ã¹ãããå Žåããšã©ãŒãçºçããŸãã ã€ã³ããã¯ã¹ããªãå Žåãã¢ããªã±ãŒã·ã§ã³ãŠãŒã¶ãŒã¯æ¯å2ã€ã®åäžã®ã¡ãã»ãŒãžãåãåããŸãã
解決çïŒonResponseã§æ°ããRegistrationIdãåãåã£ããããã«ãããŒã¿ããŒã¹ã§ãã®ååšã確èªããå¿
èŠããããŸãã ãããŠãè¯å®çãªå Žåãã¬ã³ãŒãã®1ã€ãåé€ããããã¬ã³ãŒããšé¢é£ããŒã¿ã®äž¡æ¹ãä»ã®ããŒãã«ããä¿æããŸãã
次ã«äœãããïŒ
ããšãã°ãã¡ãã»ãŒãžãé
ä¿¡ããããšããã¹ããŒã¿ã¹ãããŒã¿ããŒã¹ã«å
¥ããããšãã§ããŸãã ãã ããGCMãµãŒããŒãžã®æ£åžžãªéä¿¡ã¯ããŠãŒã¶ãŒã®ã¹ããŒããã©ã³ã«ããã¡ãã»ãŒãžã®å®éã®åä¿¡ãæå³ãããã®ã§ã¯ãªãããšãèŠããŠããå¿
èŠããããŸãã ããã«ãäŒæã®äŸãæãåºããšãonResponseã§ã¹ããŒã¿ã¹ãèšå®ã§ããªãããšãæããã«ãªããŸãã ãããªãã©ãïŒ éžæè¢ã¯1ã€ã ãã§ããããŒãªã³ã°ã§ããŒã¿ãåä¿¡ãããšãã«ã¹ããŒã¿ã¹ãèšé²ããŸãã æ®å¿µãªãããã»ãšãã©ã®å Žåãããã¯åä¿¡è
ãåãããŒã¿ã2ååä¿¡ããããšãæå³ããŸãã ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§ããã®ããŒã¿ãæ¢ã«åä¿¡ãããŠãããã©ãããå€æã§ããåä¿¡ãããŠããå Žåã¯ç¡èŠã§ããŸãã ãã®ã¢ãããŒãã®äž»ãªå©ç¹ã¯ä¿¡é Œæ§ã§ãããããŒã¿ã¯åžžã«é
ä¿¡ãããŸãã çæ-å¢å ãããã©ãã£ãã¯ãšããããªãŒæ¶è²»ã
å
¬åŒã®ããã¥ã¡ã³ããèªãã§ããªãå Žåã¯ã
èªãããšããå§ã
ããŸãã
ããšãã
ãã®ãã¥ãŒããªã¢ã«ã誰ãã®åºçºç¹ã«ãªãã ãã§ãªããAndroidã¢ããªã±ãŒã·ã§ã³ã®ããã¯ãšã³ãã®éçºæéãççž®ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã