Photo under CC by Tsahi Levent-Levi
Halfway through my HCI degree I “saw the light” and moved from a flip phone to an Apple iPhone in 2010 despite being notoriously cheap. The following year I wrote my first iOS app for the device. Since then I’ve worked at Apple in the iOS division for two and a half years, watched every Apple keynote, been developing in Swift pre-1.0 and worked on Coursera’s iOS app while releasing another iOS app on the side…
So why have I been working on Android in Java for the last nine months?
The culture of outdoor recreation has been evolving, but the software tools that exist for it have remained stagnate. I’ve seen about a dozen experience-sharing or trail-finding apps rise and fall while the majority my own research still relies on distributed blogs, word of mouth and in person training. That is why I created Pack List, the iOS App to puts years of knowledge and hundreds of miles of backcountry experience in your hand.
Photo under CC by Pascal
Photo under CC by Jonathan Rolande
I’m a firm believer that native UI is superior to the web view experience on mobile. However, if you want rich-text user generated content support across both web and native platforms a markup language rendered natively is definitely the way to go. Trying to support the full-HTML standard natively sounds like a nightmare, but if you allow a restricted subset of the tags the problem becomes more manageable. In this article I’m going to walk through what solutions to HTML rendering exist on iOS and how I’ve implemented it under the intensive re-use / responsive scenario of rendering it in a UITableViewCell.
Image by Yung-Luen Lan
Previously I’ve introduced using UI Testing and discussed the differences between UI Testing in Xcode and the prior UI Automation Instrument. However, there is a lot more to learn about UI style testing. In this article I’ll speak about how to think about the end-end life-cycle of tests, some limitations of the Xcode solution and some undiscussed functionality.
Image by Yung-Luen Lan
Image by Yung-Luen Lan
I’ve been digging into eventing data for some time now on the Coursera App using Amplitude to gauge usage, follow user flows and investigate potential production issues. With that experience as a baseline, I’m pretty happy with Apple’s App Analytics. Combining the two systems (internal eventing + Apple’s analytics) I’ve finally been able to create a complete funnel from referrals and app views to app launch and feature usage. However, there are a few peculiar things about the system which tries so hard to be beautiful, but sometimes ends up convoluted.
The other day I needed to compare several values to determine which one was the maximum. Great, there is a max function built into the swift language!
One catch, that max function only takes unwrapped values and I needed to compare optionals. Simply unwrapping these optionals and then calling the built in max function doesn’t scale because you have the same number of permutations as the max comparison implementation itself. Therefore, I decided to write a generic max function that takes optionals:
I’m a huge fan of Apple and iOS. However, lately I’ve become increasingly frustrated with the default apps in iOS 8. This frustration is mainly due to the atrocious syncing between OS X and iOS. I’m definitely not the only one who has noticed the drop in quality. So, if you are feeling the pain as well, here are some great replacements for three core iOS Apps: Notes, Weather and Reminders.