你的iOS應用程序需要後端。隨着Parse關閉了商店,現在我們該做什麼呢?找到一個Parse替換或建立自己的後端?
我堅定地站在“學會建立自己的”後端陣營這邊。
許多開發人員建議不要建立自己的後端。BaaS關閉後,這些開發商爭相尋找下一個替換BaaS。然後他們也會試圖說服你使用替換BaaS。但我們都知道有些事不可避免的會發生。有一天你會從你的BaaS提供者處得到一個“驚喜”郵件,通知你他們正好在你的新應用程序版本推出時關閉。
我記得那次也發生在我身上——一個我依靠的BaaS關閉了。當我第一次看到關閉通知的郵件時,我覺得被利用了。我感到被出賣了。然後我感到很生氣。我陷入了一個惡性循環,我孤立了自己。我吃冰淇淋,邊淋浴邊聽Celine Dion而哭泣。我應該能夠預見這種事的,但是我被方便的幻覺和服務提供的穩定誘惑了。但這都只是——一個錯覺。
爲什麼不可靠的BaaS提供商不斷出現還對我們這樣可憐的移動開發者這樣做呢?
構建你自己的後端的想法似乎勢不可擋。
學習如何建立後端是一項很重的工作。這就是爲什麼BaaS似乎是一個不錯的選擇。
但如果你想掙脫BaaS的依賴而構建自己的後端,關鍵之處在於:不要試圖瞭解後端的一切!我們需要從小事做起。
當你創建你的第一個iOS應用程序,你可能沒有專注於讓它成爲可伸縮和可維護的。你第一次沒有太多壓力,UITableview單元格得以回收和顯示錯誤的數據。你可能並不擔心你的應用是否應該遵循MVC或MVVM或MMVCM(我將其放在最後一個)。我敢打賭你的第一個應用可能從來沒有讓它試過模擬器。
我建議以同樣的方法建立後端:從小事做起。先做一些小事情,無論多麼的小。然後在此基礎上進行創建。
向後後端方法
你不需要把自己埋在關於Python或Ruby的書裏,或者你可以得到一個後端啓動並運行之前學習關於服務器的一切。設計整個API,部署它,擴展它——所有這些事情都可以稍後進行。
首先這樣做:
寫一個會調用你的後端的iOS函數,甚至在你構建後端之前
這是一個例子。假設你決定你的第一個函數會調用可以檢索一個特定用戶的信息的API。
下面的函數由Swift編寫,建一個POST請求‘/ get_messages’ 在並不存在(但很快會有的)的本地服務器上。讓我們來看看這個函數的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
func
printMessagesForUser() - >
Void { let
json =
[ "user" : "larry" ] do
{ let
jsonData =
try
NSJSONSerialization.dataWithJSONObject(json, options: .PrettyPrinted) 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) } } |
這段代碼建了一個帶用戶名“larry”的POST請求到“http://127.0.0.1:5000/api/get_messages”。當然,如果我們現在運行這段代碼,它是不會運行的,因爲我們還沒有創建端點“ttp://127.0.0.1:5000/api/get_messages”。這是下一步我們將要做的。
安裝Flask(如果你還沒有,就用Python)
檢查Python和Flask文檔。
寫後端函數
現在,我們必須爲我們的iOS函數創建get_messages端點。這是它在默認Flask文件中的樣子,app.py:
1
2
3
4
5
6
|
@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' }) |
這個Python/Flask存根函數非常簡單。頂部的@app.route裝飾指定函數應該對應於‘get_messages’端點,它應該是一個POST請求。 ‘get_messages’函數的主題檢查request.get_json()——一個Flask函數,返回一個代碼,其中包含POST請求中發送的值。如果用戶名“larry”的消息是‘user’的請求參數,那麼函數會發送給客戶端包含一個字符串數組“test1”和“test2”的JSON對象代碼。
get_messages函數返回硬編碼JSON,但是以後你可以將它連接到一個真正的數據庫。在那之前,運行Flask服務器和iOS客戶端,看看你的後端的第一個構建塊是否能夠運行。接下來我們將這樣做。
運行本地服務器
我們確保app.py有以下的命令:
1
2
|
if
__name__ = =
'__main__' : app.run(debug =
True ) |
現在你可以運行app.py來啓動Flask服務器:
1
|
Python
app.py |
這將以默認端口爲5000啓動託管在你的本地主機上的Flask服務器。
從你的應用程序調用函數
其實看到你的後端API返回的東西會給你後端構建冒險繼續前進的動力。
運行你一開始寫的“getMessages” Swift函數——把它貼在你的主要視圖控制器或應用程序委託上,然後重構。另外,確保你添加了以下代碼到你的info.plist,這樣你就可以在開發階段禁用iOS運輸安全需求:
1
2
3
4
5
|
<key>NSAppTransportSecurity< / key> < dict > <key>NSAllowsArbitraryLoads< / key> <true> < / true>< / dict > |
一旦你得到在控制檯上打印出來的數組{“test1”、“test2”},你就知道你已經成功地調用自己的後端。如果你沒有得到這組輸出,就繼續調整直到你拿到它。
如果你看到了這裏,祝賀你。通過更多的“填補空白”(學習一些Python,爲數據庫查詢插入一個ORM),你現在不需要Parse或任何形式的BaaS服務就可以編寫一個後端。
這是過於簡單化的嗎?是的,我們剛剛編寫的並不是一個完整的後端。適當的API設計、數據庫設計、服務器維護和可擴展性都是你將不得不解決的問題,以便你可以繼續你的旅程。但是如果你這樣開始,那麼你已經有了一個基礎,你必須控制你自己的系統。相比依賴於可能對你隨時拔掉插頭的另一個第三方提供者,這種控制要好得多。
本文翻譯自:How to Start Building a Backend for Your iOS App Without Relying on Parse or Firebase