2015 年,還在上大學的我買了一部 iPhone 5c。對,就是那款非常漂亮的聚碳酸酯外殼手機。
同年,我在網上看到了少數派,並投遞了一篇關於 VSCO app 的 體驗文章。正是那篇如今看來非常青澀的短文,讓我開始不斷地體驗各式各樣的 iOS 應用,寫下了一篇又一篇的 app 體驗文章。
我不曾想過,近十年後的今天,我有機會能利用業餘時間,自己編寫 iOS app,並且發布到 App Store 上。
▍ChatGPT 問世:神奇的 AI 在哪裡
2022 年 11 月,ChatGPT 問世,引發全球關注。過去的兩年間,生成式 AI 發展迅速,從模型層到應用層,都有了長足的進步。
大部分讀者應該都體驗過 ChatGPT,或者是其他類似的生成式 AI 產品。甚至,你可能不局限於和 AI 閒聊,而是在工作中使用 AI 輔助工具,提高工作效率。我相信這註定是會給人類帶來巨大改變的一項技術。和 AI 合作,可能會成為這個時代的一項基本技能。
過去兩年間,我一直在追蹤 AI 能力的發展。在此期間,興奮、冷靜、失望、驚喜,各種情緒交織。每當出現一個新模型,就會經歷一輪,「啊,它竟然能做到這個!」 和 「哎,還能不太行。」 的心路歷程。

AI 發展觀察者的情緒周期(由 Claude 繪製)
直到幾個月前,Claude 3 Sonnet 模型發布(目前已經更新到 3.5 Sonnet),讓我覺察到其中的巨大潛力。我決定嘗試挑戰一下,看看 AI 能否幫助我完成一項我一直想做的事情 - 開發一款 iOS App。

Claude 模型能力對比
▍iOS 開發「小白」:一拍腦門,決定入坑
這些年,雖然我一直在關注 iOS 應用,但只是停留在使用層面。我對於 iOS 開發的了解,幾乎一無所知。我大概聽說過 Objective-C 和 Swift,知道有 Xcode 這個開發工具。

Xcode 和 Swift
數年前,因為學業和後來工作的原因,我學習過 Python。時至今日,我的能力都沒有達到專業 Python 工程師的水平。當然,我可以寫一些簡單的腳本,解決一些工作中的問題,對資料庫、網路請求等基本概念有一定了解,具備一定程度的編程思維。
那麼,想要開發一款 iOS app,我需要先選好一個主題,也就是我想做的 app。最終,我把目標鎖定在做一款能夠查看地震資訊 app(後稱為《震感》)。
你應該也能看出來,選擇這個主題,完全是一拍腦門的決定。
我平時會關注地震消息,作為 2008 年大地震的親歷者,我對地震有著特殊的敏感度。雖然不是每一次地震都會影響到我,但我還是會習慣性看看最近哪裡發生了地震。已有的地震資訊 app 要麼長得太醜,要麼體積大到誇張,我對此早有怨言。
▍編碼之前:找到目標,確定框架
初步擬定目標之後,不意味著我就可以開始編寫代碼。主要是我也不會寫。我需要先解決一些基本問題:
-
開發一款 iOS 應用,選擇什麼編程語言?
-
我需要下載什麼軟體來開發,如何開始?
-
App 的界面設計,我需要哪些頁面,如何設計?
-
預計的時間成本,我個人能接受的最大時間投入?
-
App 的發布,如何提交到 App Store?
當然,除了這些很明顯的問題,還有很多小問題就不再一一羅列了。於是,我通過詢問 AI 查詢資料的方式,大致得出了一些結論:
-
我決定使用 Apple 推薦的 SwiftUI 來開發一款純原生的 iOS app,不使用第三方框架,儘量減少依賴。也便於 AI 能儘量利用好 Apple 官方文檔。
-
我需要下載 Xcode,這是 Apple 官方提供的開發工具。
-
我需要參考 Apple 提供的人機界面指南,儘量使用原生控制項,省去界面設計。
-
我能接受累計投入 1 個月的周末時間來完成這個項目。
-
我需要每年交 688 元來開通 Apple Developer 賬號,這是提交 app 到 App Store 的必要條件。
▍邁出第一步:梳理思路,從零開始
我註冊好 Apple Developer 賬號,下載了 Xcode。面對的第一個問題時,我該如何開始?
我對 iOS app 的項目結構、代碼組織等一無所知。於是,我讓 Claude 幫我生成一個 Hello World(編程領域面向初學者的項目)的 SwiftUI 項目,並步驟化地指導我運行起來。雖然我看不懂 SwiftUI 的代碼,但它成功運行了起來。
接下來,我讓 Claude 講述了一遍 SwiftUI 的項目結構。例如 iOS app 的圖標應該放在哪裡,頁面是如何組織的,需要哪些基礎的配置等。經歷了多輪對話,我初步了解了一款 iOS app 的基本結構。

一款最簡單的 iOS App 結構
▍深入細節:與 AI 手挽手
和 AI 合作開發 iOS app,是一件不容易的事情。如果你直接對它說:請幫我開發一個地震資訊 app。
毫無疑問,它會給你一坨 shit 代碼,然後告訴你:完成了。
所以,你需要一步步引導它,讓它幫你解決一些具體的問題,比如從創建一個 app 細化到創建一個新的頁面,在細化到在頁面上顯示一個列表,再細化到這個列表的樣式等。而實現的過程,則是反過來從最小粒度開始。
只有將問題細化,AI 才能真正幫助你。當然,細化問題的過程,你也可以和 AI 一起完成。完美閉環。
例如,震感 app 的主頁面,主體是背景的地圖和地震事件列表。

震感 App 主界面
你首先需要 Claude 來幫你創建主界面,並顯示地圖。在這個過程中,你的提示語可能是:
請在 App 主頁面上顯示地圖,必須使用 iOS 原生組件,使用 SwiftUI 語法。需要輸出新增或修改的代碼文件路徑和代碼完整內容。
拿到 AI 的輸出後,你需要複製到 Xcode 中,運行項目,看看效果。例如,你可能在界面上看到了地圖,但只是局部的一塊區域,此時可能就需要繼續對話:
我希望地圖占據整個螢幕,不包含任何邊界。請仔細分析代碼後,重新輸出修改後的完整代碼。
更糟糕的是,代碼可能無法運行,這時最好的方法是把 Xcode 的報錯資訊複製給 AI,讓它幫你分析問題所在。
上面的代碼在 Xcode 中報錯了,請分析錯誤原因,重新輸出修改後的完整代碼。
總之,和 AI 開發一款真正的 app,雖然聽起來很酷,但實際上需要你具備拆解複雜問題的能力和足夠的耐心。因為 AI 無法完成一個廣泛的任務,只能完成一個個小的子任務。一個小的功能往往是需要根據實際情況,進行多輪對話才能可用。
▍直面困難:引入外力,搭起後端
於是,在 AI 的幫助下,我逐步搭建起震感 app 的基本樣子。例如,有了包含示例數據的地震列表,地震數據的詳情頁面,數據分析頁面,設置頁面等。

震感 App 詳情頁面、數據洞察頁面、設置頁面
回過頭來,我發現自己之前一拍腦門的決定,並不是一個好的選擇。因為震感 app 並不是一個完全運行在本地的 app,它需要獲取實時的地震數據,這就需要一個後端服務來提供數據。這對於我這個 iOS 開發小白來說,是一個巨大的挑戰。
說到後端服務,你可能就會想到雲伺服器、資料庫、API 接口等。這又是一個龐大的領域。於是,我開始向 AI 尋求解決方案。
「無伺服器」,這是 Claude 給我的答案。得益於雲計算的發展,現在有很多雲服務提供商,可以幫助你搭建後端服務、存儲數據、提供後端接口、消息隊列推送等。這樣,你就不需要自己搭建和維護雲伺服器,也不需要學習複雜的後端開發知識。最關鍵的是成本低廉,甚至有免費的選擇。
於是,我開始了解 Cloudflare 提供的各種無伺服器產品,如 Workers、KV、D1、Queue 等。我通過查詢資料,詢問 AI,逐漸了解了這些產品的基本概念和使用方法。最終設計出震感 app 的整個後端架構。

震感 app 後端架構示意圖
▍解決問題:與 AI 肩並肩
在和 AI 的合作開發中,最常見的經歷就是一段碼報錯始終無法解決、一個功能無法按照預期實現,導致你無法繼續下去。
這個時候,我會推薦你嘗試兩種方法:
首先,藉助傳統的搜尋引擎,查詢相關問題,查詢較新的文檔和資料。然後將這些新的知識輸入到 AI 中,更新它的知識庫。大部分生產式模型的訓練數據截止日期都不是很新,所以你需要有針對性地更新它的知識庫,讓它更好地幫助你。
例如,Claude 提供了 Project 的功能。你可以將獲取到的文檔上傳到 Project 中,AI 就會自動根據這些文檔進行學習,提供更準確的解決方案。

Claude Project 產品截圖(來源於官網)
另一個我更加推薦的方法是,嘗試轉化身份和 AI 進行對話。很多人和 AI 一起寫代碼時,自己的身份是「產品經理」,AI 是「開發工程師」。例如,你的對話是:
我希望 App 的地震列表頁面,可以顯示最新的地震數據,同時支持下拉刷新。請幫我實現這個功能。
如果 AI 無法正確實現這個功能,你的追問可能是:
數據顯示和下拉刷新的功能有問題,無法正常使用。請幫我分析問題所在,提供解決方案。
但是上面的對話可能無法很好地解決問題。
此時,你可以嘗試轉化身份,變成一個測試工程師,和 AI 一起分析問題。例如,你可以這樣和 AI 對話:
我發現地震列表頁面無法顯示最新的地震數據,也無法下拉刷新。請找到對應的代碼添加詳細的日誌資訊,我會在測試後向你反饋。
接下來,你可以將 Xcode 中日誌輸出再次反饋給 AI,你會發現 AI 解決問題的效率會大大提高。 此時,我們又回到了文章前面闡述過的結論,AI 適合解決具體的問題,而不適合解決廣泛的任務。 你需要把 AI 當做機器,而不是人類來對待。
▍項目疊代:讓 AI 升任「產品經理」
當你在 AI 的幫助下完成最小版本的 app 後(例如只有一個核心功能),你就可以把整個工程當做一個項目,使用 AI 來幫助你進行疊代。在這個過程中,我們儘量 AI 在每次對話時感受到項目的全貌,此時 Claude 的 Project 功能就再次發揮了作用。
你可以在 Claude 的 Project 中上傳整個工程的代碼,讓 AI 了解整個項目的結構和功能。這樣,AI 在後續的對話中,就可以更好地幫助你進行疊代。

震感 app 的 Claude Project 配置截圖
例如在上方我的實際配置中,我會把 Xcode 項目文件儘可能都上傳到 Claude Project 中。同時編輯好 Custom Instructions,將整個項目的目錄結構和基本描述寫在裡面。這樣,AI 在後續的對話中,都會了解整個項目的基本資訊和完整結構。
這個過程中,你可以通過 tree 命令在 Terminal 中生成整個項目的目錄結構,然後將其複製到 Custom Instructions 中。

使用 tree 命令輸出目錄結構
此外,我推薦你學習使用 Git 來管理整個項目的代碼。你可以在每次疊代後,將代碼提交到 Git 倉庫,然後將最新的代碼上傳到 Claude 的 Project 中。Claude 官方也預告了後續 Project 功能的升級,將支持直接和 Git 倉庫進行集成,這樣你就可以更方便地管理整個項目。

Claude Project 集成 GitHub(來自官網)
震感 app 在我合計花費了約 50 個小時後,完成了第一個版本,時間投入低於我的預期。
我將 app 提交到了 App Store ,並最終通過了審核。後續,我又陸續花費了一些業餘時間對 app 進行了疊代,包括支持全世界更多國家和地區的官方數據源、覆蓋更多本地化語言、支持 macOS 和 iPadOS、支持 Critial Alerts 特性等。

macOS 版本震感 app
▍AI 之外:從第一個,到下一個
隨著震感 app 的上架,終於驗證了我最初的目標:2024 年的 AI,可以幫助一個完全不懂 iOS 開發的人,開發一款可以初步「合格」的 iOS app。
當然,這句話也不意味著「AI 可以讓任何人都成為 iOS 開發者」。以我為樣本,能夠完成這個項目,除了 AI 足夠強大外,還有以下幾個因素:
-
過去的數年,因為我體驗過非常多的 iOS app。所以,我能一開始在腦海中構建出一個 app 的基本的樣子,包含哪些頁面,哪些功能,交互方式等。
-
我具備一定的 Python 編程基礎,對編程有一定的認識。雖然我不會寫 Swift,但我知道編程的基本概念,知道如何查找資料,如何更容易地解決問題。
所以,我不希望拋出「AI 能讓任何人成為 iOS 開發者」或者「大家趕快去用 AI 寫 app 吧」這樣的噱頭。AI 之外的一些看不見的因素,也是非常重要的。當然,我也期望並相信,隨著 AI 技術的發展,未來能讓真正對編程一無所知的人能夠通過 AI 完成自己的 app 創意。
震感 app 上架後的首月在海外突破 100 美金的銷售額,收回了 Apple Developer 賬號的註冊費用,這對我是一個意外的驚喜。100 美金的收入對於我來說並不重要,但其中的樂趣和成就感是無法用金錢衡量的。
如今,我繼續在業餘時間更新疊代震感 app,並同時投入到下一款今昔 app(初版已上架) 的開發中。我希望藉助 AI,把我個人之前的一些奇怪的想法,變成現實,並遇見世界上和我有相同需求的人。
最後,歡迎大家在評 論區探討 AI 開發的話題和你的經歷。後續,我也會在少數派上繼續分享我下一款 iOS app 今昔的開發故事和 AI 編程經 驗。