Apple Push Message - PullRequest
       25

Apple Push Message

3 голосов
/ 25 апреля 2011

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

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

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

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

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

Любой намек?

Ответы [ 2 ]

5 голосов
/ 07 июня 2012

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

перейдите в ~ / 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 & $decimal_code) == $decimal_code) {
                                    //UTF-8 1-byte aka ASCII
                                    $first_byte     = 0x7F & $decimal_code;
                                    $character      = chr($first_byte);
                                } elseif ((0x7FF & $decimal_code) == $decimal_code) {
                                    //UTF-8 2-bytes
                                    $first_byte     = 0xC0 | (($decimal_code >> 6) & 0x1F);
                                    $second_byte    = 0x80 | ($decimal_code & 0x3F);
                                    $character      = chr($first_byte) . chr($second_byte);
                                } elseif ((0xFFFF & $decimal_code) == $decimal_code) {
                                    //UTF-8 3-bytes
                                    $first_byte     = 0xE0 | (($decimal_code >> 12) & 0x0F);
                                    $second_byte    = 0x80 | (($decimal_code >> 6) & 0x3F);
                                    $third_byte     = 0x80 | ($decimal_code & 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;
}

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

источник

1 голос
/ 26 апреля 2011

Я выяснил это.

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

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

...