本文包括加急审核的介绍、如何使用教学,以及最重要的……加急审核必过黄金方案。
什么是加急审核
首先,提交二进制文件到 App Store,是要交给 App Store Review 团队去审核的。下面这句话是我从他们那边拿到的官方数据:
On average, 50 percent of apps are reviewed in 24 hours and over 90 percent are reviewed in 48 hours.
50% 的应用在 24h 以内得到了审核,超过 90% 的应用在 48h 以内得到了审核。
跟我我个人的经验,如果你在中国,那么一般来说,第一天早上提交的应用,有可能在第二天的凌晨过审。第一天中午之后提交的应用,过审基本要等到第三天凌晨、或者第二天深夜了。
而多数都是第二种情况,也就意味着,从提交到审核这中间,可能会经历整整一个白天,如果是周末(美国时间周末),时间可能更长。于是,如果你有特殊情况,比如 App 有严重 bug,一启动就崩溃什么的,那么你可以申请加急审核。当然,加急审核也是要排队的,但是排队的人数就少多啦。
很多人的误解
很多人对加急审核有一些含糊不清的地方,这里详解一下:
- 认为加急审核的次数非常有限,用完了就不能用了。但是其实官方并没有对次数做限制,只是说希望大家不要滥用加急审核,免得你真正需要的时候不让你用了,但是并没有一个可量化的机制来限制你。(当然了,方便自己也方便同行,大家还是不要滥用啦)
- 有人认为加急审核被同意了之后,会迅速开始审核。但是其实判定是否给你加急审核的团队,和给你审核的团队,是两个团队。 所以同意给你加急审核之后,你还需要几十分钟到几小时不等的加急排队时间。
- 加急审核状态下,如果你的 App 被拒了,是不需要再次申请加急审核的,你已经在加急通道里面了,直到你最终过审。这点你每次申请的时候,官方都会重复告知。
附上我今年截止到 8 月,申请加急审核全部通过的记录:
加急审核邮件
如何申请加急审核
官方唯一加急审核地址:https://developer.apple.com/contact/app-store/?topic=expedite
Contact the App Review Team
申请起来倒是非常简单,进链接填表就行了,关键是最后一部分,你有三种选择来申请加急审核。分别是:致命 bug、敏感时间问题、以及其他特殊情况。
第二种情况我从来没用过,网上倒是有很多案例,比如某个官方大会的 App 还没过审,但是会议马上就要开了,云云。。。
第三种情况用过一次,是Hälsa Online – Livs Helper这个应用,当时我声泪俱下地跟他们说,百度怎么怎么坑人,这个应用再不过审,又会有更多的人被坑,于是审核全程开绿灯……这个时间比较早了,当时审核一次还需要 7 天时间,而我做 App 花了一天,加急审核花了一天,总共两天就上线。所以这个应用就变成了 App Store 上的第一款针对莆田医院的 App,上线当天没有任何推广,下载量过万。
加急审核必过攻略
我在专栏的之前的文章也提到过,建议大家使用类似 Fabric 这样的崩溃收集工具。这里连带加急审核,还有一个附带的好处。
那就是,在你以 “Critical Bug Fix” 为理由申请加急审核的时候,以下面这个范例申请,几乎可以说是必过:
- 如果 bug 可以复现,讲清楚怎么复现,复现路径。如果是偶发性 bug,也告知对方,bug 是偶发的。
- 清楚地写出来,现有 App Store 上的 App 是有问题的,而新版本解决了这一问题,并且这一问题严重地影响了你的用户体验,比如你可以说这是你的应用的核心功能。
- 这一点是在你希望申请加急,又不能保证他们给过的时候,最能蒙混过关的一点。因为你可能说不清 bug 复现路径,甚至不确定你真的 100% 解决了问题。那么,你可以直接附上,使用类似 Fabric 或者 Bugly 等等这样的崩溃收集工具,收集下的 Crash Log,举例:
-
Fatal Exception: NSInternalInconsistencyException
-
0 CoreFoundation 0x182382d8c __exceptionPreprocess
-
1 libobjc.A.dylib 0x18153c5ec objc_exception_throw
-
2 CoreFoundation 0x182382bf8 +[NSException raise:format:]
-
3 Foundation 0x182d72fa0 -[NSAssertionHandlerhandleFailureInMethod:object:file:lineNumber:description:]
-
4 UIKit 0x18bf5ea80 -[UIApplication_runWithMainScene:transitionContext:completion:]
-
5 UIKit 0x18c58eb1c __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke
-
6 UIKit 0x18bf5ddd0 +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:]
-
7 UIKit 0x18bf5dc6c -[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]
-
8 UIKit 0x18bf5cafc -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:]
-
9 UIKit 0x18cbf284c __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke
-
10 UIKit 0x18bf5c1ec -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]
-
11 UIKit 0x18c9d7ac8 __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke
-
12 UIKit 0x18cb25bf8 _performActionsWithDelayForTransitionContext
-
13 UIKit 0x18bf5bc0c -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]
-
14 UIKit 0x18bf5b5a8 -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:]
-
15 UIKit 0x18bf585e0 -[UIApplicationworkspace:didCreateScene:withTransitionContext:completion:]
-
16 UIKit 0x18bf58330 -[UIApplicationSceneClientAgentscene:didInitializeWithEvent:completion:]
-
17 FrontBoardServices 0x184b84470 -[FBSSceneImpl _didCreateWithTransitionContext:completion:]
-
18 FrontBoardServices 0x184b8cd6c __56-[FBSWorkspace client:handleCreateScene:withCompletion:]_block_invoke_2
-
19 libdispatch.dylib 0x181c74a60 _dispatch_client_callout
-
20 libdispatch.dylib 0x181c7c170 _dispatch_block_invoke_direct$VARIANT$mp
-
21 FrontBoardServices 0x184bb8878 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__
-
22 FrontBoardServices 0x184bb851c -[FBSSerialQueue _performNext]
-
23 FrontBoardServices 0x184bb8ab8 -[FBSSerialQueue _performNextFromRunLoopSource]
-
24 CoreFoundation 0x18232b404__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
-
25 CoreFoundation 0x18232ac2c __CFRunLoopDoSources0
-
26 CoreFoundation 0x18232879c __CFRunLoopRun
-
27 CoreFoundation 0x182248da8 CFRunLoopRunSpecific
-
28 GraphicsServices 0x18422e020 GSEventRunModal
-
29 UIKit 0x18c268758 UIApplicationMain
-
30 FastRecord 0x1040443f8 main (AppDelegate.swift:17)
-
31 libdyld.dylib 0x181cd9fc0 start
给一个完整案例示范:
Reason: Critical Bug Fix
Explanation:
The current version of my app on App Store, has a critical bug, which could crash when user \(这个地方写上你的应用的相关操作,比如滑动网页、保存图片……) touching the webview. The new version fixed this bug.
Here is full crash log:
- Fatal Exception: NSInternalInconsistencyException
0 CoreFoundation 0x182382d8c __exceptionPreprocess
……………………
……………………
……………………
最后加一句:即便有这样的极高成功率的攻略,还是希望大家不要滥用,为了自己也为了同行。