2017-03-15 107 views
0

我將我的Android應用程序移植到iOS,並且正處於聊天階段。非常奇怪PHP/MySQL和iOS的日期行爲

每封郵件都有自己的日期,而且我的服務器API(使用PHP)有一個方法可以在日期後取得所有郵件(這樣我就可以發送請求併發送我的lastMessageDate並獲取任何不在設備上的新郵件隨時需要)

我的數據庫是MySQL,服務器的時區是GMT + 2。 DB將所有日期保存爲GMT + 2,PHP將它們作爲字符串發送回客戶端。

在Android中,在我的測試REST客戶端,調用下面的要求給出了「沒有新信息」的消息,因爲它應該: works as expected

在iOS中,因爲操作系統將所有的日期爲UTC,在發送日期之前,我將轉入GMT + 2字符串。我一直在測試和調試這個日期字符串,它確實是在GMT + 2中,因爲我的服務器期望它。 印刷與調試器發送請求之前的post數據,顯示的時間確實是在GMT + 2:

Params: ["since": "2017-03-15 21:16:04", "chat_id": "86", "username": "testuser"]

然而,發送完全相同的要求,在我的REST客戶端,返回聊天消息過去2小時內發佈的內容,例如iOS應用發送UTC日期而不是GMT + 2字符串。

中的iOS模擬器的反應是:

Received data is: 
{ 
    "message" : "Messages in this chat:", 
    "messages" : [ 
    { 
     "message" : "This is a message", 
     "chat_id" : "86", 
     "who" : "1", 
     "date" : "2017-03-15 21:16:04" 
    } 
    ], 
    "error" : false 
} 

我一直在試圖調試這在過去的4小時,沒有運氣。我不知道這是服務器的故障還是iOS的錯誤,所以如果有人能指出我正確的方向,那將非常感激。謝謝

+0

無處顯示如何使用會導致此問題的日期。 PHP,MySql和Android在哪裏? – AbraCadaver

+0

對不起,不發佈更多的代碼,但我不認爲這是必要的,因爲3個平臺中有2個正在工作。對於iOS請求,我使用的是Alamofire,而我在我的問題中使用的參數是iOS發送到服務器的字典。經過更多調試後,我認爲問題出在PHP中。從iOS發送請求時,它沒有獲取「since」參數。我試圖得到POST參數:'if(filter_has_var(INPUT_POST,'since')){$ since = $ reqData ['since']; }'但是當請求從iOS發送時'$ since'在服務器上爲空。有任何想法嗎? 在PHP中,我使用SLIM框架。 –

+0

'$ reqData是一個由SLIM框架使用'$ reqData = $ req-> getParsedBody();' –

回答

0

原來我需要用Alamofire.URLEncoding.httpBody而不是Alamofire.JSONEncoding.default對請求進行編碼,以便PHP能夠使用isset($_POST["since"])檢查參數。我以前沒有遇到過這個問題,在我的應用使用Alamofire.JSONEncoding.default編碼的另外40個API調用中。

如果任何人都可以解釋什麼時候最好使用URLEncoding進行編碼,以及何時JSONEncoding,請告訴我。

感謝大家試圖幫助!