{"id":2303,"date":"2014-09-14T10:12:53","date_gmt":"2014-09-13T22:12:53","guid":{"rendered":"https:\/\/www.deltics.co.nz\/blog\/?p=2303"},"modified":"2014-09-14T10:12:53","modified_gmt":"2014-09-13T22:12:53","slug":"zombie-apps-not-in-the-apple-app-store","status":"publish","type":"post","link":"https:\/\/www.deltics.co.nz\/blog\/posts\/2303\/","title":{"rendered":"Zombie Apps (not) in the Apple App Store"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">[Estimated Reading Time: <\/span> <span class=\"rt-time\">6<\/span> <span class=\"rt-label rt-postfix\">minutes]<\/span><\/span><p>In the run up to the announcement of the new iPhone 6 and the Apple Watch, Apple also revamped <strong>iTunes Connect<\/strong>, the portal through which apps are submitted to the App Store.  Unfortunately the new interface has a number of problems which I <del>spent<\/del> wasted hours dealing with yesterday.<\/p>\n<p><!--more--><\/p>\n<h2>Beginning at the Beginning<\/h2>\n<p>The problems all started when I realised that my <a href=\"https:\/\/www.deltics.co.nz\/apps\/txt2park\/\">TXT-2-PARK<\/a> app was supporting iPad devices when it really shouldn&#8217;t.  Even if an iPad has 3G capability and has a SIM, it is not able to send SMS texts from these devices (possibly if it is jailbroken there may be a way, but that isn&#8217;t my target market).<\/p>\n<p>So I made the necessary changes to the <strong>info.plist<\/strong> in my app and removed the <strong>iPad<\/strong> launch images, and was gratified to note that the app bundle now was barely over 100KB &#8211; much more reasonable.<\/p>\n<p>I had already pulled my app from the review process earlier in the week, as I had decided not to wait for the app to be reviewed before introducing advertising into the free version.  This (very simple) change had already been done.<\/p>\n<p>So all I had to do was submit my new binary and update the screenshots (to fairly represent the presence of advertising in the app).<\/p>\n<p>And this is when the problems began.<\/p>\n<h2>Incomplete Reasoning&#8230;<\/h2>\n<p>For perfectly valid reasons, Apple have a policy that states that an app should never support fewer devices than it originally supports.  So if you release an app that supports iPhone and iPad, you cannot then update that app such that it supports only iPhone (or only iPad).  You must instead release that as a new app.<\/p>\n<p>This makes a certain amount of sense &#8211; to a point.  I think it could be argued that in the case of free apps in particular, a user being unable to update to a newer version that doesn&#8217;t support their device isn&#8217;t being treated entirely unfairly.  Paid for app&#8217;s are a different matter.<\/p>\n<p>But where Apple&#8217;s reasoning completely falls down is that they apply this policy not just to free apps, but also <em>to apps that haven&#8217;t even yet been <strong>reviewed<\/strong> let alone released<\/em>.<\/p>\n<p>To make matters worse, the manner in which this is reported is less than helpful.<\/p>\n<p>The only indication you receive is when attempting to proceed to &#8220;Submit for Review&#8221;, at which point you get an error to the effect that:<\/p>\n<blockquote><p>iPad screenshots must be provided because the application binary indicates support for iPad<\/p><\/blockquote>\n<p>This initially had me chasing my tail trying to figure out what I had missed in my updated binary that still led the Apple systems to believe that it supported iPad, when it did not.  The fact is, that my binary did <strong>not<\/strong> indicate support for iPad.  The first binary I had uploaded had done so, but <em>I had pulled this binary before it had been reviewed<\/em>.<\/p>\n<p>I eventually stumbled upon the explanation and was able to set about resolving it.<\/p>\n<h2>Further Incomplete Reasoning&#8230;<\/h2>\n<p>I reasoned that I would have to delete my app registration and start over.  But oh no.  Not in the world of Apple logic.<\/p>\n<p>There <em>are<\/em> a number of situations under which it <em>is<\/em> possible to delete an app.  But all of these have one, over-arching condition.  Allow me to quote from the <strong>iTunes Connect Developer Guide<\/strong>:<\/p>\n<blockquote><p><strong>You cannot delete an app that has not been approved for the store.<\/strong><\/p><\/blockquote>\n<p>I simply cannot get my head around the logic that leads to this restriction at all.  It makes no sense at all.  But that&#8217;s the way it is.  So here I am with an app that I can only submit for review if I include support for devices that do not support my app&#8217;s functionality.  I suspect the app would not be approved precisely for this reason.  So this app is stuck in limbo.<\/p>\n<p>My first Zombie app.<\/p>\n<h2>Dealing with a Zombie<\/h2>\n<p>So, unable to delete my undead app, I had to start over with an entirely new app.  Of course, perfectly reasonably, you are not allowed to have apps with the same name so this meant renaming my zombie.  This, at least, is possible.  So I then set about creating my new listing.<\/p>\n<p>Having started to get a feeling for the sort of processes involved, I decided that as well as recreating my store listing details from scratch (unavoidable) I ought to also have an entirely new package name and that meant also having a new provisioning profile.  I arranged all of this, spitting feathers the whole time, and a short while later I had my new app listing and was ready to submit my new binary.<\/p>\n<p>I duly re-built for Release and used Application Loader (2.9.1 build 441 to be precise&#8230; a detail which will be important in a moment) to upload my binary.<\/p>\n<h2>Please Hold&#8230;<\/h2>\n<p>After uploading, it takes a while for <strong>iTunes Connect<\/strong> to &#8230; do something, though I am not entirely sure what &#8230; before you are able to then select that binary to submit for review as a new (or initial) version of your app.  If you try to add the build before this process has completed and attempt to Submit for Review you aren&#8217;t told to &#8220;please wait until the binary is ready&#8221;.  Rather <strong>iTunes Connect<\/strong> simply states that:<\/p>\n<blockquote><p>you need to upload a binary using Xcode 5.1.1. or Application Loader 2.9.1<\/p><\/blockquote>\n<p>Every indication is that it seems oblivious to the fact that you already did.<\/p>\n<p>Checking the status of the uploaded binary give no indication of any problem.  The binary is initially listed in a &#8220;Processing&#8221; section of the builds list, which changes to &#8220;Inactive&#8221; when that processing is complete.  Which apparently doesn&#8217;t mean that the processing is actually complete.<\/p>\n<p>Some people have suggested that re-uploading the binary can help get past this point.  I tried this.  A number of times.<\/p>\n<p>Others have suggested that you just have to wait, though some people have waited 20 hours or more without success.<\/p>\n<p>I think it is perhaps a combination of the two, <a href=\"http:\/\/stackoverflow.com\/questions\/25704171\/new-itunes-connect-interface-error-you-must-choose-a-build\">as indicated by the accepted answer to a question about this very problem on SO<\/a>.<\/p>\n<p>First try waiting&#8230; if a binary cannot be submitted after much more than 10 minutes (after processing has &#8220;completed&#8221;) then the binary might be &#8220;stuck&#8221;, and resubmitting could give it the nudge it needs.  Wait again.  Rinse and repeat as necessary.<\/p>\n<h2>10 Minute Call for The Fat Lady&#8230;<\/h2>\n<p>But we&#8217;re not quite done yet.  She may be warming up, but The Fat Lady is not yet ready to take the stage.<\/p>\n<p>I eventually was able to submit my new app listing for review.  At which point there is one final hoop that the Apple Gatekeepers require you to jump though.  A simple check list confirming that your app does or does not use encryption, present 3rd party content or employ an IDFA Advertising ID.<\/p>\n<p>Having introduced advertising to the app I had to quickly check on that last one and determined that using an AdBannerView and serving iAd advertising did not in fact mean that my app used an IDFA.<\/p>\n<p>So I ticked &#8220;No&#8221; to all of these questions and submitted this form.  Only to get yet another exquisite example of the increasingly familiar and resolutely unhelpful error messages that the new iTunes Connect loves so much:<\/p>\n<blockquote><p>A problem occurred and we were unable to update your application, please try again.  If the problem persists <strong>contact us<\/strong><\/p><\/blockquote>\n<p>So I tried again.  And again.  And again.<\/p>\n<p>In the end I tried to the &#8220;contact us&#8221; link only to find myself in a Moebius Strip of canned responses to specific questions where if the particular question you had was not listed, you were dumped right back at the &#8220;contact us&#8221; entry point to embark on another aimless wander down the Moebius Strip.<\/p>\n<p>Perhaps I was starting to think like an iTunes Connect Automaton, but for some reason it occurred to me to check my listing one more time.  Upon doing so, I realised that my app version in the listing was <strong>1.0.0<\/strong>, but the version in my <strong>info.plist<\/strong> was still at the version I had bumped up to &#8211; <strong>1.0.2<\/strong> &#8211; after having made various changes.<\/p>\n<p>I again cannot fathom why this discrepancy was not picked up earlier in the whole process.  The application bundle version is checked by the upload process (you cannot upload a version lower than that already present).  It might be expected that the build  version in the bindle would be checked at the point at which you associated a specific build with a particular version of the app listing.<\/p>\n<p>Changing the listing version number to match that in the binary made no difference.<\/p>\n<p>But the bundle version is checked to ensure that you don&#8217;t upload a lower version than that already uploaded, so I had to increment my version again, make sure the app listing corresponded to this new version, rebuild my app, re-upload the binary, &#8230; wait &#8230; wait &#8230; wait &#8230; and try again.<\/p>\n<p>At which point the Fat Lady burst into song!<\/p>\n<p>Finally!<\/p>\n<h2>The Take Away<\/h2>\n<ol>\n<li><strong>Right First Time is Crucial<\/strong>.  Once you have uploaded a binary, regardless of how far it gets in the review process, Apple won&#8217;t give you a second chance to determine your supported devices.  You can subsequently <em>increase<\/em> the number of supported devices, so if you are not absolutely certain err on the side of caution and start out with the bare minimum.  You can add more later.<\/li>\n<li><strong>Sweat the Petty Things<\/strong>.  The new <strong>iTunes Connect<\/strong> is resolutely unhelpful.  Despite the number of hoops you are forced to jump through to get an app submitted to the store, you cannot rely on the gatekeepers along the way to catch any mistakes you might have made and you can rely even less on getting any guidance from iTunes Connect to help you identify and rectify problems.  Make a check-list and follow it.<\/li>\n<li><strong>Patience is <del>a Virtue<\/del> Mandatory<\/strong>.  Even if you get everything right, iTunes Connect has a process to follow and is not at all helpful in accurately indicating exactly where in the process it is at any given time.  Sometimes you just have to wait.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">[Estimated Reading Time: <\/span> <span class=\"rt-time\">6<\/span> <span class=\"rt-label rt-postfix\">minutes]<\/span><\/span> In the run up to the announcement of the new iPhone 6 and the Apple Watch, Apple also revamped iTunes Connect, the portal through which apps are submitted to the App Store. Unfortunately the new interface has a number of problems which I spent wasted hours dealing with yesterday.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":[]},"categories":[4,213,204,180],"tags":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1TKYv-B9","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":2296,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/2296\/","url_meta":{"origin":2303,"position":0},"title":"Sign Here Please&#8230; (Using This Specific Pen)","date":"01 Sep 2014","format":false,"excerpt":"My original Android version of TXT-2-PARK has been in the Google Play Store for a little over a week now. But it was only on Saturday that I decided to install the release version onto my phone from the store itself, and found a problem. The application would download just\u2026","rel":"","context":"In &quot;Android&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1587,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/1587\/","url_meta":{"origin":2303,"position":1},"title":"Delphi for (Some) Android","date":"13 Sep 2013","format":false,"excerpt":"Embarcadero have blogged about the first Android app \"in the wild\" (actually, being on the Play store I think it's the first domesticated app - wild ones surely get side-loaded ? :)). Rather embarrassingly they already have a comment from someone unable to use this \"true native Android\" application on\u2026","rel":"","context":"In &quot;Android&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2274,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/2274\/","url_meta":{"origin":2303,"position":2},"title":"Small Post, for a (Very) Small App","date":"25 Aug 2014","format":false,"excerpt":"On Saturday I was out and about with my family and found myself inspired to write an app. By Sunday evening, it was done and in the Google Play store. We were in an area of Auckland called Parnell and needed to park the car on street, where a fairly\u2026","rel":"","context":"In &quot;Android&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2280,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/2280\/","url_meta":{"origin":2303,"position":3},"title":"Oxygene Constructor Magic on Cocoa","date":"30 Aug 2014","format":false,"excerpt":"Earlier this week I mentioned that I had published my TXT-2-PARK app for Android in the Google Play Store. Today I published the iOS version to the Apple App Store (still awaiting approval at this stage). As with the Android version, I implemented the iOS version using Oxygene, and things\u2026","rel":"","context":"In &quot;Android&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1896,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/1896\/","url_meta":{"origin":2303,"position":4},"title":"Getting Published in the Play Store (Google Apps)","date":"14 Oct 2013","format":false,"excerpt":"Well, this went far more smoothly than I had anticipated. At the XE5 World Tour event in Auckland, Brian Hamilton, creator of the iWD app, told us that getting his approved took about a week (if I recall correctly), and he had to submit a video showing how his app\u2026","rel":"","context":"In &quot;Android&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1670,"url":"https:\/\/www.deltics.co.nz\/blog\/posts\/1670\/","url_meta":{"origin":2303,"position":5},"title":"First Impressions Of XE5 for Android","date":"19 Sep 2013","format":false,"excerpt":"I thought I should at least take a look at the amazing Android support in XE5 so I decided to work through the tutorial that was brought to my attention recently. The first order of business of course, is getting installed. After making a cup of tea, reading a book,\u2026","rel":"","context":"In &quot;Android&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/posts\/2303"}],"collection":[{"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/comments?post=2303"}],"version-history":[{"count":3,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/posts\/2303\/revisions"}],"predecessor-version":[{"id":2306,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/posts\/2303\/revisions\/2306"}],"wp:attachment":[{"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/media?parent=2303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/categories?post=2303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.deltics.co.nz\/blog\/wp-json\/wp\/v2\/tags?post=2303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}