推送內容如果包含了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. */