What technology to use when developing multi-platform apps? It's complicated
Over the last 12 months or so I’ve been lucky (probably!) to use a whole bunch of different technologies to build mobile apps.
I’m often asked about what’s the best strategy for efficiently building cross-platform apps, so I thought it might be interesting to look at the pros and cons of each approach to clarify my thoughts a bit.
TL,DR; It’s complicated, and depends on your business needs.
I don’t think it’s too controversial to state that apps written using native SDKs generally offer better user experiences than those written using cross-platform technologies.
Any solution that reuses the same code on both platforms by definition can only use common elements, and therefore can’t fully utilise all native elements on an individual platform.
In particular, any solutions use a browser control and use web technologies just don’t feel as slick as one using native SDK elements.
For most businesses, when they want a mobile app they want both an iOS and Android app.
It goes without saying they want to reduce the cost of doing this, but the UI quality they are happy with is a key factor in deciding what is the appropriate solution.
Cordova/Ionic
I inherited a project using Ionic, a Javascipt/Cordova/Angular framework that - as their website states:
… emulates native app UI guidelines and uses native SDKs, bringing the UI standards and device features of native apps together with the full power and flexibility of the open web
Once I’d got back into slight craziness of Angular, it was quite a nice way to develop. In particular the app worked pretty much identically on both iOS and Android without any extra effort.
The app is a pretty simple database-driven solution that presents information and checklists for workers when they are on a remote site. In this case functionality is much more important than a superslick UI.
Usuability was definitely more “functional” than “crafted” (although well designed), but TBH despite a lot of effort spent polishing the code, you can tell it’s a web app underneath.
Animations and transitions don’t feel native, and other UI elements aren’t quite right too - not surprising as they’re being emulated in a browser control.
For this particular app, using Cordova and Ionic was actually a decent solution. Development costs were definitely reduced compared to building two native apps, and the trade off with reduced UI quality was probably the correct one.
Xamarin
Despite having many years experience using C#/.Net I’d never considered using Xamarin before, mainly because it was quite expensive at first before Microsoft bought it a few years ago.
I inherited an app using Xamarin that needed completing, and I was pleasantly surprised how productive it was. All of the business and data logic could be shared across platforms, which was great saving of both development and testing time.
The app downloads lots of information from a web-based CMS to display to the user, as well as allowing them to build up a local photo gallery.
The downloaded info is stored in a local Realm database, which has a nice cross-platform Xamarin implementation.
Each platform has its own native UI code (which obviously means it was written twice). However this isn’t quite as inefficient as it sounds as much of the code is simply binding to UI elements to data objects and watching observable events in the shared data library.
The main non-reusable work is designing the native layouts for each platform. This does mean you can design the best UI for each platform, and in consumer-focussed apps this may be an acceptable trade-off.
For apps where the user experience is important, and there is a lot of business/data logic that can be shared, I’d definitely recommend Xamarin as a good solution.
I should also mention there is a “Xamarin Forms” option not used here, a cross platform UI solution that uses native elements - obviously only UI elements common across both platfors. In some cases this may be an even better solution, especially for simple UIs.
Separate native apps
For a few of my clients I’ve built two separate versions of the same app for iOS and Android, using the native SDK for each.
Clearly this means none of the code is reused, but I don’t think it’s necessarily as inefficient as it sounds.
In both cases I built most/all of the iOS app first, which meant the UI/navigation/business logic could be iterated on until everyone was happy with it. Then once all of the problems had been solved, it was “simply” a case of reimplementing on Android - a task that was really easy (if a little boring) as it was very well defined what needed to be done.
As a small team of one, this is actually a pretty efficient way of working, and probably wasn’t much slower than the Xamarin solution given above. This is especially true for apps where most of the work is in crafting nice UIs rather than writing complicated business/data layer code.
Other advantages of building separate fully native apps, including having the quickest way of implementing new technologies, plus the code written in a way that is easier to find developers to maintain and extend.
Other options
Clearly there are other cross-platform solutions out there - in particular React Native looks very interesting - but as I haven’t really used them I won’t comment on them here.
Summary
As an experienced C# developer, for projects where I get to choose the tech stack I’ll definitely consider using Xamarin again. Having native UIs and reusable business/data code is probably a good compromise in may circumstances. If you have existing .Net development skills, I’d definitely recommend looking into going down this route.
For larger teams, or on consumer-focused projects where UI quality is important, building native apps per platform can result in the highest quality experience, even if not the cheapest solution. Finding developers with native skills on each platform is probably easier too.
Using Cordova/web-based technologies can be the cheapest way of building cross-platforms mobile apps - especially if you already have those skills in house - but there is definitely a drop off in the UI quality compared to native solutions.
My quest to get my Yeltzland (Halesowen Town FC) app on every platform continues apace, and I’ve just released a version for Apple TV.
It was my first time developing for tvOS, so it was fun project despite being of interest to a very limited audience.
Design challenges
tvOS and iOS share a lot the same frameworks under the covers, so it was quite easy to reuse existing code to fetch the data.
However designing a nice UI for the TV was more of a problem (for me!), and it took quite a few iterations to get to an interface I’m happy with.
Some key learnings were:
Horizontal scrolling of collections/tables makes much more sense on the TV than vertical
It’s really important to clearly highlight the currently selected cell, to aid navigation (which often isn’t easy with the over-sensitive Apple TV remote control)
Technical Notes
It’s really easy to develop the app in Xcode using exactly the same techniques as for iOS apps, so it was really easy to get up and running.
What is really good is wireless debugging directly on your Apple TV. I can’t imagine how painful on-device testing would have been if I had to connect my laptop via a wire.
Summary
I’m really pleased with the results, and as you can see from the screenshot above it actually looks pretty decent!
Installing the app
You can check out the app using the App Store link below - although to be honest I don’t really know how you link directly to an Apple TV app.
I think if you have the iOS app installed it might show up directly on your Apple TV. Alternatively search for “Yeltzland” in the App Store directly on the Apple TV.
The Yeltzland code is all open source, and can be viewed on GitHub.
My new Alexa skill to help you take a positive view on life
Amazon Echos are slowly taking over our house. We’re up to 3 now, and mainly use them for tasks like:
Controlling the TV/Amp/Sky/AppleTV/BluRay/FireTV via our Logitech Harmony
Adding items to our shopping list in Todoist
Listening to music (Spotify) and the radio (BBC streams)
Setting timers while cooking (so much more reliable than Siri)
Voice assistants are still a long way from being great general purpose helpers, but for a subset of well-defined tasks like these they are fantastic!
Developing Skills for Alexa
I’ve already built a Halesowen Town Alexa Skill (of course!), which was a great learning experience. I’m hosting the NodeJS code for the skill on AWS Lambda, and doing it this way makes it pretty easy to get something up and running.
I was looking to build another skill - to be honest mainly to get a free Alexa hoodie from Amazon for any new skills published in December :)
An aside: Social Media Negativity
Going on Social Media these days can be a pretty depressing experience.
I’ve just about given up on Facebook, and although I get lots of good stuff from Twitter, it can be a pretty negative place - especially when the current divisive political climate on both sides of the Atlantic is being discussed.
Just Say Yes!
I also find during the cold Northern winters it’s easy to get a bit down.
A few years ago I embarked on my "Something New Every Day" project. This was possibly (and surprisingly) one of the hardest things I’ve ever done, but the main upside was I tried really hard to say yes to anything anyone suggested to do - any way of ticking off another new thing for the day!
I wanted some way to recreate this positive experience, so hence I built a simple new Alexa Skill called "Miss Positive"
All the skill (she?) does is answer any question you ask with a randomly selected positive answer.
Technically this was very easy to do of course, especially using the pre-written template for a fact-based quiz, but actually I’m really happy with the result. If I’m wavering on whether I should do something, I ask Miss Positive and she puts me right!
If you want to give Miss Positive a try, follow the instructions at this page
If I'm starting a new iOS project, which language should I choose?
I’ve been crazy busy over the last few months - a good problem to have, but it means I’ve had no time to blog on here 🙁
I’ve been switching between loads of different technologies to build mobile apps during that time. I thought it might be interesting to share my experiences switching between Objective-C and Swift, and the pros and cons of each.
Objective-C
It’d been a while since I’d worked in Objective-C, but I took on a project for one of my clients to enhance and modernise a couple of their apps which hadn’t been touched in a while.
To be honest the original code was pretty awful - they’d been let down by some contractors in the past and it took me a while to get my head around how the app worked.
Objective-C is notorious ugly to look at, with all those square brackets in the method calling, but once you get used to it I find it pretty productive to use.
I think knowledge of iOS APIs is by far the most important thing when developing on iOS, not the particulars how to type the code to call the API methods required.
The biggest plus point for Objective-C is the speed and stability of Xcode and the compiler. After mostly doing Swift development in the last year or so, it was really nice to get fewer mysterious compiler problems.
I strongly suspect Apple still do most of their internal development using Objective-C, and until they move over wholesale to Swift there will be less internal pressure to improve Xcode to handle Swift more reliably.
The main downside was that more and more of the code examples out there on the web - especially for the more modern APIs - are now in Swift. Less opportunities for “Stack Overflow copy-and-paste” development 😊
Swift
Most of my own apps are written in Swift now, and I’ve been doing the usual summer updates to keep them up to date for iOS 11 - and this year also for the challenge of iPhone X and the notch.
I must admit I do like Swift, and in particular the way it forces you to think hard about nullability of objects. This enforced type safety can be a bit painful at times (all the “!” and “?”s) but I trulythink you end up with more reliable code in the end.
However, as I mentioned above, Xcode and the compiler are MUCH less reliable when using Swift. Quite often I’ve seen it do a poor job of recompiling changes, so you’re never 100% clear if you are seeing the latest code in the emulator. A restart of Xcode usually fixes it, but that’s a real productivity hit.
The Swift compiler is also feels noticeably slower than the Objective-C compiler. All those small delays soon add up.
Also Swift is still a bit of a moving target, and once again we have Swift 4 and changes to the language. These seem to be getting fewer over releases, but I really hope the language gets to some sort of stability soon.
So which language will I choose for new projects?
I think I’ll still choose Swift for any new projects when I have a choice. Apple have strongly signalled this is their preferred language going forward, and as a language I do prefer it to Objective-C.
However after a few months back using Objective-C, I’ve really enjoyed the stability and speed of the tools. Let’s hope the Swift tools can improve to a similar state soon.
Daily Optimiser is the first iOS app I ever wrote, and it’s been looking a little tired and out of date recently.
So last week I spent a few hours improving and modernising the UI, and I’m quite pleased with the results (there are some screenshots are at the end of the article).
I’ve tried to be more consistent and subtle with the use of font size and color to give the information a clear hierarchy.
What was more interesting was how much I’ve learnt in the last few years of doing iOS development. Looking back at the original code, it’s clear I was I had no clear idea how best to structure the code. I was also very inexperienced in autolayout, and used tables EVERYWHERE to build screens!
I’ve also made the app iOS11 only to take advantage of large titles in the UI, but from my analytics I can see hardly anyone is using the app any more, so it’s not going to aggravate a non-existent user base.
I must admit I don’t actually use Daily Optimiser, as I prefer Todoist over Reminders as my task organiser. However if you are looking for a simple app based around Calendars and Reminders to help you organise your day, why not give it a go?