推送emoji表情亂碼的解決方案

來源:互聯網
上載者:User
推送內容如果包含了emoji表情,需要做以下修改
1 mysql 要用5.5.3以上版本(如果不能升級,請用base64儲存,推送時再轉碼)
2 將表和推送內容表欄位修改成utf8mb4_unicode_ci編碼格式(不需要改系統的my.cnf,也不需要重啟mysql)

如果用了apnsphp來推送,可能依然會出現發送emoji表情變成?的問題:
請找到Message.php的getPayload方法,在convert轉碼判斷上加上"false &&"禁止執行。因為這段代碼會將部分emoji表情截斷。

$sJSON = json_encode($this->_getPayload(), defined('JSON_UNESCAPED_UNICODE') ? JSON_UNESCAPED_UNICODE : 0);if (false && !defined('JSON_UNESCAPED_UNICODE') && function_exists('mb_convert_encoding')) {$sJSON = preg_replace_callback('~\\\\u([0-9a-f]{4})~i',create_function('$aMatches', 'return mb_convert_encoding(pack("H*", $aMatches[1]), "UTF-8", "UTF-16");'),$sJSON);}

至此,就解決問題了。

後來,又發現一個問題:
在推送訊息時,由於apns在ios8以下版本只支援256個bytes,因此限制了push的訊息長度。在測試環境(php5.5)下可正確push的訊息,在正式環境(php5.3)下push的訊息被截斷了。經過代碼檢查,發現在push之前都會做json_encode,就是上述代碼的第一行,而如果是php5.4以下版本,defined('JSON_UNESCAPED_UNICODE') 等於 false。因此,會執行下面的if 判斷,為了支援emoji表情,忽略了判斷執行,導致產生的訊息長度在json_encode之後查過256個bytes,因此有些訊息之前可以發出去的,現在發不出去了。為了徹底解決emoji和訊息截斷這個問題,還是將php升級到5.4以上版本吧。

同時建議將 超過長度的訊息自動截斷功能關閉:

protected $_bAutoAdjustLongPayload = false; /**< @type boolean If the JSON payload is longer than maximum allowed size, shorts message text. */

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.