App Store 批准咗
兩個星期前我寫:「仲喺 build。仲未 done。」今日 DIALØGUE(對話)正式上架 App Store。呢篇就講最後 40% 實際係點嘅故事。
兩個星期前我喺一篇 blog post 結尾寫:「仲喺 build。仲未 done。仲喺諗點同個女講。」
我話如果 app 上到 App Store,或者被 reject,就會寫返篇 follow-up。我仲話 reject 嘅故事可能仲正。
DIALØGUE(對話)- AI Podcast Studio 而家正式喺 App Store 上架——一個原生 SwiftUI iOS app,可以將任何話題或 PDF 變成完整嘅 podcast episode,全靠 Claude Code build 出嚟,而我以前從未寫過一行 Swift。 而家就下載得到。
不過,唔係第一次就過。老實講——我之前估 reject 嘅故事會比 approval 更精彩。估中咗。
Apple Reject 咗,跟住點?
第一次 submission 被 reject 咗。Guideline 2.1——Performance: App Completeness。In-app purchase 壞咗。
Apple 嘅 review message 幾有禮貌——佢哋見到係我第一次 submit,恭喜我加入 developer program,仲解釋得好清楚。審核員試買嘢嗰陣,IAP product 直接爆 error。
重點係:purchase flow 喺我自己測試嗰陣 work 得好好。問題出喺 Apple 嘅 sandbox 環境——佢嘅行為同 development 同 production 都唔同。StoreKit configuration 要同 App Store Connect 完全同步——但我嗰時冇做到。我一路對住本地嘅 StoreKit configuration file 測試,但審核員撳嘅係真正嘅 sandbox。
我當日就 fix 咗,resubmit,過咗。之後 ship 咗個 v1.0.1 bug fix update,都順利通過。
三次 submission。一次 reject。嗰次 reject 教我嘅嘢,比兩次 approval 加埋都多。係咁嘅啦,係咪?失敗永遠比成功學到更多。
「最後 40%」實際係點?
喺上一篇文,我講 AI 帶你去到 60%,剩低嘅 40% 完全係人做。而家我想講具體啲,因為有 git log 作證。
16 個 commit。57 個檔改動。加咗 4,886 行。 App 由 69 個 Swift 檔增加到 88 個,由 7,568 行增加到 11,459 行。差唔多 4,000 行嘅「polish」。
呢 16 個 commit 實際有啲乜——大概按時間順序:
第一日就應該有嘅 Test Suite
原本嘅 scaffold 完全冇 test。零。Claude build 咗 69 個 production code 檔,但一個 test 都冇。我上篇 post 之後嘅第一個正式 commit,加入咗 176 個 unit test 同 19 個 integration test,跑喺本地 Supabase instance 上面。
寫 test 即刻捉到真 bug:Show model decode failure(database column 唔存在)、AudioPlayer track 結束後冇 reset、library reload 嘅 race condition、creation wizard 入面一個漏咗嘅 nil UUID guard。每一個喺 production 都會 crash。
我覺得呢個 pattern 值得講出嚟:AI generate code,但冇帶 test infrastructure。 唔係因為佢唔識——你叫 Claude 寫 test,佢好叻。但初始 scaffold 嘅 prompt 永遠係「build 個 app」,唔係「build 個 app 連埋完整嘅 test」。Test 係因為我自己唔舒服冇 test 就 ship 先會出現。
Studio:由半成品變成真正嘅功能
原本嘅 Studio 功能淨係一個 placeholder。兩個 commit 之後,佢變成真正嘅 product:有 template grid 嘅 show 創建、有 status badge 同 action button 嘅 episode 管理、edit/delete 流程、有 timezone picker 嘅排程設定、同 voice customization sheet。
然後係 Studio Phase 2:show detail 重新設計、每集可以 retry/delete、手動 generate episode 連 credit 檢查。仲加埋 8 個新 XCUITest 確保成條 flow work。
呢個就係我講「AI build 咗個 codebase,唔係個 product」嘅意思。Studio 功能 compile 到。佢 render 到個畫面。但你根本冇辦法用佢嚟真正管理一個 recurring podcast show。
Audio Player 大改造
我喺上篇 post 提過 delete 咗 mini-player。點知估錯——我最後 build 咗個更好嘅 mini-player。最終設計係一條喺 tab bar 上面嘅常駐 mini-player bar,有 progress、skip controls 同 play/pause。撳一下就展開「Now Playing」sheet,有可拖動嘅 slider、速度選擇(0.5x 到 2x)、transport controls、同一個 sound-rings artwork animation。
最煩嘅係 isSeeking 狀態——冇咗佢,slider 嘅位置同 audio observer 互相打架,成個 UI 又震又跳。就係嗰一行 state,花咗我成個鐘先 diagnose 到。
我仲加咗 offline download,配上啲細心嘅 UX:library 入面 downloaded 嘅 episode 有綠色圖示、完成提示、Now Playing 顯示「Downloaded」label、swipe 就刪到下載。DownloadManager 嘅 URLSession delegate 入面有個 temp file race condition 導致靜默 failure——fix 係喺 callback 入面做同步 file move。呢種 bug 做 code review 根本睇唔到。
全 Stack Security 加固
呢部分令我有啲驚。成個 stack 嘅 security audit——唔止 iOS app——發現多個層面都有漏洞:over-permissioned 嘅 database function、authentication edge case、token verification 缺口、同幾個 backend service 嘅 input validation 問題。
呢啲全部唔係 iOS Swift code 嘅問題。係 iOS app 背後嗰個 backend。但 ship 咗個 iOS app 即係你成個 stack 而家喺用戶袋入面。風險即刻唔同晒。以前「喺 web app work 得好好」嘅 code,一旦過咗 Apple 審核、入咗人哋手機,突然覺得唔可以接受。
StoreKit:搞沉第一次 Submission 嘅元兇
StoreKit sandbox 測試係一個獨立宇宙,而正正係佢令我第一次 submission 被 reject。 Sandbox 環境嘅行為同 production 唔同。Transaction 有時永遠停喺「pending」。Xcode 嘅 StoreKit configuration file 要手動同步。我用咗成晚 debug 一個喺 code 入面 work 得好好、但喺 sandbox 靜默 fail 嘅 purchase flow——最後發現係 App Store Connect 入面嘅 product ID 有個尾隨空格。一個空格。
Apple 審核員撞到 sandbox error,因為我嘅 StoreKit configuration 同 App Store Connect 冇同步。Purchase flow 喺我本地測試完全冇問題——但審核員撳嘅係真正嘅 sandbox,唔係我本地嘅 StoreKit config file。我當日就 fix 咗,但呢件事完美示範咗「喺我部機 work 到」同「喺 Apple 嘅環境 work 到」之間個差距有幾大。
Purchase verification chain 本身又係另一個工程:iOS app 傳一個 JWS(JSON Web Signature)格式嘅 transaction 俾 server-side function,佢再對 Apple 嘅 signed receipt 做完整密碼學 chain verification。唔係淨係 decode——係真正嘅簽名驗證。呢個用咗兩個獨立 commit 先搞掂。
私隱同 App Store 合規
私隱合規就係填表、做決定、打剔——每個都有法律含義——冇 AI 可以代你做。 App Tracking Transparency 申報、privacy nutrition label、加密出口合規(係,HTTPS 都計)、內容版權、Turnstile captcha 整合。Claude Code 識寫 Swift,但佢冇辦法話你知你嘅 data 收集習慣使唔使加個「Data Used to Track You」標籤。
完整 MFA 同 Localization
原本嘅 MFA implementation 係個爛 stub——空 factor ID、淨係有 verify 流程。我重寫成完整 TOTP lifecycle:enroll、scan QR code(原生 CoreImage 生成)、verify、睇狀態、disable。一個全新嘅 394 行 MFAView.swift,以前根本唔存在。
7 種語言嘅 localization 即係 253 個 UI string 翻譯成英語、西班牙語、法語、日語、韓語、越南語同中文。Claude 做嘅翻譯大部分都 okay。但「大部分 okay」喺日語嘅意思係,可能有個 button label 文法上冇錯,但讀落好似機械人寫嘅。我係靠將電話語言切換咗再實際用個 app,先捉到幾個咁嘅問題。呢種測試 AI 暫時做唔到——至少而家仲未得。
DIALØGUE iOS App 做到啲乜?
如果你冇睇過原本嘅 build 故事,以下係 DIALØGUE 做到嘅嘢:
你俾佢一個話題——或者 upload 一個 PDF——佢就會整一集完整有 research、有 script、有聲音嘅 podcast episode。兩個 AI 主持人自然咁討論你嘅話題,背後有真實 research 支撐。唔使麥克風。
iOS app 包括:
- 5 步創建 wizard — 話題、格式、客製化、outline 審核、script 審核
- 7 種語言 30 個 AI 聲音 — 英語、西班牙語、法語、日語、韓語、越南語、中文
- 9 種 podcast 格式 — 由 Tech News Analysis 到 Investigative Comedy
- 有 lock screen controls 嘅 audio 播放 — background playback 直接 work
- Apple Sign-In、Google OAuth 同 email auth
- In-app purchase — 按 credit 計,唔係 subscription:4 個 credit $4.99,9 個 $9.99,18 個 $19.99
- Studio — 設定 recurring show,自動 generate 新 episode
- PDF upload — 用 research paper、報告、書本作為素材
係一個真正原生嘅 SwiftUI app。唔係 web wrapper。唔係 React Native。由最初 69 個 Swift 檔,而家 88 個檔、11,459 行 code,有 195 個 test 撐住。我真心為 ship 到佢感到自豪。
我估「Polish 階段」估得有幾離譜?
我寫過 app「仲喺 development,最後 polish 階段」。技術上唔算假,但我低估咗「polish」入面有幾多嘢其實係全新嘅工作。
而家望返 git log,16 個 commit 根本唔似「polish」。聽落更似第二階段 development。Test suite 本身——176 個 unit test 同 19 個 integration test——已經係一個獨立 project。Studio 由半成品變成完整功能。Audio player 改造咗兩次。Security 加固 touch 咗 40+ 個 backend function。MFA 從頭重寫。
我仲話 delete 咗 mini-player。呢個都估錯——我最後 build 咗個更好嘅,有 Now Playing sheet、速度控制同 download 指示。當初「delete 佢」嘅直覺係對嘅——第一個 mini-player 係差。但概念係對嘅。只係要重新 build 過,build 好啲。
我諗而家睇到成個全貌,真正老實嘅分法係:AI build 地基(60%),人 build 產品(30%),App Store submission 過程教你最後 10%。
歐盟有冇得用?
DIALØGUE 全球都有得用,但歐盟上架仲喺 Apple 處理緊。 歐盟嘅《數字市場法》需要額外合規步驟——替代付款披露、特定私隱文件、商業登記詳情。我已經 submit 晒,Apple 而家審核緊。應該快啲就喺歐盟上線。
如果你喺歐盟等唔切,web app 喺任何地方都 work,功能一樣。
AI 輔助 iOS 開發可以有幾快?
DIALØGUE iOS app 由第一個 commit 到 App Store 批准大概兩個星期——一個晚上 AI scaffold 加兩個星期人手 product 工作。 我一直 maintain 呢個 table,因為佢不斷教我嘢:
| Project | 複雜度 | Build 時間 |
|---|---|---|
| DIALØGUE v1 | MVP podcast generator | ~6 個月 |
| STRAŦUM | 10 個 AI agent、11 個 framework、multi-tenant | 75 日 |
| Site redesign | WordPress frontend 大翻新 | 3 日 |
| DIALØGUE v2 | 完整 web app rebuild | 14 日 |
| Blog migration | WordPress → Next.js、490 篇文、Sydney RAG | 4 日 |
| DIALØGUE iOS | 原生 iOS app,第一次用 Swift | ~2 個星期(scaffold:一個晚上) |
DIALØGUE iOS 由 scaffold 到 ship 大概兩個星期。Scaffold 本身一個晚上。呢個比例——一晚 AI 工作,兩星期人手工作——已經講晒我哋 AI 輔助開發而家去到邊。
AI 嗰部分不停加快。人嗰部分差唔多冇變。我兩個星期前寫過呢句,而家仲係咁。
當 AI 寫 Code,乜嘢 Skill 最重要?
喺上篇文,我仲喺搵啱嘅建議。「學做嗰個開 Simulator 嘅人」係我當時講到最好嘅答案。
而家真正 ship 咗,我諗可以講具體啲。
個 app 存在,係因為三件 AI 做唔到嘅嘢:
-
我真係用過個 product。 唔係 test。係真正用。Create 咗 podcast。返工路上聽。留意到 outline review 畫面要顯示 research source,因為我想知啲 fact 係邊度嚟。
-
我做咗冇標準答案嘅判斷。 Delete 定保留 mini-player?Creation wizard 幾多 customization 先算太多?Studio 功能應該係 tab 定 section?呢啲唔係 engineering 決定。係品味決定。而品味係靠用過好多產品——好嘅同差嘅——慢慢建立出對「feel 啱」嘅直覺。
-
我喺一個為人設計嘅系統入面打滾。 App Store Connect、私隱申報、加密出口合規、截圖要求——呢啲全部自動化唔到。要閱讀、理解脈絡、對法律同商業影響做判斷。呢個能力——喺複雜人類系統入面打滾——唔會消失。
所以或者更新版嘅建議係:學深入咁用嘢、靠在乎質素嚟培養品味、同習慣喺唔係為簡單而設計嘅系統入面打滾。
呢個比「學 critical thinking」具體。我覺得更接近真相。但我仲未肯定夠唔夠。
點樣下載 DIALØGUE?
個 app 免費,用 in-app credit 購買。唔係 subscription。
全球都有——歐盟上架 Apple 仲喺處理,應該快啲就有。Web app 喺邊度都用得到。
常見問題
DIALØGUE 喺 App Store 有得下載?
有!DIALØGUE - AI Podcast Studio 自 2026 年 3 月起正式喺 App Store 上架。免費下載,用 in-app credit 購買(4 個 credit $4.99,9 個 $9.99,18 個 $19.99)。全球都有——歐盟上架已經 submit,Apple 處理緊。
歐盟有冇得用?
已經 submit,Apple 處理緊。歐盟《數字市場法》要額外合規步驟,我已經搞掂晒文件——等緊 Apple review。應該快啲就有。而家 web app 喺邊度都用得到,包括歐盟。
Apple 有冇 reject 過?
有——第一次 submission 因為 in-app purchase 壞咗被 reject(Guideline 2.1: App Completeness)。StoreKit sandbox configuration 同 App Store Connect 冇同步,review 嗰陣 purchase 爆 error。我當日就 fix 咗,resubmit,過咗。之後 v1.0.1 都過埋。三次 submission,一次 reject。嗰次 reject 教我嘅嘢比兩次 approval 加埋都多。
成個過程用咗幾耐?
由最初嗰篇 blog post 到 App Store 批准,大概兩個星期。Claude Code 用一晚 scaffold 咗 69 個 Swift 檔。剩低嘅 16 個 commit 喺 57 個檔加咗 4,886 行——test、Studio 功能、audio player 重新設計、MFA 重寫、security 加固、StoreKit verification、localization,同 App Store submission 過程。App ship 時有 88 個檔、11,459 行 code 同 195 個 test。
最後 40% 最難係邊度?
StoreKit sandbox 測試。「喺 code 入面 work 到」同「喺 Apple 嘅 transaction 系統 work 到」之間差天共地。Sandbox transaction 嘅行為同 production 唔同,product ID 要完全正確(連尾隨空格都唔得),而 feedback loop 好慢——唔係跑個 unit test 咁簡單。
Web app 仲用唔用得?
梗係得。podcast.chandlernguyen.com 功能一樣,任何裝置都用得到。iOS app 多咗原生嘅方便——Apple Sign-In、lock screen controls、offline download——但核心嘅 podcast 生成體驗完全一樣。
仲喺諗點同個女講。但至少而家有個已經 ship 咗嘅 app 俾我指住講:「人做嘅嘢先係難嗰part。」
祝好,Chandler








