3

推送通知的最大字符为 256 个字节,当我尝试以阿拉伯语编码发送消息时,最大长度小于 50 个字符,

我使用这个 php 文件:

    <?php

// Put your device token here (without spaces):
$deviceToken = '2ca0c25ed7acea73e19c9d9193e57a12c1817ed48ddf8f44baea42e68a51563c';

// Put your private key's passphrase here:
$passphrase = 'pushp12';

// Put your alert message here:
$message = 'الاشعار الاول للتطبيق مرحبا بكم واهلا وسهلا';

////////////////////////////////////////////////////////////////////////////////

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
    'ssl://gateway.sandbox.push.apple.com:2195', $err,
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
    exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
    'alert' => $message,
    'sound' => 'default'
    );

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
    echo 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

?>

APNS拒绝上面的消息是因为太长了,否则英文字符最大长度正常

请问我该怎么办!

4

1 回答 1

3

PHPjson_encode()函数对阿拉伯字符使用 Unicode 转义序列,因此$payload变为:

{"aps":{"alert":"\u0627\u0644 ... \u0644\u0627","sound":"default"}}

总长度为 266 个字符。这有效的(比较http://json.org),但是对于 APNS 来说,payload 太长了。每个阿拉伯字符使用 6 个字节而不是 2 个 UTF-8 字节。

根据https://stackoverflow.com/a/10835469/1187415,您可以使用

$payload = json_encode($body, JSON_UNESCAPED_UNICODE);

在 PHP 5.4.0 或更高版本中关闭 Unicode 转义。我无法对此进行测试,因为我的 PHP 版本较旧。

唯一的另一种选择是不json_encode()“手动”使用和创建 JSON 字符串。


更新: Apple 增加了允许的最大有效负载大小。来自本地和远程通知编程指南的远程通知有效负载

使用 HTTP/2 提供程序 API 时,最大有效负载大小为 4096 字节。使用传统二进制接口,最大有效负载大小为 2048 字节。

这使得使用“旧接口”可以对超过 300 个阿拉伯字符进行 JSON 编码,甚至可以使用基于 HTTP/2 的新接口。

于 2013-08-15T14:02:01.307 回答