Welcome to Day 31 of the 31 Days of iOSYesterday, talked about how to add Google Analytics into your application so that once it’s installed on people’s devices, you can understand how your app is being used.  Today, we’re finally going to wrap up the series.  Given everything we’ve covered so far, there is really only one thing we can cover in the last day: submitting your app to the Apple App Store.  Ok, there are a LOT of other topics we could go over today (or even get deeper on one of the topics we covered before).  However, it’s important to have a good understanding of how you submit your app, things you need to consider before you do, and what happens after you submit the app.  We aren’t going to be doing any coding today but we will talk about the changes you would need to make in Xcode for your application in order to submit.  You should have read this as soon as you signed up to be an iOS developer to make sure your application met Apple’s guidelines but in case you didn’t, read the App Store Review Guidelines(requires an iOS dev account) and make sure your app meets them.

Changes to the app

The first thing we’ll talk about are some of the things you’re going to want to do in Xcode with your app open.  First and foremost, make sure you’ve tested your app.  Test it on the simulator and test it on the device.  Then test it again.  The review process, as we’ll talk about later, can be a bit long and if Apple runs into issues with your app and has to reject it.  Then you have to fix the issues and submit again and go through the process again.  Now that you’ve made sure your app has no errors, let’s finish things.  First, select your project in the Project Navigator.  This will bring up your Target properties.  Go over to the Build Settings tab and make sure you’ve set the Release Code Signing Identity to whatever the correct identity is:

Release Signing Identity

The profile you choose here should be a Distribution Provisioning Profile that you’ll create in the iOS Provisioning Profile:

Distribution Provisioning Profile

With that done, make sure any configuration you have in your app (URLs, connection strings, etc) are pointing at their production resource.  If you haven’t already done so, make sure your [ProjectName]-Info.plist file contains all of your Required Device Capabilities.  You can read more about these capabilities here.  Next, choose iOS Device from the deployment location selector in the top left of Xcode:

Deployment Location

If you currently have a device plugged into your computer (which you might if you just did some testing as advised) then the item you want to choose may actually be the name of your device.  Now, from the Product menu choose Archive:

Archiving your app

After doing that, your app will build for device and release settings and the Organizer will open:

Archive in Organizer

Now, we need to set our app up in iTunes Connect before we can proceed.

itunes Connect

Now we’ll talk about getting your app set up in the iTunes portal.  Start by logging into iTunes Connect.  Click Manage Your Applications from the middle right side of the page.  At this point (unless you’ve done this before) you won’t have any apps available.  Click the Add New App button in the top left.  You’ll next need to enter some App Information:

App Information

The Default Language is the language you’re going to use to enter information about the app.  The App Name is the name your app will appear as in the App Store.  The SKU Number is a unique ID you can use to identify your app.  Lastly the Bundle ID has to be selected from the App IDs you have created in the iOS Provisioning Portal

Availability Info

In the next screen you’ll be able to select some availability info.  The Availability Date will indicate when your app will be available to show up in the store.  If your app has been approved and the selected date is in the past, it will be immediately released.  So if you want your app to go live as soon as it’s done being reviewed, leave it as the current date.  The Price Tier allows you to select how much you want to charge for your app (if it isn’t free).  The link below that to the Pricing Matrix gives a great breakdown of the price at each tier and how much of the price you get (Apple takes a cut).  The Discount for Educational Institutions and Custom B2B App checkboxes control availability and discounts which you can read more about using the question marks to the right of them. 

The next screen allows you to enter some Version Information.  Specifically you can enter a Version Number (we’ll use 1.0 for our first release), Copyright (we’ll use 2013 Chris Risner), and then we can select a Category.  This category affects where your app shows up in the App Store.  Make sure you’ve selected the one that best matches your app.  Next you can rate your app for several different categories (Cartoon or Fantasy Violence, Realistic Violence, Profanity, etc).  Depending on your selections for each one (None, Infrequent/Mild, or Frequent/Intense), you’ll see an age rating to the right of the ratings.  In addition, depending on your selections, you may be shown some information where you app cannot be made available due to local laws. 

App Metadata

After that we have Metadata.  This information all shows up with our app in the App Store.  The Description describes you app and will be the summary of your app people will read in the store.  Keywords are used to search for your app and should contain descriptive words for your app.  The Support URL should connect to a page that users can get support for your app from.  The Marketing URL which is optional should lead to a page that has more information about your app.  Lastly, the Privacy Policy URL should go to your company’s privacy policy and are required for apps that offer auto-renewal or free subscriptions (such as magazines).

App Review Information

Next is the App Review Information.  Here you’ll enter your (or your app’s designated contact) First Name, Last Name, Email Address, and Phone Number.  The Review Notes should contain any information the reviewer might need to review your app.  If there are any instructions or preface you’d want to give someone before using your app, this is where you should do it.  If any functionality in your app is behind a login, you MUST provide a Username and Password below.  If you need to provide multiple accounts, the rest of them should be in the Review Notes.  Next you can choose to enter a custom EULA if you want.  If not, the default App Store EULA will be used.  Finally, you’ll need to select assorted image files that will be used in the App Store for your app.  You can read more about the size of images you need to create here.  Finally, you can save your app.  Now we can see our app details:

App Details

There are a number of things we can do here using the buttons in the top right and you can find out more about them by clicking on them.  For now, click the View Details button in the bottom left.  The next screen will show you all of the information you just finished entering and contains a very important button:

Ready to Upload Button

That button is the Ready to Upload Binary.  When you’re ready to go, click that button.  The next screen is a Export Compliance window that asks if your app uses cryptography.  This is important because certain countries have laws about importing and exporting cryptography.  If your app uses it, make sure your pay attention on this page.  When you return to your app, it will be in the Waiting For Upload status.  Now we can return to Xcode.

Submitting your App to iTunes Connect

Once you’ve returned to Xcode, go back to the Organizer.  If you closed it, you can reopen it by going to the Window menu and choosing Organizer or hit Shift + Command + 2.  It’s recommended that you first hit the Validate button to validate your app.  This will make sure all of your signing identities, bundle identifiers, and profiles are set up correctly and will run a few other checks as well (such as checking that you have the right icons).  When it’s done, provided your app is correct, you should get a success message.

Passed Validation

Finally, hit the Distribute button beneath Validate.  In the next window choose Submit to the iOS App Store.  Enter your credentials (if necessary) and click next.  Choose the Application and the Code Signing Identity and hit next again.  Finally your app is being uploaded.  You should now get a Submission Succeeded window!  If you return to iTunes Connect, you should see that your status has moved to Upload Received:

Upload Received

Now the super fun review process begins.

The review process

Shortly after going to Upload Received, your app will move to Waiting for Review.  This is where the real review process begins.  Unfortunately, the review process is quite the black box.  There isn’t really any telling how long it will take to move into review or how long that review will take once it starts.  Your app is now in the review process, let’s talk about what happens next.  As a result of that, there isn’t much I can tell you about the Review Process.  You can read more about the possible statuses your app may move to once in review here.  The important thing to note is that once your app actually goes into review, the status will change to In Review.  If it fails, you’ll be given one of a couple rejected statuses.  If you’re approved, you’ll be moved to Ready for Sale.  If you had selected a date that is now in the past for the availability date, then it will go to the App Store immediately (once it gets out to Apple’s servers).  Otherwise it will wait until that time (unless you push it out early). 

If you need to prematurely pull your submission, you can do so by clicking on View Details in the app details and then going to Binary Details.  You’ll then see a Reject this Binary button. 

How long does the review take?

This is very common question and, for the reasons mentioned above, very hard to answer.  There is, however, a crowd sourced estimate you can somewhat rely upon at http://reviewtimes.shinydevelopment.com/.  This site looks at tweets with the #iosreviewtime hash tag in them and averages the numbers in those tweets over the past 30 days to give you the average time apps took to go from Waiting for Review to Ready for Sale.  I’d suggest you help the project out by tweeting how long your app once your app is available.

What happens if my app is rejected? 

Well, first don’t publish why your app was rejected.  Apple’s rejection notices are under a Non-Disclosure Agreement (NDA) which means you can’t share them.  Next, fix whatever the issues are and resubmit your app.  You can read more about the review guidelines and how to appeal a rejection here.

Updating your app

Once your app is live and in the store, you’re going to want to keep making improvements and push out new versions.  First, make sure you’ve updated the version locally in the target settings (from 1.0 to 1.1 for example).  Then follow the steps above.  After that, you can go into iTunes Connect and select your app and choose to upload a new version.  You’ll be able to update all of the metadata for your app including a new field named What’s New.  This field is used to display what the changes to your app were in the App Store.  Finally, you’ll also be given the option to choose if you want your app to be automatically released upon approval or if you want to release it manually once it’s approved.

Conclusion

That’s it.  You should now have all (enough) of the knowledge you need to build and submit an app the App Store.  A couple big points to remember about this is to make sure you’ve followed the app guidelines (you don’t want to find out after building your app that it majorly violates any of the rules) and to give yourself enough time for a very unknown review process.  Additionally, there are times when iTunes Connect is locked (such as around the holidays or during maintenance periods).  If you’re building an app for a company or for your own, never assume your app will be available in the app store by a certain time.  With those things in mind, you shouldn’t hit too many bumps in the road to your app submission.


Chris Risner