不依賴Parse或Firebase,如何開始為你的iOS應(yīng)用程序創(chuàng)建后端
你的iOS應(yīng)用程序需要后端。隨著Parse關(guān)閉了商店,現(xiàn)在我們該做什么呢?找到一個(gè)Parse替換或建立自己的后端?
我堅(jiān)定地站在“學(xué)會建立自己的”后端陣營這邊。
許多開發(fā)人員建議不要建立自己的后端。BaaS關(guān)閉后,這些開發(fā)商爭相尋找下一個(gè)替換BaaS。然后他們也會試圖說服你使用替換BaaS。但我們都知道有些事不可避免的會發(fā)生。有一天你會從你的BaaS提供者處得到一個(gè)“驚喜”郵件,通知你他們正好在你的新應(yīng)用程序版本推出時(shí)關(guān)閉。
我記得那次也發(fā)生在我身上——一個(gè)我依靠的BaaS關(guān)閉了。當(dāng)我第一次看到關(guān)閉通知的郵件時(shí),我覺得被利用了。我感到被出賣了。然后我感到很生氣。我陷入了一個(gè)惡性循環(huán),我孤立了自己。我吃冰淇淋,邊淋浴邊聽Celine Dion而哭泣。我應(yīng)該能夠預(yù)見這種事的,但是我被方便的幻覺和服務(wù)提供的穩(wěn)定誘惑了。但這都只是——一個(gè)錯(cuò)覺。
為什么不可靠的BaaS提供商不斷出現(xiàn)還對我們這樣可憐的移動開發(fā)者這樣做呢?
構(gòu)建你自己的后端的想法似乎勢不可擋。
學(xué)習(xí)如何建立后端是一項(xiàng)很重的工作。這就是為什么BaaS似乎是一個(gè)不錯(cuò)的選擇。
但如果你想掙脫BaaS的依賴而構(gòu)建自己的后端,關(guān)鍵之處在于:不要試圖了解后端的一切!我們需要從小事做起。
當(dāng)你創(chuàng)建你的第一個(gè)iOS應(yīng)用程序,你可能沒有專注于讓它成為可伸縮和可維護(hù)的。你第一次沒有太多壓力,UITableview單元格得以回收和顯示錯(cuò)誤的數(shù)據(jù)。你可能并不擔(dān)心你的應(yīng)用是否應(yīng)該遵循MVC或MVVM或MMVCM(我將其放在最后一個(gè))。我敢打賭你的第一個(gè)應(yīng)用可能從來沒有讓它試過模擬器。
我建議以同樣的方法建立后端:從小事做起。先做一些小事情,無論多么的小。然后在此基礎(chǔ)上進(jìn)行創(chuàng)建。
向后后端方法
你不需要把自己埋在關(guān)于Python或Ruby的書里,或者你可以得到一個(gè)后端啟動并運(yùn)行之前學(xué)習(xí)關(guān)于服務(wù)器的一切。設(shè)計(jì)整個(gè)API,部署它,擴(kuò)展它——所有這些事情都可以稍后進(jìn)行。
首先這樣做:
寫一個(gè)會調(diào)用你的后端的iOS函數(shù),甚至在你構(gòu)建后端之前
這是一個(gè)例子。假設(shè)你決定你的第一個(gè)函數(shù)會調(diào)用可以檢索一個(gè)特定用戶的信息的API。
下面的函數(shù)由Swift編寫,建一個(gè)POST請求‘/ get_messages’ 在并不存在(但很快會有的)的本地服務(wù)器上。讓我們來看看這個(gè)函數(shù)的代碼:
func printMessagesForUser() -> Void { let json = ["user":"larry"] do { let jsonData = try NSJSONSerialization.dataWithJSONObject(json, options: .PrettyPrinted) let url = NSURL(string: "http://127.0.0.1:5000/api/get_messages")! let request = NSMutableURLRequest(URL: url) request.HTTPMethod = "POST" request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") request.HTTPBody = jsonData let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in if error != nil{ print("Error -> \(error)") return } do { let result = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as? [String:AnyObject] print("Result -> \(result)") } catch { print("Error -> \(error)") } } task.resume() } catch { print(error) } }
這段代碼建了一個(gè)帶用戶名“larry”的POST請求到“http://127.0.0.1:5000/api/get_messages”。當(dāng)然,如果我們現(xiàn)在運(yùn)行這段代碼,它是不會運(yùn)行的,因?yàn)槲覀冞€沒有創(chuàng)建端點(diǎn)“ttp://127.0.0.1:5000/api/get_messages”。這是下一步我們將要做的。
安裝Flask(如果你還沒有,就用Python)
檢查Python和Flask文檔。
寫后端函數(shù)
現(xiàn)在,我們必須為我們的iOS函數(shù)創(chuàng)建get_messages端點(diǎn)。這是它在默認(rèn)Flask文件中的樣子,app.py:
@app.route('/api/get_messages', methods = ['POST']) def get_messages(): json = request.get_json() if json['user'] == "larry": return jsonify({'messages':['test1', 'test2']}) return jsonify({'error':'no user found'})
這個(gè)Python/Flask存根函數(shù)非常簡單。頂部的@app.route裝飾指定函數(shù)應(yīng)該對應(yīng)于‘get_messages’端點(diǎn),它應(yīng)該是一個(gè)POST請求。 ‘get_messages’函數(shù)的主題檢查request.get_json()——一個(gè)Flask函數(shù),返回一個(gè)代碼,其中包含POST請求中發(fā)送的值。如果用戶名“larry”的消息是‘user’的請求參數(shù),那么函數(shù)會發(fā)送給客戶端包含一個(gè)字符串?dāng)?shù)組“test1”和“test2”的JSON對象代碼。
get_messages函數(shù)返回硬編碼JSON,但是以后你可以將它連接到一個(gè)真正的數(shù)據(jù)庫。在那之前,運(yùn)行Flask服務(wù)器和iOS客戶端,看看你的后端的第一個(gè)構(gòu)建塊是否能夠運(yùn)行。接下來我們將這樣做。
運(yùn)行本地服務(wù)器
我們確保app.py有以下的命令:
if __name__ == '__main__': app.run(debug = True)
現(xiàn)在你可以運(yùn)行app.py來啟動Flask服務(wù)器:
Python app.py
這將以默認(rèn)端口為5000啟動托管在你的本地主機(jī)上的Flask服務(wù)器。
從你的應(yīng)用程序調(diào)用函數(shù)
其實(shí)看到你的后端API返回的東西會給你后端構(gòu)建冒險(xiǎn)繼續(xù)前進(jìn)的動力。
運(yùn)行你一開始寫的“getMessages” Swift函數(shù)——把它貼在你的主要視圖控制器或應(yīng)用程序委托上,然后重構(gòu)。另外,確保你添加了以下代碼到你的info.plist,這樣你就可以在開發(fā)階段禁用iOS運(yùn)輸安全需求:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
一旦你得到在控制臺上打印出來的數(shù)組{“test1”、“test2”},你就知道你已經(jīng)成功地調(diào)用自己的后端。如果你沒有得到這組輸出,就繼續(xù)調(diào)整直到你拿到它。
如果你看到了這里,祝賀你。通過更多的“填補(bǔ)空白”(學(xué)習(xí)一些Python,為數(shù)據(jù)庫查詢插入一個(gè)ORM),你現(xiàn)在不需要Parse或任何形式的BaaS服務(wù)就可以編寫一個(gè)后端。
這是過于簡單化的嗎?是的,我們剛剛編寫的并不是一個(gè)完整的后端。適當(dāng)?shù)腁PI設(shè)計(jì)、數(shù)據(jù)庫設(shè)計(jì)、服務(wù)器維護(hù)和可擴(kuò)展性都是你將不得不解決的問題,以便你可以繼續(xù)你的旅程。但是如果你這樣開始,那么你已經(jīng)有了一個(gè)基礎(chǔ),你必須控制你自己的系統(tǒng)。相比依賴于可能對你隨時(shí)拔掉插頭的另一個(gè)第三方提供者,這種控制要好得多。
本文翻譯自:How to Start Building a Backend for Your iOS App Without Relying on Parse or Firebase