Chris' Blog.

My occasional thoughts on iOS development, developers careers, trying to make an income from the App Store, and updates on life in general.

Blogging Platforms

So I've been running a series of 'brownbag sessions' at work around the topic of starting a blog. I thought this would be appropriate in a building full of journalists! So far, it's been fantastic, almost a dozen very enthusiastic attendees.

One of the key issues that's come up has been which blogging platform to go with. I've narrowed down the options to Wordpress or Jekyll. But I found it very difficult to explain the difference between a static site generator (Jekyll) and a full-blown CMS (Wordpress). So I recorded screencasts demonstrating the workflows of each platform, to give the attendees a better impression of the differences. "Show, don't tell", and all that.

Here are the videos, thought they might be helpful to the wider world!


Mobile Apps: 2014 in Review

Hi all, I try to write smaller useful posts throughout the year, and one larger post at the end of the year, giving people some insight into how the world of native mobile development is trending from my perspective. I'm not the worlds foremost expert, however I do keep my ear close to the ground and work as a native developer full-time, so perhaps you can glean something from my observations about how 2014 went, and where I see the industry heading.

Apple

It Just Works?

Since I've been working as a native iOS developer for all of 2014, it's only natural to discuss them first. So here are the trends as I saw them:

Basically, 2014 was the year that I began to see a lot of iOS devlopers/fans begin to turn away from Apple. It appears that 2013 was the year of 'peak developer happiness', if i were to give it a name. It is a death by a thousand cuts, and as such it's rather hard to pin down exactly why everyone is so down on Apple lately. If you held a gun to my head and forced me to give a pithy summary, I'd say that it's because people can't say of Apple products that 'It Just Works' anymore.

There's not much point me going over well-trodden ground here, if you want to read more you can see here:

App approval

There's been a lot of commotion in the iOS developer community this year about Apple's App Store approval process, eg the process you go through where Apple vets your app before allowing it to be release on their app store.

Apple has long-held the position on their app review process that if there's a dispute, 'If you run to the press and trash us, it never helps'. So until 2014, you rarely heard a peep from developers complaining publicly (you often heard it privately!) about the app review process, because nobody wanted to talk publicy and thus burn their bridges with Apple. But things changed this year:

In 2014's WWDC, Apple did a demo on how to make apps that took advantage of the new features for the notification center. So a bunch of developers made apps with features similar to the demo, as you'd expect. And one such app did such a great job that Apple featured their app on the app store. However, shortly afterwards, Apple did a 180' turn, removed their app from the store, and started rejecting any apps that allowed interaction with the notification center.

This incensed a bunch of iOS developers, who broke ranks and started talking publicly about their rejections. It turned into a PR disaster for Apple (at least, in the iOS developer bubble), and more developers jumped into the fray and started blogging about their frustrating experiences with app review. Eventually Apple relented and re-approved those apps, however the genie was out of the bottle: people are no longer scared to 'run to the press and trash Apple'. For example:

So developers are now feeling emboldened to talk publicly about app store rejections, it is no longer a taboo topic. This is probably a good thing, as it helps people weigh up the risks when developing borderline apps by reading other's stories.

I believe Apple really needs a developer community spokesperson to start talking to the public about these things, akin to Kiyosaki in their early days. Their silence is deafening, and as they continue to lose goodwill with the iOS developer community, a bit of open, frank communication could go a long way.

Interface Builder / Autolayout

Here's something I harp on about from time to time: Interface builder and Auto Layout. I'll try to keep this short though, as reasonable people hold well-argued opinions both ways here.

We're now up to our third major version of iOS (6, 7, and 8) to use Autolayout, and i'm still not seeing a majority of developers using it. I'm still seeing most people struggle to do basic things in it, such as different layouts for different orientations without kludgey workarounds. I only know a few developers who love it (good for them, though!). I do not consider it a roaring success.

I've heard anecdotally people talking of 50% of developers avoiding IB and AL; I'm seeing Facebook come up with their own replacements for UIKit piece-by-piece (eg AsyncDisplayKit, Pop, etc); Google don't appear to use IB/AL; even Apple only use it in one or two of their apps. The fact that Apple don't use it is particularly damning, given that they had to re-design the UI for most of their apps for iOS 7.

Smart people have good arguments both ways on this one. I'll leave it up to you to decide if you want to do what Apple recommends at WWDC, or whether you want to follow what they/google/facebook actually do in their apps.

Hardware

The iPhone 6 and iPad air are fantastic! Apple's hardware has never been stronger. The retina iMac is incredible to look at too. This is certainly Apple's strong spot: hardware.

Personally, my iPhone 6 bent, however. Apple were quite kind and replaced it. Another friend bent his too, however he simply bent it right back! So perhaps it's accurate to say that apple's hardware is as gorgeous as ever, however still a little quirky. Eg the iphone 4's antenna problem, the iphone 5's undersized battery, and too-easily-bendable iphone 6's.

iPads appear to have started declining in 2014, accoring to the market analysts. And the iPhone 6+ will only accelerate this trend. As our phones get larger, people find less need to get a tablet. In a recent project, I was instructed to simply scale up the iPhone app to the ipad with just enough effort spent to fix the glaring issues. I predict that we'll see less iPad-specific app projects in 2015, as the market moves toward big phones. And as indie developers cannot barely earn a living from iPhone apps, let alone the smaller iPad market, it's a bit of a vicious feedback cycle: Less ipad apps, less reason to buy one. When was the last time you remember a high-profile ipad exclusive app such as Paper or Cook or Storehouse? I think iPads will become more of a niche. If i were you, I wouldn't focus on them in 2015.

Swift

Swift was certainly a suprise when they announced it at WWDC not so long ago! However, it is still looking too immature for medium-to-large projects. Issues such as taking minutes to compile medium-sized projects, Xcode relentlessly crashing, runtime bugs, and the many other frustrations you can read about in the Apple dev forums all rule it out for day-to-day use, and as such all i've seen is people toe-dipping in the new language by using it for small utility classes or maybe one or two view controllers.

I'm hoping that 2015's WWDC Swift release will be rock-solid and we'll all be able to re-approach it and begin to take it seriously. However, i recommend treating it as a beta, and begin learning it, however you'd be advised not to transition your projects over just yet.

Android

Since this post is dragging on, i'll approach Android in bullet form:

  • Google has begun to take design seriously. Seriously, have a look at the transition animations on the Material design spec here, they're gorgeous.
  • Android 5 / Lollipop is very pretty and usable. I'd say it's the first version of Android that i'd be happy to recommend to my parents. I think it has crossed the line that i'm now happy to say 'it's now nice to use'.
  • I'm seeing a lot of talented iOS developers who no longer turn their nose up at Android as it continues improving, especially now that iOS's screen size fragmentation is just as bad as Androids.
  • Their hardware is still really dull. Some of the smaller chinese companies are bringing out elegant android phones, but none of the mainstream ones have tried yet. I predict that in 2015 we'll start seeing beautiful android hardware.
  • I now personally know more indie developers who are able to make money from Android than from iOS. Apple has done nothing to help this in 2014.
  • I think Android is reaching a tipping point where as it improves, design-minded developers will start making apps for it, at which point it'll really become something i'd consider recommending to family as a daily phone.
  • I recently bought an almost-new Moto G for $170, it has Lollipop and it looks great. It really looks like the cheap got good before the good got cheap.
  • Android studio, while it doesn't crash, is awful to use compared to Xcode.
  • In 2015, i'm going to try learn how to make Android apps, and begin to think of myself as a 'native mobile developer' rather than a 'native iOS developer'. I hope to parlay this skill into a managerial position overseeing a mobile team that includes both iOS and Android teams.

Other

  • Windows mobile is going nowhere fast, at least in the Sydney market, unfortunately.
  • Hybrid / web mobile apps have made no ground. Famo.us made a splash, but anecdotally i hear it's just too slow on android to give you the 'write once run anywhere' it's supposed to deliver. I haven't seen many people use it. I rarely hear people arguing about whether to go native or hybrid or web app at project inception these days, that argument appears to be done with.
  • Contracting opportunities, in sydney, are still in healthy supply. I think we've got at the very least a few more years of this. However, as I see people move mobile apps out of project-land and into busines-as-usual-land, I predict we'll see more of the opportunities into permanent employees, and less farmed out to contractors and agencies. This will be a gradual process.

My plans for 2015

My plan for 2015 is to take a leaf out of Scott Hurff's book, and create and sell a video course on the topic of advanced iOS UI development in Swift, covering the following topics:

  • Different layouts for different orientations
  • Developing without IB or AL
  • Custom transitions
  • View controller containment

If you're interested, please subscribe to my mailing list here on my blog, and i'll keep you posted!

I'm also available for hire as of the 26th January when my current contract expires. If you're looking for a good iOS developer in Sydney, get in touch!

Thanks a lot for reading!


Hi all, here's a talk I recently gave at the local Cocoaheads meetup (Cocoaheads is a meetup for iOS/Mac developers). My topic was 'Secret Keys: Hiding secrets in your iOS app'. It was based on a blog post I wrote earlier here: Storing Secret Keys.

Hope it's helpful to someone!


You can see older posts in the right panel, under 'archive'.

Archive

Blogging Platforms 13 Jan 2015

Mobile in 2014 - Year in Review 11 Jan 2015

Secret Keys talk 16 Nov 2014

Dimmi 11 Nov 2014

Project setup in Xcode6 22 Oct 2014

Uploading to an S3 bucket from iOS 15 Oct 2014

iOS8 App Testing Roundup 28 Sep 2014

Storing obfuscated secret keys in your iOS app 16 Sep 2014

Getting Core Location / CLLocationManager to work on iOS8 14 Sep 2014

Accessing the response body in failure blocks with AFNetworking 2 10 Sep 2014

How to allow your UITextFields to scroll out of the way of the keyboard 8 Sep 2014

How to subclass UIButton in iOS7 and make a UIButtonTypeSystem 4 Sep 2014

New season 1 Aug 2014

House finished 17 Jun 2014

WebP decoding on iOS 9 Feb 2014

Moving on again 22 Jan 2014

Lossy images for retina iPads - JPEG vs WebP 30 Nov 2013

Career options I wish I knew about when I was younger 20 Oct 2013

Positivity and your friends 7 Oct 2013

Tactility 26 Jul 2013

WWDC-induced narcolepsy 15 Jul 2013

Back on rails 31 May 2013

Full circle 6 May 2013

Programmatic UI on iOS 3 May 2013

Screencasts and positivity 8 Apr 2013

Year of positivity 14 Mar 2013

iOS Dev State of the Union 6 Feb 2013

Adventures with IAPs 3 Feb 2013

No longer a Googler 23 Dec 2012

Localising iPhone apps with Microsoft Translator 8 Dec 2012

Fight back (app biz update 13) 12 Nov 2012

Sent to the backburner (app biz update 12) 25 Oct 2012

Lisi Schappi 7 Oct 2012

Today's happy plateau (app biz update 11) 26 Aug 2012

First week's sales of Today (app biz update 10) 19 Aug 2012

Today launch! And a difficult decision made... (app biz update 9) 15 Aug 2012

Approved! (app biz update 8) 5 Aug 2012

Creating a graph in Objective-C on the iPhone 3 Aug 2012

Hurry up and wait (app biz update 7) 30 Jul 2012

Today app marketing site 27 Jul 2012

Today app submitted 25 Jul 2012

UIAlertView input wrapper 24 Jul 2012

Mentoring 23 Jul 2012

This is too hard! (app biz update 6) 20 Jul 2012

Perspectives (app biz update 5) 9 Jul 2012

4th starting-my-own-biz update 1 Jul 2012

ScrumFox landing page 28 Jun 2012

Server Scope landing page 27 Jun 2012

Telstra Calls and Data Usage 26 Jun 2012

Service History + Dropbox 26 Jun 2012

Impromptu Presenter 26 Jun 2012

Fertility Tracker 26 Jun 2012

Baby Allergy Tracker 26 Jun 2012

Starting my own business, update 3 22 Jun 2012

Starting my own business, update 2 17 Jun 2012

Starting my own business - First update 10 Jun 2012

I must be crazy 6 Jun 2012

Finding your location on an iPhone 7 May 2012

A generous career 4 May 2012

Skeleton Key Cocoaheads presentation 3 May 2012

CHBgDropboxSync - Dropbox auto-sync for your iOS apps 1 May 2012

That book about that Steve Jobs guy 30 Apr 2012

Another app marketing idea 23 Apr 2012

Sweet grouped tables on the iPhone 17 Apr 2012

Skeleton Key App 11 Apr 2012

Another app marketing idea... 5 Apr 2012

Quickly check for any missing retina graphics in your project 3 Apr 2012

Skeleton Key Password Manager with Dropbox 2 Apr 2012

RC Boat motor finally mounted 2 Apr 2012

Promoting apps presentation slides 1 Apr 2012

How i just wasted a month on my latest app, and how you don't need to 26 Mar 2012

The Finishing Line 20 Mar 2012

Using Launchd to run a script every 5 mins on a Mac 20 Feb 2012

Generating AES256 keys from a password/passphrase in ObjC 20 Feb 2012

Indie iPhone app marketing, part 2 19 Feb 2012

My App Manifesto: Syncing + Dropbox + YAML = Awesome 15 Feb 2012

Indie iPhone App Marketing part 1 7 Feb 2012

Perspectives 2 Feb 2012

Accountability and Free Will 1 Feb 2012

Badassery 31 Jan 2012

Sacrifice 30 Jan 2012

Lead Yourself First 29 Jan 2012

How to ping a server in Objective-C / iPhone 26 Jan 2012

iOS Automated Builds with Xcode4 16 Jan 2012

Xcode 4 - Command line builds of iPhone apps 15 Jan 2012

Guest post by Jason McDougall 13 Jan 2012

Scouts, Games and Motivation 10 Jan 2012

2011 Re-cap 8 Jan 2012

Ruby script to increment a build number 4 Jan 2012

Turning 30? All ideas, no execution? 18 Dec 2011

CHDropboxSync - simply sync your iOS app's documents to Dropbox 14 Dec 2011

Deep-enumerating a directory on the iphone, getting file attributes as you go 10 Dec 2011

Getting a date without the time component in objective-c 6 Dec 2011

Memory management in Objective-C 4 Dec 2011

Starting small 29 Nov 2011

Dictionary Types Helper 29 Nov 2011

Observer Pattern in Objective-C 16 Nov 2011

Why you should give presentations 13 Nov 2011

How to get a programming or design job in Sydney 9 Nov 2011

Custom nav bar / toolbar backgrounds in iOS5 8 Nov 2011

Stuck 27 Oct 2011

Dead easy singletons in Obj-C 19 Oct 2011

JSON vs OCON (Objective-C Object Notation) 18 Oct 2011

In defence of Objective-C 16 Oct 2011

Update the MessagePack objective-c library to support packing 12 Oct 2011

Icons 11 Oct 2011

How to host a site on Amazon AWS S3, step-by-step 7 Oct 2011

Drawing a textured pattern over the default UINavigationBar 6 Oct 2011

Markdown Presentations 1 Oct 2011

More MegaComet testing: Ruling out keepalives 15 Sep 2011

MegaComet test #4 - This time with more kernel 14 Sep 2011

Building People 10 Sep 2011

Half way there: Getting MegaComet to 523,000 concurrent HTTP connections 5 Sep 2011

Making a progress bar in your iPhone UINavigationBar 22 Aug 2011

Hacker News Reader 20 Aug 2011

How to programmatically resize elements for landscape vs portrait in your iphone interface 16 Aug 2011

MegaComet testing part 2 3 Aug 2011

Australian Baby Colours 28 Jul 2011

Boat prop shaft 25 Jul 2011

Megacomet with 1 million queued messages 24 Jul 2011

Installed the strut and rudder 18 Jul 2011

Painted the inside of the boat 17 Jul 2011

Fuzzy iphone graphics when using an UIImageView set to UIViewContentModeCenter 13 Jul 2011

My 3 Data and Calls Usage 11 Jul 2011

Reading a line from the console in node.js 10 Jul 2011

Trim whitespaces on all text fields in a view controller 9 Jul 2011

Final finish 9 Jul 2011

MessagePack parser for Objective-C / iPhone 30 Jun 2011

Lacquering the starboard side 25 Jun 2011

What do do with EXC_ARM_DA_ALIGN on an iPhone app 23 Jun 2011

Lacquering the hull 23 Jun 2011

Staining the boat 22 Jun 2011

NSMutableSet with weak references in objective-c 20 Jun 2011

Iphone gesture recogniser that works for baby games 20 Jun 2011

Image manipulation pixel by pixel in objective C for the iphone 19 Jun 2011

Baby Allergy Tracker 12 Jun 2011

Power sanding the deck 10 Jun 2011

Planing the edge of the deck 2 Jun 2011

Figured out the deck 2 Jun 2011

Boat bulkheads 2 Jun 2011

Simulating iOS memory warnings 31 May 2011

Putting a UIButton in a UIToolbar 29 May 2011

How to allow closing a UIActionSheet by tapping outside it 29 May 2011

Finding the currently visible view in a UITabBarController 24 May 2011

Random Chef 17 May 2011

Centered UIButton in a navigation bar on the iphone 16 May 2011

Little Orchard 13 May 2011

Boat update 13 May 2011

How to get the current time in all time zones for the iphone / obj-c 12 May 2011

Design portfolio 10 May 2011

Tricks with grand central dispatch, such as objective-c's equivalent to setTimeout 9 May 2011

How to make an iphone view controller detect left or right swipes 5 May 2011

Centered section headers on a UITableView 5 May 2011

Christmas in may 4 May 2011

Finished trimming the boat (its floatable now!) and got some parts 29 Apr 2011

How to make a multiline label with dynamic text on the iphone and get the correct height 27 Apr 2011

Forcing an image size on the image in a table view cell on an iphone 20 Apr 2011

Git on the Mac 19 Apr 2011

Build a url query string in obj-c from a dictionary of params like jquery does 12 Apr 2011

Rendering a radial gradient on the iphone / objective-c 11 Apr 2011

Skinning the port side of the boat 8 Apr 2011

Skinning the side of the boat 5 Apr 2011

Sending a UDP broadcast packet in C / Objective-C 5 Apr 2011

How to talk to a unix socket / named pipe with python 4 Apr 2011

Skinning the bottom of the boat 31 Mar 2011

Service discovery using node.js and ssdp / universal plug n play 30 Mar 2011

Extremely simple python threading 29 Mar 2011

New rescue boat 26 Mar 2011

HttpContext vs HttpContextBase vs HttpContextWrapper 5 Nov 2010

Simple C# Wiki engine 30 Sep 2010

Simple way to throttle parts of your Asp.Net web app 29 Sep 2010

How to implement DES and Triple DES from scratch 4 Aug 2010

How to use sessions with Struts 2 30 Jul 2010

How to use Cookies in Struts 2 with ServletRequest and ServletResponse 30 Jul 2010

Using Quartz Scheduler in a Java web app (servlet) 27 Jul 2010

Javascript date picker that Doesn't Suck!(tm) 27 Jul 2010

Using Oracle XE with Hibernate 20 Jul 2010

A simple implementation of AES in Ruby from scratch 29 Jun 2010

Asp.Net Forms authentication to your own database 28 May 2010

AS2805 (like ISO8583) financial message parser in C# 7 May 2010

Ruby hex dumper 4 May 2010

Using Spring to manage Hibernate sessions in Struts2 (and other web frameworks) 13 Jan 2010

Emails in C#: Delivery and Read receipts / Attachments 12 Jan 2010

Using Java libraries in a C# app with IKVM 16 Dec 2009

Learning Java tutorial 27 Nov 2009

Using generic database providers with C# 17 Nov 2009

Scheduled task executable batch babysitter 29 Oct 2009

Working with query strings in Javascript using Prototype 30 Sep 2009

Still fighting with String.Format? 9 Sep 2009

How I'd build the next Google 24 Aug 2009

Getting IIS and Tomcat to play nicely with isapi_redirect 24 Aug 2009

Using the new ODP.Net to access Oracle from C# with simple deployment 11 Aug 2009

C# Cryptography - Encrypting a bunch of bytes 14 Jul 2009

Sorting enormous files using a C# external merge sort 10 Jul 2009

Reconciling/comparing huge data sets with C# 9 Jul 2009

Some keyboard-friendly DHTML tricks 10 Jun 2009

How to figure out what/who is connected to your SQL server 18 Mar 2009

Adding a column to a massive Sql server table 16 Mar 2009

Multithreading using Delegates in C# 10 Mar 2009

Using C# locks and threads to rip through a to-do list 6 Feb 2009

Using threads and lock in C# 3 Feb 2009

Setting a form name and onsubmit using form_for in rails 2 14 Jan 2009

Compressing using the 7Zip LZMA algorithm in C# beats GZipStream 14 Jan 2009

Bare minimum HTML that validates 22 Dec 2008

MS Sql Server 2005 locking 17 Dec 2008

Simple Comet demo for Ruby on Rails 19 Nov 2008

Geocoding part 2 - Plotting postcodes onto a map of Australia with C# 24 Oct 2008

Using evolutionary algorithms to make a walkthrough for the light-bot game with C# 20 Oct 2008

How to tell when memory leaks are about to kill your Asp.Net application 16 Oct 2008

C# version of isxdigit - is a character a hex digit? 15 Sep 2008

Geocoding part 1 - Getting the longitude and latitude of all australian postcodes from google maps 26 Aug 2008

Converting HSV to RGB colour using C# 14 Aug 2008

Opening a TCP connection in C# with a custom timeout 11 Aug 2008

Oracle Explorer - a very simple C# open source Toad alternative 31 Jul 2008

Linking DigitalMars' D with a C library (Mongrel's HTTP parser) 23 Jun 2008

Connecting to Oracle from C# / Winforms / Asp.net without tnsnames.ora 16 Jun 2008

A simple server: DigitalMars' D + Libev 6 Jun 2008

Travelling from Rails 1 to Rails 2 9 Apr 2008

Rocketsale 9 Apr 2008

Online Rostering System 9 Apr 2008

DanceInforma 9 Apr 2008

Client Analyser 9 Apr 2008

How good is this??? 16 Dec 2007

Using RSS or Atom to keep an eye on your company's heartbeat 10 Nov 2007

Easy Integrated Active Directory Security in ASP.Net 24 Oct 2007

First post 17 Oct 2007