一个前端仔的Swift初体验:从“Hello World”到提交App Store

TechVanguard
2026-03-08 10:27
阅读 2097

大家好,我是一个刚入职两个月的大专应届生,目前在一家做跨境电商业务的创业公司干前端。平时用VSCode写代码,插件装得比别人头发还多(别问,问就是Color Highlight + Auto Rename Tag + Prettier全家桶)。最近因为公司要搞个iOS端的运营活动页,产品经理突然甩过来一句:“你不是学过点Swift吗?来搭个原生壳子吧。”——我当时就懵了,我哪会Swift啊?但为了不被运营小妹天天追着问进度,也为了保住这个来之不易的饭碗,硬着头皮开干了。

于是,就有了这篇“前端人被迫转行iOS开发”的血泪入门记录。


说真的,作为一个常年和React/Vue打交道的前端,第一次打开Xcode的感觉就像进了外星人飞船。满屏的Storyboard、一堆 IBOutlet、还有那个神秘的 @IBAction,我一度以为自己点错了软件,打开了什么图形化编程玩具。但冷静下来一想:前端和iOS开发,其实没那么远

我们前端天天讲“组件化”,SwiftUI 里也有 View;我们搞状态管理,Swift 有 @State@ObservedObject;我们优化性能,iOS 也讲究主线程/异步加载。甚至 App Store 的审核机制,某种程度上和前端上线前的 QA 流程有点像——只不过 Apple 的“测试”更狠,动不动就拒审,理由还特别玄学,比如“你的按钮颜色不够 Apple Design Guidelines”。


为什么前端要碰 Swift?

别误会,我不是要转行。主要是我们公司现在资源紧张,后端没人,移动端也没专职iOS开发。老板的意思是:“能用H5就H5,不能用的,套个原生壳子跑。”但这次的运营活动要求支持 AR扫码+本地通知推送,纯前端根本搞不定。于是,任务落到了我头上。

更离谱的是,产品经理还提了个需求:“能不能把用户行为数据实时传给 RAG 系统?”——RAG?那不是大模型检索增强生成吗?原来他们打算用用户点击路径做个性化推荐,再结合客服知识库……行吧,这年头连运营都开始玩 AI 了,前端不学点新东西真要被淘汰。


第一步:环境搭建,差点劝退

装 Xcode 是第一步,但 Mac 上下个 Xcode 动辄 10GB,我那台 2019 年的 MacBook Air 差点当场罢工。等了两个小时,终于装好了。创建第一个项目时,我果断选了 SwiftUI,而不是老掉牙的 UIKit。为啥?因为 SwiftUI 写法更像前端:

struct ContentView: View {
    var body: some View {
        Text("Hello, iOS!")
            .foregroundColor(.blue)
            .padding()
    }
}

看!是不是有点 JSX 的味道?声明式 UI,链式调用,属性直接挂后面。虽然语法怪怪的(比如 some View 这种),但至少比写 Storyboard 拖控件强一百倍。

不过坑也来了:模拟器启动慢得像树懒。每次改一行代码,编译+运行要 30 秒,我 VSCode 里改个 CSS 都不用这么久。后来才知道,可以开启 Debug Executable 的增量编译,或者用 Canvas 实时预览(但经常卡死)。


资源管理:图片、字体、本地化,全是坑

前端习惯把资源放 public 目录,或者 CDN。但 iOS 里要用 Assets.xcassets。你以为拖进去就行?Too young!

  • 图片要按 @1x/@2x/@3x 准备,不然模糊
  • 字体文件不仅要拖进项目,还要在 Info.plist 里注册
  • 本地化字符串得用 Localizable.strings,还得手动切语言测试

最崩溃的是,我放了个 SVG 图标,结果 iOS 不支持直接用 SVG!必须转成 PDF 或 PNG。还好后来发现有个库叫 SwiftSVG,但又要引入第三方依赖,增加包体积……运营小妹还在群里催:“图标怎么还是糊的?”


和 RAG 系统对接:原生也能发请求

前面提到,要上报用户行为给 RAG 后台。作为前端,我第一反应是:不就是 fetch 吗?但在 Swift 里,得用 URLSession

func sendEventToRAG(event: String) {
    guard let url = URL(string: "https://api.our-rag.com/events") else { return }
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    
    let body = ["event": event, "timestamp": Date().timeIntervalSince1970]
    request.httpBody = try? JSONSerialization.data(withJSONObject: body)
    
    URLSession.shared.dataTask(with: request) { data, response, error in
        // 注意:这里在后台线程!
        if let error = error {
            print("RAG上报失败: \(error)")
        }
    }.resume()
}

但问题来了:网络请求默认在后台线程执行,如果要在回调里更新 UI(比如显示“上报成功”),必须切回主线程:

DispatchQueue.main.async {
    self.showSuccess = true
}

这让我想起前端的 setState 必须在 React 渲染上下文中执行……果然,跨平台开发的痛是相通的。


动画与交互:我的老本行终于派上用场

前面说了,我对前端动画比较感兴趣。没想到在 SwiftUI 里也能玩起来!

比如做个按钮点击反馈:

@State private var isPressed = false

var body: some View {
    Button("扫码领券") {
        // 触发事件
    }
    .scaleEffect(isPressed ? 0.95 : 1.0)
    .animation(.easeInOut(duration: 0.1), value: isPressed)
    .onTapGesture {
        isPressed = true
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            isPressed = false
        }
    }
}

虽然不如 CSS 的 transform: scale() 丝滑,但至少能做出基本反馈。我还尝试集成 Lottie 做加载动画,结果发现包体积暴涨 5MB……运营小妹又来问:“App 为什么这么大?用户下不动啊!” 得,最后还是切回了系统ActivityIndicator。


提交 App Store:一场修行

写完代码只是开始,真正地狱是 上架审核

第一次提交,被拒了,理由是:“App 没有提供足够的功能价值,仅用于营销活动,不符合 App Store 审核指南 4.3。”

我???这不是你们运营定的需求吗?

后来加了个“用户中心”页面,放了历史记录、帮助文档,再加个隐私政策链接,才勉强过审。过程中踩的坑:

问题 解决方案
缺少隐私清单(Privacy Manifest) 在项目中添加 PrivacyInfo.xcconfig
未说明 NSCameraUsageDescription Info.plist 补充权限描述
截图分辨率不对 用模拟器导出 6.5 英寸设备截图

最搞笑的是,Apple 审核员居然在凌晨三点给我发邮件:“请确认你的 App 是否支持 iPad。”——我压根没适配 iPad 啊!只好在 Xcode 里勾掉 iPad 支持,重新打包。


给前端同行的建议

如果你也像我一样,被逼着写 Swift,别慌。记住几点:

  1. 别碰 Objective-C,除非你想自虐。Swift 足够现代。
  2. 优先用 SwiftUI,虽然生态不如 UIKit 成熟,但学习曲线更平缓。
  3. 善用 Xcode 的调试工具,比如 View Hierarchy Debugger,比 Chrome DevTools 还直观。
  4. 别怕看官方文档,Apple 的 SwiftUI Tutorials 写得比很多中文博客清楚。
  5. 和运营对齐预期,别让他们以为“做个 App 和做个 H5 一样快”。

最后

现在这个 App 已经上线了,虽然只有三个页面,但每次看到 App Store 里自己的名字,还是有点小激动。更重要的是,我居然用 Swift 写出了能跑的代码,还和 RAG 系统打通了数据链路——这在两个月前,我是不敢想的。

大专学历、非科班、自学前端,这些标签曾经让我很自卑。但现在我明白:技术没有高低贵贱,能解决问题的就是好技术。说不定哪天,我还能用 Swift 写个自己的 Side Project,冲击一下独立开发者榜单呢?

(当然,前提是别再让我写 Objective-C 了,求求了。)


P.S. 上周五晚上加班到十点,终于搞定审核问题。走出公司大楼,抬头看到月亮,突然觉得:程序员的世界,其实也挺浪漫的。只要电脑不蓝屏,代码不报错,生活就有希望。

评论 0

最热最新
暂无评论
TechVanguardLv.1
0
影响力
0
文章
0
粉丝