• Adopting Adaptive

    One of my biggest takeaways of WWDC 2014 was Adaptive Apps. If you haven’t yet, you can check the video for session 216, Building Adaptive Apps with UIKit.

    In the past days, there have been a few articles about it (I got to them via Brent Simmons):

    Over the last three years (as I think is usual with Apple), we’ve seen a succession of technologies that we were “suggested to adopt”:

    • iOS 6 brought us Auto Layout, as a declarative way of creating constraints between our views.
    • iOS 7 introduced Dynamic Text, allowing users to easily tune the sizes of all the fonts in their devices.
    • iOS 8 is adding Adaptive Apps in UIKit and Presentation Controllers.

    Adaptive apps are sold to us for two main reasons: supporting both iPhone and iPad with the same codebase with less specific cases, and supporting the new rotation. New device form factors are -of course- never mentioned in any WWDC session, nor is the ability to resize apps on an iPad, as apparently will be the case.

    If the next iPhone indeed ships with a bigger screen, the main reason would be to have more content on screen at the same time, not to have something akin to an @3x. So, if we assume the screen will be bigger (to fit more content), we only have one question: will the screen have the same DPI as the existing iPhone?

    Let’s explore the ramifications of each option.

    Same DPI as iPhone 5s

    Ever since the original iPhone, objects on screen have had the same physical size. The move to retina only increased the pixel count, but the actual size remained the same.

    Keeping the same DPI will be an impact similar to when the iPhone 5 shipped: our apps will need to adapt and show more content. If the phone is wide enough, there’s a chance the Horizontal Size Class in Portrait of this new device changes to Regular as opposed to Compact, and our apps will need to adapt to it (UISplitViewControllers will became more common, for one). With the same logic, the Vertical Size Class in Landscape might change to Regular.

    All in all, this change will probably be the easier to deal with, as typography and images will look the same.1

    Higher DPI than the iPhone 5s

    As I tweeted to Brent Simmons, here’s where I think it gets interesting.

    If Apple wants to have the text look the same size, they might tune the Dynamic Text default sizes on the new device to compensate for the higher DPI2.

    On session 226, What’s new in Table and Collection Views you can see how they use the multiplier in Auto Layout constraints so that UITableViewCells change in height as the Dynamic Text size changes, and look better when bigger fonts are in use. I can see this approach being the recommended way forward, basing the layout around the text sizes, so Apple can tweak them based on the hardware they ship.

    Other thoughts

    What about userInterfaceIdiom?

    My notes from session 216 were that UIUserInterfaceIdiom was deprecated. What they actually said is:

    In the past you’ve used UIInterfaceOrientation and UIUserInterfaceIdiom to differentiate between portrait and landscape and iPhone and iPad, but in iOS 8, we’re recommending against using these two concepts, and instead we’re advocating this > new concept that we call size classes.

    (source: asciwwdc.com)

    Yet, UITraitCollection contains a userInterfaceIdiom trait. Why was this kept, if Apple is suggesting against basing the UI based on the device? My understanding is that it’s there because we’ll still need it to determine the intent of the user. Our apps need to know if the user has launched our app on his iPhone, probably on the move or doing something else, or on an iPad, where we can assume he’s more comfortable and about to have a longer use session.3

    Business implications

    I don’t think there’s a huge business implication for this right away. If you want to ship to separate apps for iPhone and iPad, I don’t expect Apple to prevent you from doing it.

    However, since you’ll have to support iPhones with multiple screen sizes, it’s very possible that going from a multi-sized iPhone app to a Universal app will be a simpler transition. This, I’m confident, might have the nice outcome of combating what Marco Arment called App Rot and provide more quality universal apps for the users.

    Implications for font heavy apps

    There are some apps that rely a lot on custom fonts, such as Vesper. Since Dynamic Text does not allow you to use custom fonts, I wonder how those apps will work around a different Dynamic Text default size. There are tons of valid workarounds, like fetching the system font size and base your custom font size on it, but an Apple blessed solution would do a lot to help in this direction.4

    1. Any given text, at the same Dynamic Text setting will look the same on the iPhone 5s and on the new iPhone. 

    2. I’m assuming the new device still runs with a display scale of 2.0, as the retina screens we currently have. 

    3. I first thought this had to do with device capabilities, such as to tell if the app needs to highlight phone numbers or not. I think that’s a blurrier line, as we don’t know what capabilities future devices will have, and well behaved apps need to check for specific capabilities instead, not make assumptions based on the userInterfaceIdiom

    4. While I’m not sure what the best solution is, I’ll be happy to have something similar to a very simple CSS file, where you can specify for each Text Style the font name, size and weight you want it to take. 

  • iOS 8 - More than I expected

    Before leaving for WWDC 20141, I wrote a small post with my iOS 8 Wish List. I’m glad to say that the announced features of iOS 8 cover way more than I expected. I’ll break it up in the same major features I expected, and see how the announced features fit.

    Multi User Support on the iPad

    On my wish list, I wrote:

    Ever since the first launch of the iPad, multi user support was a rumored feature. I always thought Apple’s rationale behind not providing multi user support was two-fold: it would add complexity to the platform, and it might take away some sales (why get a second iPad if I can just create a user for the kids?).

    While we did not get multi-user support, we got Family Sharing. Instead of focusing on sharing the physical products Apple is focusing on sharing the digital assets. Its a different problem to take on, but at least it acknoledges the same underlying problem: some households might have a multitude of iOS devices and users.

    With Family Sharing, Apple is making it simpler to do what we already do: share our purchases with other members of our family. We do it by sharing a main Apple ID to make purchases. Now it will be easier to do, and I’m glad.

    As for Multi-User Support on the iPad, it is still missing, but I guess if we are ever going to get it, having Family Sharing in place before might make things simpler later.

    Some sort of File Management

    I was pessimistic on this one:

    Sadly here, I don’t see Apple doing any sort of File Manager on iOS. Even more, I think they are moving in the opposite direction with iCloud storage on Mac apps, where each file type is tied to the app that created it. But given that this is my wish list, I figure it’s fine to dream.

    Not only Apple is backtracking with its Documents in the Cloud approach (the new iCloud is closer to Dropbox than to the old iCloud), but they are allowing third party apps to be document providers by means of extensions.

    This is huge. It has the potential to create lots of new use cases, and even some that we can’t imagine but will only realise were possible when we see the app in the store.

    From all the Extension types iOS will now allow, this can prove to be the biggest game-changer for the OS.

    System Contributions from apps

    I missed the obvious name here, but Extensions are amazing and provide more than what I imagined. I always imagined Share Extensions and Notification Center widgets to be something obvious, but I never expected Photo Editing (with in place modifications), third party keyboards or the new features for document management.

    This is great, and really opens the door for amazing new apps and use cases.

    OS X / iOS integration

    When I imagined this, I don’t think I was aiming as high as the iOS 8 team is with Continuity. I expected a few simple things:

    • Trigger certain notifications only when your phone is away from the Mac.
    • Establish a secure link between the Mac and iOS and use Touch ID to unlock your Mac.
    • Have an iPad act as an AirPlay display if you want to, etc.

    Instead of this, we got something bigger and better:

    • There is some great integration of devices, as I expected. This is what allows you to get SMS’ on your Mac, or have the iPhone dial a phone number.
    • Handoff will allow third party apps to allow users to continue what they were doing on another device. This even works between a mobile app and a website, by registering your URL with Apple. I can’t count the times I emailed myself a draft I was writing on the iPhone only to later complete on the Mac and send it.

    There’s way more stuff in iOS 8 than what I covered here. But given my short wish list, I can say Apple nailed almost every feature I wanted and then some. I really look forward to both be a user of some of these features, and be able to have some users benefit from these in apps we create.

    1. I’m yet to write my WWDC post. It was such an amazing experience, that I’ve found it hard to write about. I’ll try to make it up soon. 

  • What if the rumored Apple Home Automation is the next Apple TV?

    A little rumor leaked today (via 9to5mac): Apple is planning to announce a home automation platform in WWDC.

    Coupled with past rumors of an Apple TV revamp, this got me thinking: what if the two efforts actually the same hardware box? Let me elaborate.

    Most home automation alternatives require the user to have some sort of central hub. The hubs tasks are mostly non-UI, with a smartphone app controlling the system instead. So this begs the question: What popular Apple device you have plugged all the time, connected to your network, and mostly idle of processor intensive tasks?

    A few Apple TVs idle on your living room and bedroom, with good conectivity (because you ensured that in order to watch streaming content) might make a nice Home Automation hub. They even come with a remote, which could be extended to provide more features.

    The only drawback to my thought is that this could also be handled by a more utilitarian appliance, such as an Airport Extreme base station. They are less popular, but if Apple is to enter a market that can be an advantage as they would be poised to sell more of it.

  • iOS 8 Wish List

    With WWDC 2014 around the corner1, it’s time to think out lout about my iOS 8 wish list.

    While I have several small things I think could be improved, there are a few I’d like to see make the cut this year.

    Multi User Support on the iPad

    Ever since the first launch of the iPad, multi user support was a rumored feature. I always thought Apple’s rationale behind not providing multi user support was two-fold: it would add complexity to the platform, and it might take away some sales (why get a second iPad if I can just create a user for the kids ?).

    I’ve matured into thinking the only reason is complexity, as I don’t think having multiusers would hamper sales.

    The good news is that the APIs to support multiple users are all there. Any app that wants to get the location of the documents folder needs to call an API (which coincidentally on the mac, returns the Documents folder of that user). The sandboxed nature of the platform also helps here: if your app is limited to its Sandbox, it won’t care if it’s the user’s sandbox or the app’s sandbox.

    There are some challenges, however, that Apple would need to solve, which I think are hard and might take this feature away from us:

    • Backups. iCloud backups are tied to an Apple ID. If you were to support multiple users, one Apple ID would have to be set as the primary user, and the system backup tied to it.
    • Global storage per app. Applications would need to change slightly to support storing some information in the app sandbox and some in the user’s sandbox. Say an In-App purchase. All the users of a given iPad will expect it to be available. However, if the app stores a flag in the user’s defaults, other users won’t see it. This requires tweaking on all the apps to support this.
    • User switching. Luckily here, iOS apps have always supported state preservation, so switching to another user would require the system to preserve the state on all the apps it hasn’t already, and just switch. Easy, and no app changes should be required.

    Alternative: Kids folder

    Windows Phone 8 supports a feature called Kids Corner. With that feature enabled, you can set up some apps with a dedicated start screen. When you hand your phone to your kid, just swipe the home screen to the Kids Corner, and they will only able to use those apps and switch between them.

    With SpringBoard Folders, I figure Apple could easily implement a feature like this to provide something less strict than Guided Access while guaranteeing your kids do not switch to another app.

    Some sort of File Management

    Sadly here, I don’t see Apple doing any sort of File Manager on iOS. Even more, I think they are moving in the opposite direction with iCloud storage on Mac apps, where each file type is tied to the app that created it. But given that this is my wish list, I figure it’s fine to dream.

    The Mac, even when using iCloud storage, provides both tags and an All Files view in the Finder, where you can find apps inside any app’s sandbox. iOS could easily do the same without breaking the sandbox. Provide a simple app to browse all your data files, filter by app, name or tag and have the appropriate app open the app.

    System Contributions from apps

    Ideally, apps should be able to provide more flexible content to the OS. There are abundant examples of this in iOS already:

    • The Clock and Calendar apps change its icon.
    • When using driving directions, the maps app takes over the Lock Screen.
    • Podcasts2 provides a custom rewind and fast forward buttons on the lock screen, that moves the podcast by 30 seconds each tap.
    • iTunes Match has a custom view in Control Center.
    • Reminders shows a checkbox alongside the notification on the lock screen.

    Ideally, I would like Apple to provide a few places where app developers can tap into some system provided features to customize the experience. I guess the risk here is that it can quickly turn into a huge mess, with apps cluttering the lock screen or notification center with crappy content, but Apple can control this in at least two ways:

    • They can easily provide very specific controls, without giving us developers much ability to customize what they can do.
    • It can get strict during the review process to reject apps that fail to comply with some guidelines.

    OS X / iOS integration

    In Apple’s ecosystem you have your Mac, and a powerful device you carry around at all times. Macs are usually more stationary and used for longer periods of time. I’d like for Apple to leverage connectivity between the two (maybe using Bluetooth 4.0) and provide new interactions:

    • Trigger certain notifications only when your phone is away from the Mac.
    • Establish a secure link between the Mac and iOS and use Touch ID to unlock your Mac.
    • Have an iPad act as an AirPlay display if you want to, etc.

    I’m looking forward to this years WWDC Keynote (and to be in the room as it happens). Let’s hope Apple has some surprises on its sleeve.

    1. I’ll be attending WWDC 2014! 

    2. Podcasts appears to have special blessing for some features, even though it’s distributed through the App Store. It recently gained Siri integration as another example. 

  • CocoaPods Best Practices

    I’ve been using CocoaPods for about a year now, and I’ve changed my mind several times on certain best practices. I’d like to share what I currently think is best.

    On choosing what Pods to use

    CocoaPods has tons of source code available. This is great, but may also be a double-edged sword: given the option of using several libraries to accomplish the same, what should you look for? Below is the criteria I tend to use:

    • Is the project alive? If you check its GitHub page, does it show activity? Are new commits coming in? What about tickets? Unless it’s a very simple library, I’m sure some users have encountered certain issues with it and may have reported them. Were these addressed?
    • Do you know any big project that relies on that Pod you are about to include? If you trust the project or the developer, that may be a good sign.
    • Is the codebase something you feel you could rewrite from scratch or work around it instead? I tend to feel more comfortable working with code that I feel I could have wrote. There are exceptions, of course (maybe Facebook Pop is over my head, but the previous rule could prevail here). This is not a matter of time (you are using an external library not to spend time rewriting it from scratch on the first place) but a matter of skills. If you don’t feel you could write that library, you might not have the proper understanding on how it works, which will help you work around any issues you may encounter.
    • Is the license something your project can use? Developers tend to overlook this, but it will be a huge letdown to find out some dependency you are using is GPL when you are about to ship1.

    Version Control and CocoaPods

    Following the official advise, I commit everything to version conotrol:

    • Pods folder.
    • Podfile.
    • Podfile.lock.

    The rationale behind this is that you should look at CocoaPods as a development tool, and not as part of the build process. Any other developer downloading the repository should be able to run the project without having to fiddle with CocoaPods or RubyGems.

    Update your Pods as a sanity check

    Since you’ve committed your Pods to version control, you might feel compelled to never run pod update. It’s fine, but I suggest you run it every now and then as a sanity check. Running it may trigger errors in your build environment (Podspecs needing an updated CocoaPods installation, for example), or show a newer minor fix to a library you are using.

    Use a Ruby version manager such as rbenv

    If you are Ruby developer, you are certainly familiar with this topic. If you are not, Ruby verison managers allow you to install different versions of Ruby side by side, with different sets of Gems. In addition, they are installed in your home folder, so you don’t need to use sudo everytime you want to update a gem (like CocoaPods).

    I use rbenv, but I’ve also tried rvm and both work great.

    Use Homebrew

    I’m sure you have already installed this, and if you not, you have probably seen the need to do so for the Ruby version manager. Homebrew is a package manager for OS X. It’s way better than MacPorts and will help you install and manage Unix packages on your Mac.

    1. While I haven’t checked this, so far I haven’t run into very strict licences (everything I’ve use has been BSD or MIT).