簡體   English   中英

我應該如何構建我的iPhone應用程序來與我的網站交談?

[英]How should I architect my iPhone app to talk to my website?

我正在計划我的第一個iPhone應用程序,我想從一開始就得到一些關於如何構建它的輸入。 iPhone應用程序正在與面向公眾的Web應用程序配合使用,該應用程序已經用PHP構建。

我希望網絡平台成為核心(數據存儲在mySQL數據庫中),並讓iPhone客戶端與它通信並使用REST'方法來執行網站功能(獲取最新內容,發布內容,投票) ,帳戶管理作為例子)。

我希望客戶在SQLite數據庫中獲取數據的本地副本,但刷新以獲取最新版本的feed(類似於Twitter應用程序)。

我現在有幾個想法:

  • 使用ASIHTTPRequest之類的東西將數據發送/接收到偵聽請求的服務器上的PHP文件

  • JSON - 我最好將GET / POSTS發送到返回JSON對象的PHP,並使用某種管理數據並將更改傳遞給本地SQLite數據庫的包裝器?

  • 我完全不知道應該如何構建這個與網絡通信的東西? 這是最好的做法嗎?

我非常感謝您如何構建這種設置。

謝謝,

編輯 :再次閱讀我自己的帖子后,我知道它聽起來像一個Twitter客戶端,但它不是,雖然它有類似的功能/結構的Twitter類型設置。 謝謝!

正如您在計划中已經概述的那樣,XML和REST是與Web應用程序通信的好方法。 我想建議一些關於如何實際設計和構建它的細節,或者你應該記住什么。

首先,我認為堅持使用MVC非常重要。 我見過人們在視圖控制器中創建HTTP連接,控制器是NSXMLParser的委托,控制器包含成員變量中的數據。 我甚至看到UITableCells建立HTTP連接。 不要這樣做!

您的模型及其基本操作代碼應盡可能從用戶界面中提取。 由於您已在Web應用程序中創建了模型,請嘗試在iPhone項目中重新創建實體。 不要害怕在實體類中使用一些簡單的方法,但不要讓它們使用外部資源,尤其是tcp連接。 作為實體類中方法的一個示例,您可能擁有以特定方式格式化數據的方法(日期作為示例,或返回fullname作為firstname和surname的串聯),或者您甚至可以使用類似- (void)update的方法充當調用負責更新模型的類的包裝器。

創建另一個用於更新模型的類 - 從web-app中獲取XML。 甚至不考慮使用同步連接,甚至不使用專用線程。 與委托的異步連接是要走的路。 有時需要多個請求來獲取所有必需的數據。 您可能希望創建某種狀態機來保存有關下載哪個階段的信息,以及從一個階段到另一個階段的進度,如果發生錯誤則跳到最后,在一段時間后從失敗的階段重新執行。

暫時在某處下載數據,首先在完成所有操作后,進行切換並更新用戶界面。 這有助於在啟動應用程序期間的響應性 - 用戶可以立即使用本地存儲的數據工作,而更新機制正在下載新數據。

如果您需要下載大量文件,請嘗試同時下載它們,如果文件之間的依賴關系允許的話。 這涉及為每個請求創建一個連接,可能為每個請求委托實例。 當然,對於所有這些連接,您只能有一個委托實例,但跟蹤數據會有點復雜。 同時下載可能會大大減少延遲,使用戶的機制更快。

要節省時間和帶寬,請考慮使用HTTP的If-Modified-Since和/或ETag標頭。 記住上次請求數據時的時間或標記,下次將其發送到HTTP的標題中。 如果內容尚未更改,您的Web應用程序應返回HTTP代碼304。 iPhone應用程序應相應地響應此代碼connection:didReceiveResponse: .

創建一個專用類來解析XML並更新模型。 您可以使用NSXMLParser,但如果您的文件不是很大,我強烈推薦使用TouchXML,很高興使用XML作為文檔(它也支持XPath),而不是基於事件的API。 您還可以在下載文件時使用此解析器來檢查其有效性 - 如果解析失敗則重新下載。 那時解析的專用類很方便。

如果你的數據集不是很大,如果你不需要永久地在iPhone上保存下載的數據,你可能不需要將它們存儲在SQLite數據庫中,你可以簡單地以XML格式存儲它們 - 只是一個簡單的緩存。 這至少可能是推特應用程序的方式。 這種方式變得更容易,但對於更大的數據集,XML會占用大量內存和處理能力 - 在這種情況下,SQLite會更好。

我建議使用Core Data,但你提到這是你的第一個iPhone應用程序,所以我建議你不要使用它。 然而。

不要忘記多任務處理 - 您的應用程序可以在下載過程中進入休眠狀態,您需要取消連接並清理更新機制。 在應用程序喚醒時,您可能希望恢復更新。

關於應用程序的視圖部分 - 使用Interface Builder。 它可能在開始時很痛苦,但從長遠來看它會得到回報。

視圖控制器是模型和視圖之間的粘合劑。 不要在那里存儲數據。 三思而后行,在哪里實施,誰應該稱之為。

這與應用程序的體系結構無關,但我想提醒一下,Objective-C是一種非常富有表現力的語言。 代碼應該像句子一樣閱讀。 使用協議擴展類。 作為一個例子,有一天我需要第一行字符串。 當然,你可以寫一個單行,你會發現第一次出現一個新行,並從頭到那里得到一個子串。 但它看起來並不正確。 我已將- (NSString*)firstLine到我的NSString協議中。 Code以這種方式看起來好多了,它不需要任何評論。

在任何項目的架構和設計中都要考慮很多事情,它們都應該齊頭並進。 如果一個人給另一個人造成麻煩,你需要適應。 沒有什么是一成不變的。

我正在開發一款聽起來與你類似的應用。 我還建議使用ASIHTTPRequest,或者像TouchJSON一樣用於JSON解析,或者如果要解析XML,則擴展/制作NSXMLParser的委托。

正如JosephH所建議的那樣,根據您的應用程序的工作原理,您可能需要考慮其他身份驗證方法:我會看一下基於令牌的內容,例如OAuth,它有現成的庫供人們使用。

SQLite完全適用於Feed緩存,雖然我更喜歡NSCoding,因此您可以凍結自定義數據結構。

作為一般建議,請確保花費大量時間考慮連接的每個用例和角落情況:很容易假設用戶只能以某種方式和特定時間聯系服務器,然后再投入多任務處理/來電/鎖定屏幕/內存警告,事情可能會變得毛茸茸而沒有任何計划。

總而言之,你似乎走在正確的軌道上,只要確保你事先計划好一切:)

Apple有一個全新的深度示例代碼 - MVCNetworking ,它深入展示了如何使用NSHTTPRequests和NSOperationQueues的子類。

正如其他人提到的那樣,我認為你正在提出正確的問題,正朝着正確的方向前進。 以上所有回復都是有價值的建議。 這是我的建議,我希望你會發現它很有用。

無論您選擇哪種方法/庫與您的Web服務進行通信,我認為在您在手機VS上設計數據模型的方式進行清晰分離非常重要。 Web應用程序中的數據模型。 您有三個主要區別要記住您的設計:

  1. Web應用程序上的數據模型(由您現有的mySQL數據庫反映)

    由於它已經存在,所以沒有太多可說的,除了它會對以下兩個部分的設計產生很大的影響。 我建議將此模型作為跨平台表示數據的“主參考”。

  2. iPhone應用程序上的數據模型(反映在iPhone應用程序中需要顯示的信息)

    這就是樂趣的開始。 首先,您需要很好地了解需要在手機應用中顯示哪些數據。 因此,首先要對您的應用程序進行良好的高級設計(使用筆和紙,繪制每個視圖的模型以及它們之間的交互,在視圖控制器之間建模導航等)。 了解視圖控制器與您希望在應用程序中顯示的各種數據之間的相互作用確實很有幫助。 這將幫助您在手機上創建數據模型的要求。 根據這些要求,將現有(Web)數據模型映射到適合您的iPhone應用程序的新模型。 此新模型​​可能包含也可能不包含您的網絡應用中的所有表格和字段。 但是2個模型的一般表示應該非常相似(例如關系,數據類型等)

  3. 用於上述2之間通信的數據模型(這是您的'數據交換協議')

    一旦您對上述數據進行了2次表示,您就需要從兩種方式 “翻譯”到另一種方式 設計您的數據交換協議盡可能簡單緊湊。 您不希望在無用信息上浪費字節,因為網絡上的傳輸成本很高。 (作為旁注,您可能會想到稍后壓縮傳輸的數據,但從一開始就擁有一個好的設計同樣重要)。 最好從一個協議開始,其中元數據與Web應用程序模型中的元數據相同(例如,相同的關系,表的名稱,屬性等)。 但請記住,您只需序列化/反序列化您在上面第2點中列出的實體和關系。 所以設計相應。 如果需要,您的交換協議還可能包括會話令牌,身份驗證信息,版本號或其他元數據。

    請記住:您的數據交換協議將解除您的Web應用程序和iPhone應用程序模型的分離。 我發現最好將它們分開,因為它們可能會隨着時間的推移而發展。 例如,iPhone上的數據模型可能會發展很多,尤其是當您發現需要重新建模某些關系或添加/刪除實體中的屬性以提高應用程序響應能力或用戶體驗,導航時,管他呢。

    因為這本身就是一個完整的問題,所以你需要在你的(JSON / XML /你選擇的任何解析器)之上設計一個通用的序列化/反序列化機制,它足夠靈活,可以維持你之間的潛在差異。 2個數據模型。 這些差異可能是:實體/屬性/關系名稱,主鍵標識符名稱,數據類型,要忽略的屬性以及列表繼續。 我肯定會在iPhone應用程序中實現一個序列化器/反序列化器實用程序類,由.plist配置文件支持,該文件包含您可能擁有的所有受支持的實體,關注點和別名。 當然,每個模型對象都應該“知道”如何序列化,反序列化自身及其關系(即所需的對象圖深度)。

    最后一點,由於您最終會得到2個數據表示,因此您需要一種方法來唯一地識別雙方的對象。 例如,考慮將uuid屬性添加到需要交換的所有數據中,或者使用任何其他適合您需求的方法。

我正在構建一個與您的應用程序具有類似要求的應用程序,這些是我發現目前為止最好的方法。 此外,您可能會發現這個視頻很有用(它激發了我很多關於如何實現上面提到的一些問題,如果你使用的是CoreData,它會特別有趣):

http://itunes.apple.com/ca/podcast/linkedin-important-life-lessons/id384233225?i=85092597 (參見題為“LinkedIn:關於CoreData和GameKit的重要生活課程(2010年3月12日)”的講座)

祝好運!

這是一個相當廣泛的問題,我認為無論如何你都會以正確的方式進行,但我會盡力提出一些建議:

JSON,ASIHTTPRequest和PHP腳本的POST聽起來是一個很好的方式。

如果數據不是真的敏感,我大部分時間都會使用http,並且只對登錄頁面使用https,該登錄頁面設置cookie或返回您在后續請求中使用的“令牌”。 (對於3G連接,HTTPS可能相當慢,因為設置SSL連接的數據包數量高於普通TCP連接。)

您應該確保正確地將輸入中的任何數據傳遞到PHP腳本到數據庫,以避免任何SQL注入攻擊 - 即。 使用參數化SQL, 不要通過“ SELECT * from users where username="+$_GET['username'] “來創建sql查詢

我會這樣做,就像我已經完成了很多AJAX網頁的東西。 即:

  1. 讓服務器端的URL將要傳輸的信息打包成XML格式。 (這可以通過CGI / PHP腳本或其他)。 您在消息體中傳輸XML - 因此使用標准Web瀏覽器可以輕松地進行人工讀取和調試。

  2. 使用標准的iPhone NSXMLParser方法從XML文檔中解析出各個數據字段,並將其寫回數據庫。 此方法適用於從URL獲取數據在一次調用中解析它 - 如:

 NSURL *xmlURL = [NSURL URLWithString:@"http://www.example.com/livefeed.cgi"]; NSXMLParser *myParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; 
  1. 使用NSXMLParser方法遍歷數據層次結構並相應地填充數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM