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。 唔係因為佢唔識寫 test——你叫 Claude 寫 test,佢好叻。但係初始 scaffold 嘅 prompt 永遠係「build 個 app」,唔係「build 個 app 同埋全面嘅 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 確保全程運作正常。
呢個就係我所講嘅「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。tap 佢就展開「Now Playing」sheet,有可拖動嘅 slider、速度選擇器(0.5x 到 2x)、transport controls、同一個 sound-rings artwork animation。
最棘手嘅部分係 isSeeking 狀態——冇咗佢,slider 嘅位置同 audio observer 會互相打架,搞到一片 jittery 亂象。就係嗰一行 state,花咗我一個鐘去 diagnose。
我仲加咗 offline download,配上細心嘅 ambient UX:library 裡面 downloaded 嘅 episode 有綠色圖示、完成提示、Now Playing 顯示「Downloaded」label、同掃走可以刪除下載。DownloadManager 嘅 URLSession delegate 入面有個 temp file race condition 導致靜默 failure——fix 係喺 callback 入面做一個同步嘅 file move。呢種 bug 係 code review 睇唔到嘅。
全層 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 申報、私隱 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 喺歐盟有冇得用?
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 Build Code,乜嘢 Skill 最重要?
喺上一篇文,我仲喺搵合適嘅建議。「學做嗰個打開 Simulator 嘅人」係我當時能講嘅最好答案。
而家真正 ship 咗,我諗我可以講得稍微更具體啲。
個 app 存在,係因為三件 AI 做唔到嘅嘢:
-
我用過個 product。 唔係測試。係真正用。Create 咗 podcast。喺返工路上聽。留意到 outline review 畫面需要顯示 research source,因為我想知道事實係從哪裡來嘅。
-
我做咗冇標準答案嘅判斷。 Delete 還是保留 mini-player?Creation wizard 幾多客製化先算太多?Studio 功能應該係一個 tab 定一個 section?呢啲唔係工程決定。係品味決定。而品味來自用過好多產品——優秀嘅同糟糕嘅——同建立出對「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 俾我指住講:「人嘅工作先係難嗰部分。」
祝好,Chandler








