总结iOS审核4.3a被拒原理与解决方案
理解和解决苹果审核4.3(a)
背景:有一app由flutter+native代码组成,由于账户的原因app被下架。
一、于是有了以下尝试和猜想:
1、更换一个新的账号,仅更换了bundleID,直接打包原来的项目进行上传。结果就是4.3a。
1 | Guideline 4.3(a) - Design - Spam |
2、搜索了一些网络建议,我们又更换了账号、更换了图标、APP名称、域名、bundleID、对flutter代码进行大部分类的名称重命名,flutter中的图片进行转换压缩,我们还认为苹果对主要页面首页、登录页等进行了标记,因此还更换了首页样式、登录页背景等。提审后还是4.3a。
3、为了上架我们和其他开发者讨论,他们重写了整个应用进而成功通过审核。因此我们这次,重新对APP创建项目,之前是native+flutter项目,这次我们直接flutter起底,更换了账号(正常的账号并有上线的项目)、图标、名称、域名、bundleID、应用内购项目金额等一切在AppStore上所有的资料进行了完全不同的内容,以便看起来是全新的APP。同时,我们对首页、登录页、设置页、商城VIP购买页进行了全新的设计和开发,其中临时开发的登录页、设置页、商城页仅仅为了通过审核而简单开发,功能相对原版并不完整。因此我们在新开发的APP中flutter项目里把原来项目的登录设置页及其所有内页进行了copy到新的项目中,flutter的版本号也从3.3.8升级到4.29.7最新版本,最后我们通过另外一台电脑在异地进行打包并上传。结果是成功上架,后面我们更新了两个版本将APP名称更改为被下架APP的名称。
因此,我们做了这次总结,是因为我们做了第三次彻底的开发,我们认为苹果对应用的代码和资源,APP资料,图标,关键页面(首页、登录页等),账户,上传电脑,IP等做了标记,因此达到一个阈值就会触发4.3(a)的。
4、我们将APP转移到第二步的账号(甲方),虽然被拒审的APP依然存在并无法删除,但我们认为已经上架的APP应该不会有什么影响。
二、4.3(a)又回来了
1、我们认为应用已经上架并安全后,我们尝试更换应用图标,以便与Android保持一致,同样使用上述第三步的电脑打包上传,但这次唯一的变量就是图标和账户。结果竟然是4.3(a)。
2、由于我们为了成功上架做了很大的改动和动用了很多的人力,再次更换并重新开发以及重头再来的念想并不是很强烈,毕竟已经上架的APP还可以继续下载使用,只是不能再更新。实际上我们还是对苹果4.3的审核没有完全的认识,一味的换账号等方式可能都是徒劳的,因此我们只能硬着头皮向苹果审核员回复介绍我们的APP的理念设计及特点,以换来通过审核的意愿,然而苹果的回复是:
1 | Thank you for providing this clarification. During our review, we found that this app appears to be similar as another app submitted to the App Store. Apps that duplicate the content or functionality of other previously submitted apps are not appropriate for the App Store. |
3、苹果的回复让我恍然大悟,通过观察审核的时间,被4.3(a)的审核时长在30分钟左右就被打回来了,如下图:
而成功上架的审核时长在2~3个小时。如下图:
因此我认为,苹果的4.3(a)是由机器判定的,如果审核时间短并被拒绝4.3a,那么应用在开始审核时就很快判定了上传的IPA包违反了4.3a,所以4.3a的标准仅仅存在于代码和资源文件的相似程度上。
最终的猜想
1、通过上述的分析,4.3(a)是机器判定的,人工审核其实并不会在意应用的名称、icon、首页、登录页、设置页等页面的,人工审核仅仅是为了查看应用的是否存在bug,是否符合其他的审核规则,换位思考如果我是审核员,每天这么多的APP需要审核谁会记住所有的APP长什么样子叫什么名字,相对于机器而言审查代码比审查应用长什么样子更容易一些,如果页面功能相似那么代码的相似度会大大提升,因此代码审查更科学。
2、应用账户和上传电脑Mac地址及IP会影响4.3a判断的标准。既然是机器判定的那么我对APP相似度做了以下猜想:
- 设定苹果目标应用为A,代码资源相似度为100%。
- 上述第一次仅更换bundleID,那么与A的相似度为99%。
- 上述第二次简单的类名重命名,资源文件简单压缩,那么与A的相似度为70%。
- 上述第三次重建项目,多写了一些页面,增加了dart代码,那么与A的相似度来到了55%。
重点来了,同账户、同打包电脑、同上传IP,那么相似度大于50%就判定为4.3a,非同账户打包电脑上传IP,那么相似度大于60%就判定为4.3a。
这样的话,上述的4次提审就非常符合我们的想法,第三次由于是不同账号电脑IP因此小于60%的相似度审核通过,反而转移到甲方的账号,相似度判定4.3a提高到50%,因此被拒。
最终提审上架
所以,应用的代码和资源文件的相似度是机器判定4.3a的关键,通过手动更改部分类名,压缩图片资源等,仅仅只能降低一点相似度,可能是55%降低到52%,但依然大于50% 的判定阈值。于是我想到了代码的混淆。
flutter项目的混淆分为三个部分,一个是dart代码的混淆,一个是资源图片的采样,最后是ios原生代码的混淆。
flutter代码的混淆很简单,采用flutter命令打包ipa即可,如下:
1 | flutter build ipa --obfuscate --split-debug-info=./symbols/ |
而原生代码及图片的混淆怎么搞?如是我查询了deepseek
看到专门解决4.3问题,同时支持多种语言混淆和资源混淆,让我眼前一亮。
因此我迫不及待了下载了该软件,发现还是免费的软件(https://www.ipaguard.com/),真是喜出望外。因此我把flutter打出的IPA包通过此工具进行了混淆并于当晚进行了提审操作。按道理来讲混淆后的安装包与A的相似度下降到10%以下。第二天,审核通过,审核时长也来到了2~3小时。