4

Some apps, I've noticed that developers are able to update their software without submitting them to the App Store.

For example, Game of War will occasionally tell you that an update is available and to restart your device. You can then watch the progress bar carefully and see that updates are being pushed to the app.

I'm assuming they are using XML to change certain attributes and their location on the server. That's a guess but I don't know. They are able to make significant feature changes to the game, like adding hyperlinks to map locations, push sales promotions, add certain events etc. These methods don't require compilation, as that would obviously require resubmitting the app.

What technologies allow this? Are they all server side changes with XML objects being updated on the client? What is apple's policy in the developer terms?

  • If their code is interpreted it's pretty easy to just change the scripts. – toasted_flakes Mar 15 '14 at 14:17
  • The backend could be coded in an interpreted language. But something is also being pushed to the client. – ctilley79 Mar 15 '14 at 14:33
  • They can run interpreted code on the device too. – toasted_flakes Mar 15 '14 at 14:40
  • How? You're hinting at details that I would love to see in a well thought out answer. – ctilley79 Mar 16 '14 at 5:31
  • 1
    @grasGendarme there is a difference between downloading code (which can do arbitrary things) and downloading additional rules (here is an xml that describes the attributes of a new area, item - all the code necessary to implement it is already in place) and resources (images, music, etc...). – user40980 Jun 15 '14 at 0:10
3

Apple now explicitly allows interpretted code like Javascript to be 'Hot Code Pushed' to a device without an update.

3.3.2 An Application may not download or install executable code. Interpreted code may only be used in an Application if all scripts, code and interpreters are packaged in the Application and not downloaded. The only exception to the foregoing is scripts and code downloaded and run by Apple's built-in WebKit framework, provided that such scripts and code do not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store.

See here: Apple Allows Hot Code Push - Meteor

5

From the iOS guidelines, any app which downloads code in any form is (or at least should be) automatically rejected for the App Store. Most likely is that your app is downloading something which would be covered under the concept of 'content.' Depending on the particular app, this could be new images, sound effects/music, new structural descriptions (ie a file describing a new zone in your game, specifying how the game constructs it from existing resources, or resources included as part of the update), or any number of similar items. Basically, the AppStore component of the program will contain the logic used to construct and control the app, while the data being downloaded controls the specific content being shown at any given point in time.

From your example (Game of War), being an online multi-player game, it would likely contain code in the AppStore component which controls the interaction between the server and your device, how to send and receive chat messages, player actions, etc. I haven't played this particular game myself, but it appears to be using the standard gridded map model - each building (including it's phases of construction), and each unit on the map could be generated by the AppStore component based on downloaded image files and animation descriptions. Your game can incorporate updates including new unit types, or new buildings without having to change any code on the device, simply by downloading the components necessary to display them.

The structure is similar to how many MMO's (like World of Warcraft, etc) work on the PC, although the fact that interpreted code is still a fairly grey area in regards its legality in iOS apps (see this question) means that the apps are less likely to be downloading interpreted components which can change the fundamental interactions with the app (ie the actions you are able to perform in a game, or including a chat feature into an existing game, unless it was designed for and just not 'activated' in the initial release) and more just including new items which match one of the existing patterns of understood elements.

You will probably find this type of interaction more in games, where the coded logic makes up only a small fraction of the total size of the game and the majority of the size is the images, sounds, 3D models, structural descriptions, etc which the game uses to construct its internal environment, than in business apps. Essentially though, the inbuilt Maps and Music apps follow a similar concept:

  • your audio tracks would be the equivalent of a downloaded 'update' in Music
  • the idea of downloading purchased content to a new device through iTunes operates on the same principal
  • while I believe Maps on the iOS downloads the map images directly from a server, similar software in portable GPS devices use an internal store of map images and road descriptions which can be updated in this fashion to provide up-to-date information on new roads without having to change any compiled code
  • even the AppStore itself works under the same underlying theory, if you consider that the other installed applications are essentially it's 'content' (the AppStore can download an 'update' to another installed app without having to change any of its own code)
-1

I developed a business iOS application which had the purpose of providing clients with detailed information about products available for rental. When you initially install the app it comes with a local sqlite database.

Hosted elsewhere on the internet somewhere, we stored another database which was identical to the local database.

I added a table to serve as a changelog. It was given keys for edit_start and revision. Initial values set to 0.

Now each time I want to update the content of the database, I modify the remotely hosted database and before I'm done, I increment the revision number to 1 and I notate in the edit_start field, at which row did I begin adding new content.

Now each time the app closes on a users device, it will attempt to query the remote database, and check the changelog table checking to see if the revision number matches that of the local database. If it does not, it reads the edit_start value and downloads and overwrites the local database but only the effected rows. I also decided it best to do this when the app closes rather than opens in the event there is a long quantity of data that needs to be downloaded so the user doesn't end up trying to open the app and having to wait for content to download. The caveat is, users do not see the new content until the second time they open the app.

The complete source code of this project is available on Binpress.

  • 1
    While interesting, I don't see how this answers the question. – RubberDuck Apr 23 '16 at 21:10
  • Use case. Implementation. – davidcondrey Apr 25 '16 at 1:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.