前言
“Match问答”App今天终于通过了苹果的审核,在App Store上架了,苹果商店下载地址,不得不说,苹果的审核还是很严格的。因此今天想写一下从提交审核到被拒(若干回合)再到最终上架这段时间里的故事,其他技术方面的难点总结放到后面写。
上架前的必经之路————测试
在上架之前有一个关键的步骤其实很容易被忽略,特别是个人开发者,没法像公司那样聘请专业的测试团队进行完备的测试。大体上讲,iOS的测试可以分为3类:
- 单元测试、UI测试、性能测试、集成测试,通常在模拟器上进行
- 真机测试
- Testflight内测
模拟器测试
第一类测试通常可以发现App里所有可能的逻辑错误、排版问题和用户体验,在进行真机测试之前,一般需要保证模拟器适配各个手机尺寸,需要特别注意的是iPhone X刘海的打理。因为iPhone大小各异,而独立开发者通常不会有所有屏幕尺寸的机型,因此模拟器进行全面测试很有必要。
真机测试
第二类测试是真机测试,和模拟器的区别主要集中在功能和硬件两方面。功能方面,模拟器不支持信息、通话、短信、Accessibility功能(为残障人士准备);硬件方面,模拟器没有蓝牙、相机等硬件,模拟不了相关功能。如果使用了上述的功能,必须真机测试。即使没有使用,也应该安装到真机试试,如果你自己都不想用这个APP,别人更不会用。
Testflight内测
第三类也是需要苹果审核的,不过Testflight通常比较松,没有明显的bug、闪退一般会在24小时内批准。这一步通过之后,就可以邀请更多的亲朋好友来使用了,注意,这一步是邀请制的。需要开发者在itunes connect里手动添加相关测试人员的iCloud账号,当然也是支持CSV批量导入功能的。
当然Testflight测试也有限制,目前的限制提现在两方面:测试时间不超过90天、总测试人数上限是10000人,对于大部分应用来说已经很足够了。
TestFilght页截图,可见信息有测试剩余天数、邀请数、安装数、活跃用户数、崩溃数
App崩溃的可能原因
在测试过程中,App崩溃会经常发生。我遇到的比较常见的原因有:
- 代码出错
- OOM
- 网络状况
- cocoapods的问题
代码出错很常见,比如我经常犯的错误是ViewController的强制向下转型**,明明不是某个特定VC,你强制向他转,肯定会出错;JSON编码解码也经常会出错,如果没有相应机制,就会引起闪退。Objective-C*动态性能比较好,[obj method]这行代码即使obj对象没有method这个方法,在编译器也是不会报错的,但是运行时就会出错。
内存不够主要是应用在运行时占用了大量收集内存,使得系统强制将应用回收了。通过Instruments可以找到原因。
Instruments截图
网络状况出问题主要是网络不佳(蜂窝2G/3G信号网速慢)造成了相应超时;另外也有可能是后端服务器down掉了(请求太多处理不过来或受到攻击)。
cocoapods里的第三方库质量参差不齐,很难保证没有错误,我在开发Match初期就引了一个非常小众的库(这里就不点名了),已经不work了。我没有深究原因,有可能是Swift版本原因或者我个人使用有误。后面换了一个star数很多的库,就解决了。总体来说,那些大名鼎鼎、维护比较勤、关注度高的库比较solid一点,也推荐大家尽量使用那样的库。
上架
上架的流程比较复杂,具体的操作步骤我在这里就不展开介绍了,有需求的读者可以参考这个教程。
上架过程中会遇到一些坑,我不能全方面覆盖,只能结合一些自身经历给大家一些建议。
第一次提交审核 -> Reject
返回意见:
Guideline 2.1 - Information Needed
We have started the review of your app, but we were unable to successfully register for an in-app account. In order for us to review your app, please provide a demo account so that we may fully assess your app’s features.
第一次返回的意见是让我提供一个账户给他。Match采用的是短信动态验证,虽然我在审核信息里也说了需要审核人员填自己的手机号动态获取。。。但是! 谁让他的爷呢,我不得不给应用开了后门,乖乖的重新提交第二个版本。
第一次审核时间真是快,24小时内。
第二次审核 -> Reject
返回意见:
Guideline 2.1 - Information Needed
This type of app has been identified as one that may violate one or more of the following App Store Review Guidelines. Specifically, these types of apps often:
1.1.6 - Include false information, features, or misleading metadata.
2.3.0 - Undergo significant concept changes after approval
2.3.1 - Have hidden or undocumented features, including hidden “switches” that redirect to a gambling or lottery website
3.1.1 - Use payment mechanisms other than in-app purchase to unlock features or functionality in the app
3.2.1 - Do not come from the financial institution performing the loan services
4.3.0 - Are a duplicate of another app or are conspicuously similar to another app
5.2.1 - Were not submitted by the legal entity that owns and is responsible for offering any services provided by the app
5.2.3 - Facilitate illegal file sharing or include the ability to save, convert, or download media from third party sources without explicit authorization from those sources
5.3.4 - Do not have the necessary licensing and permissions for all the locations where the app is used
Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage
We noticed that your app requests the user’s consent to access their camera and photos but does not clarify the use of this feature in the permission modal alert.
第二次审核终于进入正题了,Guideline 2.1给的意见比较模糊,审核人员只是将所有的条款列了出来,并没有具体说到底违反了哪条。
Guideline 5.1.1是个坑,我搜了一下,很多其他开发者也都中过招。我记得之前在infoplist里是说了需要获得相机/相册的权限的,但是5.1.1说的是,你不仅需要申明你需要使用相机/相册,还要说为什么需要使用,编造一个原因吧。
针对Guideline 2.1,我们为了得到比较具体的回复,针对条款,逐条进行了回复,写了整整一页纸。
第二次审核时间:2天。
第三次审核 -> Reject
Guideline 2.1 - Information Needed
- How do users obtain 积分?
终于得到了不那么应付的2.1,原来是审核人员对我们应用内的虚拟货币的获取方式产生了怀疑。这点其实挺尴尬的,因为苹果不让接入支付宝和微信购买虚拟的货品,而内购的方式苹果会抽成30%,这个比例对于我们来说太高了。因此,我们制定了一个策略,即每天登陆送1个积分;内购功能正在做(其实还没有),回复了苹果提出的问题。
Guideline 2.3.10 - Performance - Accurate Metadata
- We noticed that your app or its metadata includes irrelevant third-party platform information.
Specifically, a non-iOS status bar is shown in the screenshots.
Referencing third-party platforms in your app or its metadata is not permitted on the App Store unless there is specific interactive functionality.
针对2.3.10,这点大家也需要特别注意,苹果特别反感安卓,在任何审核人员可见的地方,尽量不要出现安卓这个词。
问答系统里有很多安卓用户,回答高数的形式主要有两种,一种是在纸上手写答案;第二种是在软件内写公式和推导过程,写完后,用户直接截图,就会有安卓系统的顶栏。这点也被审核人员吐槽了,没办法,只能认错,说我们会尽量要求用户去掉顶栏。
第三次审核时间长了起来:5天,包含了周末两天。
第四次审核 -> Reject
第四次审核返回的还是2.1,关于用户获取如何积分的疑问。可能不是同一个审核人员吧,没有看我们的回复?这次我直接将首次针对这条的回复贴了进去,也是想得到一个不那么敷衍的回复罢了。
第四次审核时间:3天。
第五次审核 -> Accepted
不抱任何希望的情况下,今早收到了通知,居然被允许上架了,苹果审核真是玄学。虽然这时候已经做了最坏的打算,并开始2.0新版本的开发了,这其中就包括了内购,但1.0最终被接受也算是一件振奋人心好事儿。
苹果审核挺蛋疼的,需要做好被拒绝几次的准备。
后记
至此,我完成了当初给XZJ同学许诺的让Match上架App Store的约定。在1个月时间内利用下班时间重拾iOS开发技巧,熬夜克服了一个又一个困难,现在回想起来还挺值得的。看到别人手机、电脑上跑着我写的应用,是我作为一个程序员最大的满足。
最后,打一个广告,欢迎各位同学使用Match来学高数、赚零花钱。各大应用商店有售!
原文作者: Chih-Hao
原文链接: http://zhihaozhang.github.io/2018/08/02/Match3/
发表日期: August 2nd 2018, 3:31:04 pm
版权声明: 本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可
-
Next Post上架沙盒化应用,重启应用后保持文件持久访问性指南
-
Previous Post浅谈函数式编程 (Introducing Functional Programming)