当前位置:首页>排行榜>苹果因为一个并不存在的排行榜,拒绝了这款游戏

苹果因为一个并不存在的排行榜,拒绝了这款游戏

  • 更新时间 2026-09-22 07:27:28
苹果因为一个并不存在的排行榜,拒绝了这款游戏

NIGHTMILE 今天早上上线了。它是一款为 iPhone 做的无尽漂移赛车,单手拇指就能开,完全免费,而且一行网络请求都不发。

有意思的不是游戏本身。有意思的是,苹果因为一个它并不具备的功能拒绝了它。读完那份拒信,我学到了一件我多年来一直弄错的事。

苹果因为一个不存在的排行榜拒绝了它

第二次拒绝来自指南 5.1.2,数据使用与共享。给出的理由是:未经同意,把用户成绩上传到一个全球排行榜。

没有排行榜。没有服务器。发布出来的构建里,fetch、XMLHttpRequest、WebSocket、sendBeacon 的出现次数统统是零。我去查了。因为在那大约十分钟里,我完全确信自己发布了一份不是我写的东西。

然后我打开了审核员打开的那个界面。NIGHT CIRCUIT 显示的是一份按排名排列的车手名单,其中一个名字读起来像是个用户名,还带着按周、按月、按全部时间筛选的选项,以及一个写着「1 天后重置」的倒计时。如果你从没见过代码,你也会把它叫作全球排行榜。我会。

所谓的对手,是八辆在你自己的设备上生成出来的幽灵车。这一点在隐私政策里写清楚了,写得准确又详细。只是审核员看的不是隐私政策。他看的是排行榜那个界面,而在那个界面上,没有任何地方说明它的真实身份。

所以修复只是一行文字,就写在这个界面本身上,说明这个东西到底是什么。

我一直要重新学习的那一课

一个写在了读者不会去看的地方的事实,等于一个根本没有被陈述的事实。

我确实做了功课。这个声明确实存在,写得很详尽,也正确。只是它放在了设置里,而设置是没人会去的地方,尤其是一个正处理审核队列的审核员更不会去。

这不是一个真正意义上的 App Store 教训。我做的每一次检测都说这个应用是干净的,而每一次检测回答的都是一个没有人在问的问题。真正被问的是「一个人看着这个界面会得出什么结论」,而没有任何一次 grep 能回答这个。

在重新提交之前,我把自己当成一个陌生人,把应用完整走了一遍,列出了每一个看起来像联网功能的界面。凡是有梯子、有排名、有信息流、有别人名字的地方,都加上了一行明白易懂的说明。不是看不清的小字,也不放在设置页里。

第一次被拒,顺便记录一下,属于 2.1 应用完整性,是一份带着八个问题的信息请求。那一次也算公平。

它到底能做什么

在玻璃上任意位置拖动来转向。按住第二根手指放氮气。连续漂移叠出连击倍率,在车流里穿行拿擦身而过加成。这里没有终点线,只有你上一把的分数。

有四个决定值得一提,因为它们足够不寻常,可以拿来验证,而不是营销话术。

它完全不做网络请求。没有账号,没有注册,没有任何东西离开手机。每一局在飞行模式下、在地下、在飞机上都能跑,而你的进度都存在设备上。

1.0 里没有广告,这个决定是在商店做出来之前就定下的。有六种可选的单次购买,没有开箱、没有随机宝箱,每一项在你点下去之前,都标明了价格和里面的内容。

四段配乐是在你驾驶时、由设备实时生成出来的。下载包里没有任何音频文件,这也是下载体积小的原因。

减弱动态效果会压住镜头晃动、停掉所有闪烁效果,而且如果 iOS 本身已经开了减弱动态效果,它会自己打开。这是为光敏感用户做的,而不是当成一行设置项加进去的。

那个让它变得可玩的数字

性能优化里有一组数字值得一提。在行驶状态下,绘制调用从 4935 降到了 964。在氮气状态下,从 5203 降到了 1022。

在这两个关键状态上大约砍掉了八成,而这正是「能在最新手机上跑」和「能在别人手里那台手机上跑」之间的差别。

大部分收益来自把那些本该合并的绘制合并掉。十四个一模一样的盒子用同一份材质、作为一个刚性整体旋转,就不需要十四次调用。轮子也一样,它的刹车盘盘面、盘边、轮毂共用同一份材质,彼此之间从不相对运动,也不需要每项各来一次。

这里有一个坦诚的声明,因为我差点写错。还有一次进一步的削减,从 921 降到 685,来自在第 11 个构建已经送交给苹果之后合并车壳。它是真实存在的,也是实测出来的,只是不在你今天能下载的那个版本里。它会随 1.0.1 一起上。

完整的工程故事,包括一个让整座城市侧着滑出公路的浮点数 bug,都在这篇《把一款 Three.js 游戏发到 iOS App Store》里。

配乐就是代码,这有代价

不联网的规则把音频推到了一个我没预料到的地方。什么都不流式传输,所以选择只剩下:要么打包音频文件,要么在设备上生成音乐。我选了生成。

四个电台,各有各的性格。经典合成器浪潮、一个更温暖的巡航电台、一个更重低音主导的,还有一个用回声搭起来的氛围电台。每一个音符都是你驾驶时实时演奏出来的。

我从中得到的主要好处,就是安装体积。四个电台、能一直听下去的长度,如果做成音频文件,会是整个下载里最占地方的东西。做成代码,成本几乎为零。它也不会像循环那样重复,因为根本没有你能听出重复的那第二遍。

代价是真实存在的,我宁愿说出来,而不是假装没有。你没法在听到一段程序化配乐之前先哼出它。没有哪一版是你能坐下来谱曲的,没有一段八小节能让你回放、调整。你能调的只有范围和规则,然后去听规则产生了什么。这个循环比写音乐慢得多、也更不确定,而且如果结果不对,你常常说不清是哪一个旋钮造成的。

在这里它值回票价,因为离线约束让它几乎成了必选项。允许随包发布配乐的游戏,我不会这么选。

27 天,以及这个数字藏起来的东西

第一次提交是 8 月 6 日。9 月 2 日上线。中间一共 273 次提交。

我不太想把它当成速度成绩来引用,因为这个数字夸错了东西。大约有三分之一的提交,是那两次被拒以及围绕它们的返工,而那都不是在做游戏。还有相当一部分是为了我一个人干所有活而存在的工具:截图生成、无头录制器、一个经济系统模拟器、一个直连 App Store Connect 的发布工具,这样我永远不用去信一份表单。

真正的游戏本身,花的时间比「发布游戏这套装置」要少。这,才是单人发布本来的样子,也不是「27 天」这个标题给人留下的印象。

经济系统是最好的例子。在调任何一个数字之前,我先写了一个模拟器,让一千个虚拟玩家各跑三十天,然后发现我的收益曲线是凹的,意思是表现好两倍的一局,给的钱不到两倍。对一款技术型游戏来说,这恰好是反的。靠手感我根本发现不了,我之前也写过,为什么要「先测量再做平衡」,而不是信任我自己对自己作品的判断。

底线

NIGHTMILE 现在已经在 App Store 免费上架,面向 iPhone,iOS 15 及以上。它竖屏可玩,单手拇指就能操作,完全没网也能跑。

如果你开起来,它能吸引你超过一局,那么一个评分真的会改变接下来发生的事。一张没有评分的商店页转化很差,也排不上任何榜,而头二十个评分是最难拿到的。这就是全部请求。

如果有什么坏了,或者难度感觉不对,或者某个界面让你像排行榜界面让审核员困惑那样陷入困惑,告诉我。help@raxxo.shop 能联系到真人,而 1.0.1 已经在路上了。

产品页在 raxxo.shop/pages/nightmile,其余的开发笔记都收在 The Lab 总览里。

来源

  • 原文标题:NIGHTMILE Is Out: Apple Rejected It for a Leaderboard It Does Not Have
  • 作者:RAXXO Studios
  • 发布平台:raxxo.shop(The Lab)
  • 原文链接:https://raxxo.shop/blogs/lab/nightmile-is-out-apple-rejected-it-for-a-leaderboard-it-does-not-have

相关链接

  • 完整工程故事:https://raxxo.shop/blogs/lab/shipping-a-three-js-game-to-the-ios-app-store
  • 先测量再做平衡:https://raxxo.shop/blogs/lab/the-performance-budget-every-raxxo-tool-has-to-meet-before-it-ships
  • NIGHTMILE 产品页:https://raxxo.shop/pages/nightmile
  • The Lab 总览:https://raxxo.shop/pages/lab-overview
  • The Lab 开发分类:https://raxxo.shop/blogs/lab/tagged/development

相关阅读:

一个运行了一年的个人 AI Agent:自动整理日历、邮件、会议和工作记忆

随机文章