Push-сообщение Apple

#ios4 #push-notification #apple-push-notifications

#ios4 #push-уведомление #apple-push-уведомления

Вопрос:

Я интегрирую сервер Push-провайдера с кодами (php-apns) из Google codes. Кажется, все в порядке, за исключением количества байтов в сообщении.

Количество байтов в полезной нагрузке должно составлять не более 256 символов.

Если отправлено несколько символов китайского языка или UTF8. После JSON_enode каждый символ будет занимать 6 байт. Я прав?

Таким образом, максимальное количество символов UTF8 в каждом push-сообщении составляет около 38.

Но… Whatsapp (приложение для iPhone) тоже использует PUSH, но может использовать больше китайских символов… в одном push-сообщении?

Есть какой-нибудь намек?

Ответ №1:

Вот решение вашей проблемы:

перейдите к ~/APNS/Message.php

и замените эту функцию:

 public function getPayload() {...}
  

с помощью этого:

 /**
 * Convert the message in a JSON-encoded payload.
 *
 * @throws ApnsPHP_Message_Exception if payload is longer than maximum allowed
 *         size and AutoAdjustLongPayload is disabled.
 * @return @type string JSON-encoded payload.
 */
public function getPayload()
{
    $sJSONString = preg_replace_callback('/\u([0-9a-f]{4})/i', 
                        function($matches) {
                            if (function_exists('mb_convert_encoding')) {
                                return mb_convert_encoding(pack('H*', $matches[1]), 'UTF-8', 'UTF-16');
                            } else {
                                //Slower conversion from UTF-16 to UTF-8 (BMP Only)
                                //See: http://www.cl.cam.ac.uk/~mgk25/unicode.html
                                $decimal_code = hexdec($matches[1]);
                                $character = "";
                                if ((0x7F amp; $decimal_code) == $decimal_code) {
                                    //UTF-8 1-byte aka ASCII
                                    $first_byte     = 0x7F amp; $decimal_code;
                                    $character      = chr($first_byte);
                                } elseif ((0x7FF amp; $decimal_code) == $decimal_code) {
                                    //UTF-8 2-bytes
                                    $first_byte     = 0xC0 | (($decimal_code >> 6) amp; 0x1F);
                                    $second_byte    = 0x80 | ($decimal_code amp; 0x3F);
                                    $character      = chr($first_byte) . chr($second_byte);
                                } elseif ((0xFFFF amp; $decimal_code) == $decimal_code) {
                                    //UTF-8 3-bytes
                                    $first_byte     = 0xE0 | (($decimal_code >> 12) amp; 0x0F);
                                    $second_byte    = 0x80 | (($decimal_code >> 6) amp; 0x3F);
                                    $third_byte     = 0x80 | ($decimal_code amp; 0x3F);
                                    $character      = chr($first_byte) . chr($second_byte) . chr($third_byte);
                                }
                                return $character;
                            }
                        },
                        json_encode($this->_getPayload()));
    $sJSONPayload = str_replace(
        '"' . self::APPLE_RESERVED_NAMESPACE . '":[]',
        '"' . self::APPLE_RESERVED_NAMESPACE . '":{}',
        $sJSONString
    );
    $nJSONPayloadLen = strlen($sJSONPayload);

    if ($nJSONPayloadLen > self::PAYLOAD_MAXIMUM_SIZE) {
        if ($this->_bAutoAdjustLongPayload) {
            $nMaxTextLen = $nTextLen = strlen($this->_sText) - ($nJSONPayloadLen - self::PAYLOAD_MAXIMUM_SIZE);
            if ($nMaxTextLen > 0) {
                while (strlen($this->_sText = mb_substr($this->_sText, 0, --$nTextLen, 'UTF-8')) > $nMaxTextLen);
                return $this->getPayload();
            } else {
                throw new ApnsPHP_Message_Exception(
                    "JSON Payload is too long: {$nJSONPayloadLen} bytes. Maximum size is " .
                    self::PAYLOAD_MAXIMUM_SIZE . " bytes. The message text can not be auto-adjusted."
                );
            }
        } else {
            throw new ApnsPHP_Message_Exception(
                "JSON Payload is too long: {$nJSONPayloadLen} bytes. Maximum size is " .
                self::PAYLOAD_MAXIMUM_SIZE . " bytes"
            );
        }
    }

    return $sJSONPayload;
}
  

Tada!
теперь вы сможете без проблем получать длинные сообщения в формате utf-8.

Источник

Ответ №2:

Я обнаружил это.

Если эти китайские символы UTF8 имеют кодировку JSON_encoded, то она преобразуется в 6 символов.

Поэтому мне нужно изменить php-apns, чтобы убедиться, что эти символы UTF8 будут помещены в строку JSON_encoded для экономии места