ios4 - 苹果推送消息

标签 ios4 push-notification apple-push-notifications

我正在将 Push Provider Server 与来自 google codes 的代码 (php-apns) 集成。除了每条消息的字节数外,一切似乎都很好。

每个负载的字节数最多应为 256 个字符。

如果发送一些中文字符或UTF8字符。在 JSON_enode 之后,每个字符将占用 6 个字节。我说得对吗?

所以每条推送消息的最大UTF8字符数在38个左右。

但是...Whatsapp(iPhone 应用程序)也使用 PUSH,但它可以在一条推送消息中推送更多汉字...?

有什么提示吗?

最佳答案

这是您的问题的解决方案:

转到 ~/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 消息。

source

关于ios4 - 苹果推送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5775196/

相关文章:

iphone - 适用于 iOS 4.0 应用程序的 NSFileProtectionComplete

ios - IBM Worklight - 可靠的推送通知

JavaPN 抛出 SSLHandshakeException java.io.EOFException : SSL peer shut down incorrectly

javascript - window.safari.pushNotification.requestPermission 始终返回 "denied"

添加 didReceiveRemoteNotification 时 iOS AppDelegate 崩溃

iPhone :UITableView CellAccessory Checkmark

iphone - 正确继承 EKEvent 类

ios4 - 自iOS 5以来,setProgress不再更新UIProgressView

php - 数据库插入或更新后向 Android 应用程序发送推送通知

ios - 向特定用户发送通知