Skip to main content

iTunes Connect App Statuses

See Apple Managing Your Apps

Table 9-1  iTunes Connect app statuses
Status Name
../Art/status_yellow.pngPrepare For UploadAppears as the first status for your app. This status means that you should enter or edit metadata, screenshots, pricing, In-App Purchases, Game Center, iAd Network settings, and so on, to prepare your app for upload to the App Store.X
../Art/status_yellow.pngWaiting For UploadAppears when you’ve completed entering your metadata and indicated that you are ready to submit your binary, however, you have not finished uploading your binary through Application Loader. Your app must be Waiting For Upload for you to be able to deliver your binary through Application Loader.X
../Art/status_yellow.pngWaiting For ReviewAppears after you submit a new app or update and before the app is reviewed by Apple. This status means that your app has been added to the app review queue but has not yet started the review process. Because it takes time to review binaries, keep in mind that this state does not indicate that your app is currently being reviewed.
While your app is waiting for review, you can:
  • Reject your binary to remove it from the Apple review queue
  • Edit certain app information
../Art/status_yellow.pngIn ReviewAppears when Apple is currently reviewing your app before the app is rejected or approved. Note that it takes time to review binaries. We appreciate your patience and ask that you allow sufficient time for the processing of your app.
../Art/status_yellow.pngPending ContractAppears when your app has been reviewed and is ready for sale but your contracts are not yet in effect. You can check the progress of your contracts in the Contracts, Tax & Banking module. See“Managing Contracts, Taxes, and Banking.”
../Art/status_yellow.pngWaiting For Export ComplianceAppears when your CCATS file is in review with Export Compliance.X
../Art/status_yellow.pngUpload ReceivedAppears when your binary has been received through Application Loader but has not yet completed processing into the iTunes Connect system. If your app has been in the Upload Received status for more than 24 hours, you should contact iTunes Connect Support through the iTunes Connect Contact Us module.X
../Art/status_yellow.pngPending Developer ReleaseAppears when your app version has been approved by Apple and you have chosen to set your version release control. Release it to the App Store when you are ready. To release your app to the App Store, click the Release This Version button on the app’s Version Details page within Manage Your Apps.
../Art/status_yellow.pngProcessing for App StoreAppears when your binary is being processed and will be ready for sale within 24 hours.
../Art/status_yellow.pngPending Apple ReleaseAppears when your app version will be held by Apple until the corresponding Apple iOS or OS version is released to the public.
../Art/status_green.pngReady For SaleAppears after the binary has been approved and the app is posted to the App Store. When your app is in this state, you have the option to remove it from the store by going to the “Rights and Pricing” page and removing all App Store territories. See “Removing an App from Sale.”
../Art/status_red.pngRejectedAppears when the binary has not passed review. You receive a communication from App Review in the Resolution Center regarding the reason for the rejection.X
../Art/status_red.pngMetadata RejectedAppears when specific metadata items aside from your binary have not passed review. To resolve the issue, edit the metadata in iTunes Connect and your existing binary is then reused for the review process. You receive a communication from App Review in the Resolution Center regarding the reason for the metadata rejection.X
../Art/status_red.pngRemoved From SaleAppears when your app has been removed from the App Store.
../Art/status_red.pngDeveloper RejectedAppears when you’ve rejected the binary from the review process. Choosing the Developer Rejected status removes your app from the review queue. After you resubmit your binary, the app review process starts over from the beginning.X
../Art/status_red.pngDeveloper Removed From SaleAppears when you’ve removed the app from the App Store. See“Removing an App from Sale” and “Putting an App Back on Sale.”
../Art/status_red.pngInvalid BinaryAppears when your binary has been received through Application Loader but did not meet all requirements for upload. You receive an email detailing the issue with your binary and showing how to resolve it. To resend the resolved binary, go into iTunes Connect and click Ready to Upload Binary again. This action sets your app back to the Waiting For Upload state so that you can resend the binary through Application Loader.X
../Art/status_red.pngMissing ScreenshotAvailable for iOS apps only. Appears when your app is missing a required screenshot for iPhone and iPod touch or iPad for your default language app or for your added localizations. At least one screenshot is required for both iPhone and iPod touch, and for iPad if you are submitting a universal app.
Click the number next to the status to view a list of the territories in which a screenshot is missing.


Most Favorite Posts

Pattern: Riblets vs. VIPER

Engineering the architecture behind Uber's new rider app

Not being held back by our extensive codebase and previous design choices gave us the freedom where we otherwise would have made compromises. The outcome is the sleek new app you see today, which implements a new mobile architecture across both iOS and Android. Read on to learn why we felt the need to create this new architecture pattern, called Riblets, and how it helps us reach our goals.

The platforms share:

Core architectureClass namesInheritance relationships between business logic unitsHow business logic is dividedPlugin points (names, existence, structure, etc.)Reactive programming chainsUnified platform components
Each Riblet is made up of one Router, Interactor, and Builder with its Component (hence the name), and optional Presenters and Views. The Router and Interactor handle the business logic, while the Presenter and View handle the view logic.


Implementing UI tests on iOS and Android using screenshot comparison tools

Have you ever thought when writing or maintaining UI tests, there must be a better way?

Take a look at screenshot tests provided by Google Firebase and Facebook:

A "snapshot test case" takes a configured UIView or CALayer and uses the renderInContext: method to get an image snapshot of its contents. It compares this snapshot to a "reference image" stored in your source code repository and fails the test if the two images don't match.

GitHub Facebook

Testing rendering for your Android app is hard. How do you prevent visual regressions in paddings and margins and colors from creeping in?
Iterating on UI code is hard. How do you quickly verify that your layout or view changes work correctly in all configurations?

screenshot-tests-for-android can solve these problems by providing a test framework that checks for visual differences across changes.

GitHub Facebook

Google Firebase Test Lab
Test Lab lets you run Espresso, …


WireMock is a flexible library for stubbing and mocking web services. Unlike general purpose mocking tools it works by creating an actual HTTP server that your code under test can connect to as it would a real web service.

It supports HTTP response stubbing, request verification, proxy/intercept, record/playback of stubs and fault injection, and can be used from within a unit test or deployed into a test environment.

Although it’s written in Java, there’s also a JSON API so you can use it with pretty much any language out there.

How to link to TestFlight App in iOS

There are two things you need to do. First, check to see if TestFlight is installed. Then create a new link to your app.

NSURL *customAppURL = [NSURL URLWithString:@"itms-beta://"];
if ([[UIApplication sharedApplication] canOpenURL:customAppURL]) {

    // TestFlight is installed

    // Special link that includes the app's Apple ID
    customAppURL = [NSURL URLWithString:@""]; 
    [[UIApplication sharedApplication] openURL:customAppURL];

This special URL will be opened directly in TestFlight.

Finally, if you are using iOS 9 (or later), you need to make an addition to your Info.plist to get the canOpenURL: method to work.

If your app is linked on or after iOS 9.0, you must declare the URL schemes you want to pass to this method. Do this by using the LSApplicationQueriesSchemes array in your Xcode project’s Info.plist file. For each URL scheme you want your app to use with this method, add it …

Stetho - A Chrome debug bridge for Android applications

Stetho is a sophisticated debug bridge for Android applications. When enabled, developers have access to the Chrome Developer Tools feature natively part of the Chrome desktop browser. Developers can also choose to enable the optional dumpapp tool which offers a powerful command-line interface to application internals.

Facebook Github

iOS 7 Blur Effect

Combining a strong colour with a blurred and translucent UINavigationBar in iOS 7.

// cheers to @stroughtonsmith for helping out with this one
UIColor *barColour = [UIColor colorWithRed:0.13f green:0.14f blue:0.15f alpha:1.00f];

UIView *colourView = [[UIView alloc] initWithFrame:CGRectMake(0.f, -20.f, 320.f, 64.f)];
colourView.opaque = NO;
colourView.alpha = .7f;
colourView.backgroundColor = barColour;

self.navigationBar.barTintColor = barColour;

[self.navigationBar.layer insertSublayer:colourView.layer atIndex:1];

GitHub Gist
See also

And also
myView.backgroundColor = [UIColor clearColor];
UIToolbar* bgToolbar = [[UIToolbar alloc] initWithFrame:myView.frame];
bgToolbar.barStyle = UIBarStyleDefault;
[myView.superview insertSubview:bgToolbar belowSubview:myView];

Why bother replicating the effect? Just draw a UIToolbar behind your view.

NSURLConnection with Accept-Encoding: gzip

For quite some time I ranted about not being able to use compressed network communcation out-of-the-box on the iPhone.

Despite being undocumented (or I just overlooked the hint), NSURLConnection does gzip decompression transparently!

That’s how to use it:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
// set explicitly:
[request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];