Thursday, February 16, 2012

Dear Apple, Please Bring Free Updates from iOS "Back to the Mac" with OS X 10.8 Mountain Lion

I'm not cheap. I pay for all my software. Suggesting to Apple that OS X 10.8 Mountain Lion be a free update isn't about saving $30 bucks. I've gladly paid for every OS X update and will continue to do so if that's the direction Apple takes.

But I think the best idea from iOS, free updates, should come "Back to the Mac". This policy would allow developers to use the latest APIs as quickly as possible and help developers & Apple reduce support cost for older OS X versions more quickly. Any kind of monetary transaction is going to slow down OS X update adoption. Any iOS developer with access to analytics can see how quickly iOS 5 adoption has taken off (I've seen 60-75% already). Lion has sold 17 million copies, Apple's best selling release ever. The last reported install base was 58M Macs. Lion is on roughly 29% of all Macs. Pretty good, not nearly free iOS 5 adoption good. 

17 million Lion copies is a $510M gross, no small stash of cash to throw away. Except Apple has nearly $100B (or more by now) in cash, and making up that revenue is only 398k Macs at an average selling price of $1281

Imagine the ad Apple could deliver promising free software updates for 2 years on all their devices! Contrast that with the Android 4.0 upgrade schedule from Motorola or the confusing array of costly and confusing Windows upgrades, the comedy gold practically writes itself.

I think Apple replaces the revenue easy with a combination of Apple's cut of increased Mac App Store sales, decreased support costs, but more importantly new users. They could really amp up the expectation that when you buy a Mac, Apple "takes care of you" unlike with all those razor thin margin PCs. More importantly, it hits Microsoft where it really hurts, their wallet.

Tuesday, February 07, 2012

Easily Localize Custom NSDateFormatter Date Format Strings in iOS 4+

Apple ships a lot of new APIs with every major iOS release. They claimed iOS 4 had over 1,500 new APIs, and the same claim is repeated for iOS 5!
Any way you slice it, a lot of new code
It's easy for a new API that is developerlife altering to slip through a release undetected.

Which is exactly what happened to me for new in iOS 4 API [NSDateFormatter dateFormatFromTemplate:options:locale:]

Why is this API such a big? It gives developers an easy way to generate a custom date or time string for display to the user. Cocoa Touch (and Cocoa before it) have had predefined NSDateFormatterStyle that correlated to specific date or time display representations. For example, NSDateFormatterShortStyle used for dates would be 11/23/37 and for time 3:30pm. But the really big deal was that if you use these predefined styles they would get localized based on the NSLocale of the device. Meaning the short date format in the U.K. would output 23/11/37 and 15:30 respectively.

If you wanted a custom format and localization, like just month and day, you were out of luck without writing it yourself, which means you usually just used the pre-defined styles. Until iOS 4 that is!
Starting in iOS 4, you could not do stuff like this (straight from the documentation):
NSString *formatString = [NSDateFormatter dateFormatFromTemplate:@"EdMMM" options:0
locale:[NSLocale currentLocale]];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:formatString];
NSString *todayString = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"todayString: %@", todayString);

Which results in this output formatted for the US like this:
2012-02-07 09:32:16.725 Untitled 2[1803:707] todayString: Tue, Feb 7

And when the locale is, for example, Great Britain, the output is this with the same code:
2012-02-07 09:36:32.439 Untitled 2[1839:707] todayString: Tue 7 Feb

Notice this even puts a comma in or not as required by the locale!

BTW, the excellent CodeRunner (available on the Mac App Store) is perfect for quickly running these kinds of code snippets to see the output.

Friday, February 03, 2012

A Lack of Sandboxing Leadership: Apple's AirPort Utility 6.0 for Mac OS X 10.7 Lion is NOT Sandboxed

AirPort Utility 6.0, the iOSified and Lion only update to Apple's excellent WiFi network and base station management app released on January 30, 2012, is not sandboxed.
All Shall Sandbox

Apple decreed all apps submitted for Mac App Store review on or after March 1, 2012 must be sandboxed (there's no direct link, screenshot captures for posterity). The previous deadline was November 1, 2011.There has been a ton of debate on whether sandboxing as currently implemented actual solves the problem it sets out to. I'm not going to re-litagate that here. Introducing App Sandbox (Apple developer account required) from WWDC 11 makes as persuasive a case as I've ever seen for sandboxing. 

There are problems with sandboxing in Lion that Apple needs to solve, and 10.7.3 implements or fixes (Apple dev forum) a number of sandbox issues. Good arguments, documentation, fixes, and mandated deadlines that have already been pushed back aren't going to conclusively prove to 3rd party app developers they must implement sandboxing now.

Leadership does. Look at a list of Apple apps, and you're just as likely to see them not sandboxed as sandboxed. A lot of Apple's high profile apps are not sandboxed:
  • Safari 5.1.3 (
    • Some of the parts of the app like Safari Web Content are, but the main UI app isn't
  • Pages 4.1 (Mac App Store)
  • iBooks Author 1.0 (Mac App Store)
  • AirPort Utility 6.0 (
  • iPhoto 9.2.1 (Mac App Store)
  • iTunes 10.5.3 (
  • Xcode 4.3 (Mac App Store - Released February 16, 2012)
Maybe Apple's going to drop sandboxed versions of these apps any minute. But the closer we get to the submission deadline without even Apple's brand new apps (iBooks Author I'm looking at you) being sandboxed, the harder the deadline is to take seriously.

I've already taken one shot at sandboxing SleepMute in its current development cycle on Mac OS X 10.7.2. SleepMute has a UI app to write preferences and a helper that reads preferences and mutes or unmutes sound. Sandboxing completely broke the app. Both apps read/write preferences (with CF functions) to the same file preference file. This feature works perfectly without sandboxing, has to be completely rewritten for sandboxing. Also, simply launching the helper from the UI app wasn't working. That may have been fixed by 10.7.3, so I'll probably give it another shot, but not until Apple's apps start getting sandboxed.

Thursday, February 02, 2012

Netflix is my new HBO

 When I grew up in the 80s, a particularly life changing event was when my family subscribed to HBO.

There were no parental controls in those days. If you had parents like mine that put a TV in your room with HBO on it, you could watch all sorts of stuff that you had no business seeing. HBO's always had loads of cheap crappy movies to round out the expensive good stuff and original series. HBO would play those crappy movies over and over, I'd watch'em over and over again. The later at night the better, especially if it was some horror or mind fuck flick. Past midnight, I'd watch stuff that I'd never give time during the day. Nightmare on Elm Street 4? Why not, I've got time. Swamp Thing? I've only seen it 15 times, what's one more viewing.

It hit me tonight that Netflix is my new HBO. Insomnia at 3 AM? Why not Don't Look Back, subtitled because it's French, starring The Matrix Reloaded's Monica Bellucci and The World Is Not Enough's Sophie Marceau? I've got nothing better to do.

The perfect kind of late night crappy movie is the one you:

  • Can fall asleep to if you get tired again
  • Don't mind turning off at any point because you really don't care about the story
  • Might show you a bit of skin, no matter how fleeting
  • Is unintentionally funny, so you laugh at it not with it
  • You can watch in the background while you do something else (like write this post)

Plus, Netflix has mostly crappy content and it's getting worse as movie studios refuse to cut deals for newer better streaming content in reasonable timeframes. Which makes Netflix kind of perversely perfect for my late night insomnia needs. I won't be turning it off again if it stays anywhere close to $8/month and keeps the obscure content and/or bad content. And to think, I haven't even entered the time wasteland of TV-MA rated Japanese anime yet!

Wednesday, February 01, 2012

Exhibit A. On Why iOS 5 Newstand Apps Should Always Be Universal

I've had the New York Times app on my iPad since Newstand launched alongside iOS 5. I don't read the content, it's just not part of my workflow. What I love however are the notifications of important events just for having the app installed. The editorial selection is perfect, so I downloaded the NY Times app to my iPhone to get the notifications there as well.

I didn't realize what I downloaded on the iPhone was not a universal app. Imagine my surprise when I got back to my iPad & through the magic of App Store automatic downloads it appears I now have two NY Times!

When the iPad first came out, I would've agreed it was acceptable to ship separate apps for one actual app to pay for the cost of adding iPad features. No more. A universal app is really just table stakes at this point  There's no user experience case to be made for shipping separate iPhone & iPad apps. Multiple apps for the same app just creates user confusion on the App Store, and in cases like this, on the device as well.

And it just looks really dumb in Newstand!

Why External Links Should Maybe Open in New Tabs

UX Movement posted Why External Links Should Open in New Tabs. I've never quibbled with any of Anthony Tseng's advice before, but this time I think he misses the mark somewhat.

True, for the primarily audience of this blog, I think opening external links in a new tab makes sense. I just went back to my posts this year and changed all external links. That's the key though, this decision has to be made based on the audience of the site.

Ever watch an older user or even young but not to savy user get dumped into a new browser tab? This sentence from UX Movement completely applies:

When a new window opens, it covers the user’s earlier window. The user is left confused and wondering how to get back.

Just replace window with tab and it still applies. All these users know is the back button.

So if your trying to appeal to browser savy users, go ahead and open external links in a new tab. If however you're trying to appeal to a broader audience with less browser know how, open external links in the current window or tab.