• Simplifying Ad-Hoc Distribution

    As an iOS freelancer, I work with many different clients every day, who all have their own processes and workflows. Distributing ad-hoc builds is just a small part of developing an app, but it’s usually the first experience a client will have with your work, so it’s important to make this process as smooth as possible.

    There are many different ways of distributing builds. TestFlight and HockeyApp are two well known services, while Over the Air (OTA) is more of a manual style of distribution. Each have their own advantages and disadvantages, but the main thing I’ve noticed is that every client has different needs and different preferences – there’s no one size fits all option.

    With this in mind, I’ve been developing a tool to make the process of distribution more uniform, so that regardless of what service or method you might use, the interface remains consistent. It’s very much a work in progress, but here’s how it looks today:

    Work in Progress

    After selecting a IPA file, you have the option to select your destination. Currently the app supports Dropbox, FTP, and SFTP, but I’ll be adding TestFlight, HockeyApp and Amazon S3 in the near future. The Directory might be the name of your client, while the Files section lets you select which files to upload. Finally, there’s a section for release notes. Tapping Go will create the relevant Property List and HTML files necessary for OTA distribution, and then upload all the files to your chosen destination.

    The nice thing about controlling this process via code is that we can include some handy information on the HTML installation page, or in the case of TestFlight or HockeyApp, this information gets passed on directly:

    HTML output

    It’s usable currently, but there’s still a lot of work to do, some of which includes:

    • more destinations, eg. TestFlight, HockeyApp, Amazon S3
    • ability to upload different files to different destinations. For example, you might store the Property List in Dropbox, and your HTML file on an FTP server
    • ability to upload dSYMs
    • ability to upload other related files (eg. logos etc)
    • ability to customise the output HTML
    • proper user preferences and account setup
    • options for post-upload tasks, eg. shorten URL for the HTML file, send an email, etc
    • ability to save and load different arrangements for different clients

    I also need to spend a lot more time on the interface. Being my first OS X app, I’ve found the UI to be quite a challenge – even just knowing which controls to use can be difficult.

    With Apple’s recent acquisition of TestFlight’s parent company, the future for this tool is a little unclear at this point. The main thing is that I’m finding it useful today. If it sounds like it might be interesting to you as well, let me know, I’d love to hear your feedback.

  • Pretty Pie Charts with XYPieChart

    XYPieChart is a simple to use, great looking component for drawing pie charts in iOS apps. I recently needed a pie chart for an app I’m working on, and I can honestly say this was one of the nicest experiences I’ve ever had with a 3rd party component. This video on Vimeo gives you a nice overview of it’s capabilities.


    Out of the box, XYPieChart looks fantastic, with a nice selection of colours and some snazzy animations. Of course, this is all customisable – select whatever colours you like, turn animations on or off, change the fonts – most of these customisations are just a single line of code. In fact, I only have a total of 16 lines of code in my UIViewController for displaying, customising and updating my pie chart.

    XYPieChart uses the datasource and delegate pattern, which should be familiar, and the clean and simple API is pretty much self explanatory. For example:

    - (NSUInteger)numberOfSlicesInPieChart:(XYPieChart *)pieChart {
        return self.values.count;
    - (CGFloat)pieChart:(XYPieChart *)pieChart valueForSliceAtIndex:(NSUInteger)index {
    	NSNumber* value = self.values[index];
    	return value.doubleValue;

    Couldn’t be easier, right?

    If you ever have a need for any sort of pie chart in your iOS apps, I would definitely recommend giving XYPieChart a go.

  • Are you using Parse yet?

    As an iOS developer who finds creating databases and web services incredibly boring, Parse has always sounded very attractive. For those who don’t know, Parse provides a way for developers to store data in the cloud. They offer a number of other services as well, such as push notifications, cloud-based code, and social integration, but I believe data storage has always been their core business. There’s no databases to setup, no web services to create, no servers to maintain – all you need to do is focus on creating a great front-end product, and they do the rest. At least, that’s what I was expecting without ever having used it before.

    I finally had a chance to play with Parse this week, and I was very pleased to find out that Parse lived up to my expectations, and more. It’s incredibly simple to setup and develop for, and I’m now falling over myself to try and find more projects to use with it. Here’s a few of the things that really impressed me.

    Storing and retrieving data is drop-dead simple. Here’s an example from their documentation:

    PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
    [gameScore setObject:[NSNumber numberWithInt:1337] forKey:@"score"];
    [gameScore setObject:@"Sean Plott" forKey:@"playerName"];
    [gameScore setObject:[NSNumber numberWithBool:NO] forKey:@"cheatMode"];
    [gameScore saveInBackground];

    And…we’re done, the object is now stored on Parse’s servers. No tables had to be created, no columns had to be defined. There’s several ways you can save data too, including block-based completion callbacks, and even the ability to automatically save later in case the network connection is down.

    Retrieving data is just as easy:

    PFQuery *query = [PFQuery queryWithClassName:@"GameScore"];
    [query getObjectInBackgroundWithId:@"xWMyZ4YEGZ" block:^(PFObject *gameScore, NSError *error) {
        // Do something with the returned PFObject in the gameScore variable.
        NSLog(@"%@", gameScore);        

    This has to be one of the biggest reasons why I’ve fallen in love with Parse. The documentation is first-class. Plenty of code samples, plenty of sample projects, clear and concise explanations. It doesn’t get any better than this.

    Data Browser
    If you want to take a look at what data you have online, Parse provides a Data Browser. This works somewhat like a spreadsheet. You can view all your data, update and edit as you need, and it all just works. Your data is very much open and visible to you, which makes debugging much simpler. I think it could also be great as a lightweight CMS.

    So why shouldn’t you use Parse? There’s a few reasons I can think of:

    • You don’t own the data. If Parse disappears one day, it’s going to cause problems.
    • It doesn’t replace a full CMS, so might not always be suitable
    • Parse was recently acquired by Facebook, so I guess it remains to be seen exactly what the future holds

    For me, the positives far outweigh the negatives. If you’ve never tried Parse, it’s well worth the effort to spend an hour taking a look. My only regret is that I didn’t look into it sooner.

  • Photo Academy for iPad – Now Available

    I’m very pleased to announce that after more than a year of development, the iPad edition of Photo Academy is now available.

    For those who are new to Photo Academy, the aim of the app is to help anyone who owns a camera to take better photos.

    Photo Academy for iPad contains thousands of detailed tips on how to take the best photo in almost every situation, including the exact camera settings to use. Beginners can get up to speed quickly by following a broad range of tutorials, which cover all the different aspects of photography. The app also allows you to show off your skills in the Shoot Diary, by tracking photo shoots, sharing them with friends, and seeing where in the world you’ve taken your best photos.

    For more information, please take a look at the Photo Academy for iPad website, or simply search for Photo Academy on the App Store. Alternatively, if you have any feedback or suggestions, I’d love to hear them!

    Photo Academy for iPad screenshot

    Photo Academy for iPad screenshot

    Photo Academy for iPad screenshot

    Photo Academy for iPad screenshot

    Photo Academy for iPad screenshot

  • Scheduling Your Work Day

    Ever since becoming someone who works from home, one of the things I’ve struggled with is keeping my focus on what I’m doing, and not being distracted by incoming work. I often find myself checking my email, receiving an email from a client who needs something fixed, checked, or investigated, and immediately dropping what I was currently working on to take care of this new demand. There’s certainly something to be said for clearing the decks and getting things out of the way as quick as possible, but it can also be very disruptive, and worse, inefficient.

    I recently came across a podcast aimed at people who work from home, aptly named Home Work. I’ve really been enjoying going back over all the old episodes, and there’s some great discussion in there on all aspects of working from home. If you’re a home worker, I really recommend giving it a try, starting at the first episode.

    One of the best tips I’ve picked up from Home Work so far is to consciously schedule your work day. The idea is to not only plan out what things you are going to work on that day, but also to put times against them. I’ve been giving this a try for the past few days, and by way of example, this is what my schedule looks like for today:

    • 9am – 10am: write blog post
    • 10am – 12.30pm: work on promotional material for an app I’m launching soon
    • 12.30pm – 1pm: lunch
    • 1pm – 3pm: work on bug fixes for a client app
    • 3pm – 5pm: continue developing my new app idea

    Once 5pm rolls around, I’ll take a look over all my current projects, decide what I’m going to work on tomorrow, and write up a schedule for myself for the next day. This only takes a few minutes, but so far it’s working out wonderfully. I don’t waste time in the morning trying to figure out my plans for that day, and I feel much more relaxed in the evening after finishing work, knowing that everything is on track, and anything that needs to be progressed has been scheduled in. I think the biggest benefit is that one particular project cannot take priority over another. So if I haven’t finished writing my blog post by 10am, I need to shelve it for the next day – 10am is the time to move on to the next project. This way everything moves along, rather than getting left behind.

    At some point I think I’ll start scheduling in half an hour or so each day to take care of “stuff”, such as unexpected phone calls, emails, and so on, but so far I haven’t needed it.

    And with that, it’s 10am, and time to move on to my next project. If this idea appeals to you, give it a try for a week – it’s made a big difference in my happiness and productivity.

next page>>