加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0631zz.cn/)- 科技、云服务器、分布式云、容器、中间件!
当前位置: 首页 > 创业 > 创业经验 > 正文

iOS工程师14年创业手记:内容产品如何稳定盈利

发布时间:2026-11-10 14:09:05 所属栏目:创业经验 来源:DaWei
导读:  V2EX上又刷到有人问“知识付费怎么续命”,我关掉页面,顺手把刚拆开的梅干菜饼掰成三块——油蹭到键盘右下角F键,擦了两次没擦净。去年一月份,我删了App Store里自己写的第三个内容型App,后台服务器那晚没关,挂着,就挂了

  V2EX上又刷到有人问“知识付费怎么续命”,我关掉页面,顺手把刚拆开的梅干菜饼掰成三块——油蹭到键盘右下角F键,擦了两次没擦净。去年一月份,我删了App Store里自己写的第三个内容型App,后台服务器那晚没关,挂着,就挂了十八秒,自动触发了健康检查探针,然后全量回滚到上周二凌晨三点的快照。这事儿没人知道,连运维小张都以为是K8s集群自己抽风。


  我原以为删掉它就能喘口气。结果第二天早上七点四十,地铁10号线国贸站换乘通道里人贴人挤着,我手机弹出一条Crashlytics告警:`SIGSEGV at 0x0000000102a4f1c8 (libswiftCore.dylib)`,堆栈最后一行是`ContentFeedViewController.viewDidLoad()`。不是新用户,是老用户,iOS 15.7.3,iPhone XR,IDFA关闭状态。我一边低头划掉通知,一边想:这破VC里根本没调任何Swift泛型——它连`@available`都没写,纯OC混编。可报错了。我敢打包票,就是那个`@objc dynamic lazy var viewModel: FeedViewModel?`惹的祸,Swift Runtime在ARC销毁时误判了retain cycle,但你说不清——因为没日志,只有地址,连symbolicate都没用。


  后来才懂,“稳定盈利”根本不是模型、不是转化漏斗、不是私域GMV。是优胜劣汰。活下来的,不是最会画PRD的,也不是埋点最全的,是那些被苹果审核拒过七次、每次都在`info.plist`里多塞一个`NSPhotoLibraryUsageDescription`,最后靠一句“为优化图片裁剪体验”蒙混过关的人。我们做“字幕精读”这个产品,前半年日均DAU三百七十二,全部来自小红书自然流量。第三个月开始,苹果开始批量拦截`[UIPasteboard generalPasteboard]`调用——但我们早切了共享剪贴板的本地缓存路径。别人还在改plist,我们已经在iOS 16.4上线当天,把`pasteboard`逻辑降级成`NSUserDefaults`里存base64字符串。不优雅。但没崩。


  李工那会儿天天蹲在机房听空调外机嗡嗡响。他不信云服务SLA,非要在朝阳门租了个1U机架,放两台DELL R730,跑MySQL主从+Redis哨兵,硬盘还配了双RAID卡——就为保证用户点击“收藏”按钮那一瞬间的写操作不丢。结果第一次故障发生在去年春节初五下午四点十七分,是阿里云北京可用区B的元数据服务抖动,我们自建库反而毫发无损。他当场笑了,笑得有点难看,端起保温杯喝了口枸杞茶,杯底沉淀着三颗没泡开的枸杞,一直沉在那儿。


  王姐负责内容运营,去年一月份她提了个需求:“能不能让付费用户看完视频后,弹个‘你已看完第127分钟’的勋章”。技术方案会上我说不行,要动AVPlayerItem的duration观测链路,得重写时间戳同步逻辑。她说:“那你给我个能落地的”。我憋了三天,最后真给了个能落地的——用`CADisplayLink`每帧抓`player.currentTime()`,误差±0.8秒,再加个本地缓存校准offset。上线当天崩溃率涨0.3%,但勋章点亮率91%。我说不准这是不是值当的——后来发现91%里有六成人是点了“跳过”直接进勋章页的。可他们真付钱了。真付。


  那天晚上十一点半,我坐在公司楼下麦当劳吃第二份巨无霸。店员小哥换班,新来的没认出我,问我是不是常客。我说是。他说“那帮你把番茄酱包拆开放吧”。我点头,他转身去拿刀片,刀片没找到,掏出手机扫码点单,顺便把我们App的下载链接扫进了自己的微信收藏——就在他点“番茄酱拆包服务”的时候,我看到他微信头像右上角有个红色角标,是朋友圈未读消息,三条,最新一条发自昨天,配图是张Excel表格截图,标题栏写着《Q1私域转化SOP(终版V3.1)》。我没点开。


文章配图,仅供参考

  我们没做增长黑客。没搭BI大屏。没请MCN顾问。就每天盯着三个数:App Store留存曲线是否平滑、IAP成功率是否大于92%、后台任务队列平均延迟是否低于八百毫秒。只要其中两个同时亮红灯,我就暂停所有需求评审,所有人来改Crashlytics归因策略。有一次,为修一个iOS 17 beta下`WKWebView`的`document.title`同步丢失bug,团队熬了三天,最终发现不是WebKit问题,是苹果自己beta版的`-[WKNavigationDelegate webView:didCommitNavigation:]`回调顺序变了——而我们的JSBridge注册逻辑正卡在这个回调里。改完上线,凌晨两点,产品经理老周接了个电话,声音特别小:“我妈血压又高了…你先发吧,我马上回”。他挂电话后把咖啡泼在笔记本上,褐色水渍慢慢洇开,盖住了正在写的“会员分级权益图谱”表格线。


  优胜劣汰?对。但淘汰的不是代码质量,不是设计模式,不是你懂不懂Combine。淘汰的是谁能在苹果审核政策变更窗口期小于七十二小时的前提下,用SwiftUI写一套兼容iOS 14-17的支付弹窗,并且不触发任何`ASWebAuthenticationSession`的静默拒绝逻辑。我们第四版支付页,最终没用`ASWebAuthenticationSession`,也没用`SFAuthenticationSession`,用了`WKWebView`加载自有认证页,所有跳转走URL Scheme+deep link fallback。笨。但过了。上架七天,没被下架。比所有架构图都硬。


  哦对,忘了说:现在我电脑副屏开着Xcode,主屏开着VS Code,正在把一段Objective-C写的音频元数据解析模块,重写成Swift Concurrency风格。但中间卡住了——因为`AudioFileGetProperty`返回的`AudioStreamBasicDescription`结构体,在Swift里跨线程传递时,ARC会莫名其妙多一次retain。我试了`withUnsafePointer`、`unowned self`、甚至手动`CFRetain/CFRelease`……还是崩。这会儿窗外开始下雨,雨滴打在玻璃上的节奏不对,不像北京冬末的冷雨,倒像杭州滨江那边,梅雨季提前来了。算了,先关掉Xcode,等雨停。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!