My New Podcast: The Run Loop

The first episode of my new podcast, The Run Loop, is now available in iTunes, Overcast, and wherever else great podcasts are found. You can also listen and subscribe on the shows website. The Run Loop will be a weekly discussion about making iOS and Mac apps with great designers and developers. In this episode I talk to my friend Samuel Goodwin about how he got started, peer mentorship, our trip to Japan, and more.

If you like what you hear, please subscribe, rate, and recommend the show.

You can also help support the show through Patreon. If you donate $1 or more a month, you will receive my sincere gratitude and help me make more and better content, but up to five people can also donate $50 a month and receive an hour a month of my time for a design or code review.

I also want to thank to Joe Cieplinski for creating great artwork for the show. I hope you enjoy this first episode, and I’m looking forward to making many more.

The “Unsubscribe” Mailbox for Apple Mail

I don’t know how I’ve ended up on so many mailing lists for products I don’t care about, but I am. I created this “Smart Mailbox” for finding any emails I’m receiving that can be unsubscribed to that aren’t archived. It works pretty well.

  • Contains messages that match all of the following:
    • Entire Message — Contains — “Unsubscribe”
    • Message is not in Mailbox — “Archive”

New JSON Formatting App by Samuel Goodwin

My vivacious and charming friend Samuel Goodwin has just released a new app for formatting JSON called Formatter on the Mac App Store for the low price for $4.99. You can drag and drop JSON files right on it, or use the included Xcode plugin to turn your gross mess of brackets and parenthesis into artisanally crafted pretty printed JSON files. Another thing I like about Formatter is that it includes a QuickLook plugin to make looking at JSON in the Finder a bit nicer.

The pasta maker icon is pretty clever, too. Go buy it.

Creating StoryWorth for iOS 1.0

I’m really excited to announce that a new app I’ve been working on for several months has come out today. The app is called StoryWorth, and you can download it now. It’s a companion to the website of the company I work for. StoryWorth lets you collect and share (with recipients you choose) your family stories. To get started, you invite a storyteller (mom, dad, grandma, etc), and then we start sending them questions. They can answer through the app, email, or on the website with text, images, or audio. Once you’ve collected some stories, we can print them up in a nice book (you can pay to have audio transcribed) you can put on a shelf and keep forever, regardless of what happens to us. I should mention too that StoryWorth is a paid service. We’re not interested in showing you ads or selling your information.

Oh, also, we have an app now. It looks like this:

HomeStorytellerStory

Design

For the design, a big focus was accessibility. We have users as old as one hundred, so we could be pretty sure some of the people using the app would have limited mobility or vision. The default sizes for text in the app tends to be a little on the large size, but I also did my best to support Dynamic Type so that users who needed to could turn up the font size. I’m looking forward to taking the accessibility stuff even further in future versions.

Aesthetically, we wanted to go for sort of a book feel, while still looking cool and app-like. We did that mostly by focusing on typography and restricting the color palette so that the content and actions really stand out from each other. We use a sans-serif font (Lato) in our primary red color (except in navigation and toolbars) for actions, and a serif font (Merriweather) for most content and long form text entry. Overall I’m really happy with how the design of the app turned out.

When choosing what features the app would have, our goal for 1.0 was to get parity on the most important things (writing, reading) with the website. It’s not completely one for one yet, but it’s an awful lot of it. Having a solid basis of a native app is also going to let us do things that the website can’t do easily when it comes to things like recording audio, offline reading.

Technical

StoryWorth is the first app I’ve shipped that’s entirely written in Swift. In the beginning, learning Swift while writing the app probably slowed me down a little bit, but it didn’t take me very long to become productive. At this point I feel completely comfortable in Swift and think I made the right decision. Swift still has some rough edges, but there’s enough good there to make it an overall win. Mostly the problems I run into have to do with using it with the iOS frameworks, storyboards, and other things that came around before Swift existed.

Speaking of storyboards: I don’t know, man. I used them, and I guess they made things easier, but I also sort of want to tear them out half the time. I hate how they’re stringly typed, I hate prepareForSegue:, and I hate how using them pretty much precludes being able to use non-optional properties in my view controllers. On the upside, they’ve improved a bit over time. Storyboard references make it easier to break up a big monolithic storyboard into many smaller ones. Setting up child view controllers is really easy in a storyboard too. I only used a static table view in one place, and it ended up needing some cells to show or hide conditionally, so that wasn’t especially useful. As cool as that is, it turns out I never end up having more than one or two static table views in an app.

Going back to Dynamic Type, there’s a couple of things I did to implement that. The first was to create UILabel subclass which listens for content size category notifications and adjusts itself as needed. This worked pretty well for pretty much anywhere I had labels, but not for some other things. Dynamically sizing table view rows were also a godsend, since all I had to do was set up my constraints and the table view would do the right thing if the font of it’s contained labels got bigger. Overall, I found working with Dynamic Type sort of a pain when it comes to native views. I’d like to come up a better solution in the future that will make it easy for me to support it in the places I didn’t get to in 1.0.

I do use web views in a couple places in the app though, and it turns out supporting Dynamic Type in those is crazy easy. All you have to do is use one of the -apple-system styles for your CSS font property, set font-family and font-size (in em) to whatever you want. Make your controller listen for UIContentSizeCategoryDidChangeNotification, and whenever a notification comes in, reload the web view. Easy. There’s a good post about it on the official WebKit blog.

Grab Bag

  • UIStackView is rad.
  • Protocol extensions are neat and useful.
  • The new Swift selector syntax doesn’t like nil targeted actions.
  • Carthage breaks much less than CocoaPods for me.
  • I love universal assets.
  • I don’t know if I’m going to stick with Core Data.
  • Color spaces are confusing.
  • App review remains a magical experience.

Conclusion

I took a job at StoryWorth because I wanted to work with nice people on something that’s actually useful, whose business model I understood, and where I could have a big impact. It’s been a while now, and I really like it still. I’m excited to improve the app over the next several months. Please download the app and invite your family. There’s a free trial, and if you decide to subscribe it helps us a lot. Getting to know your family and having something to hold onto forever is something you’ll thank yourself for.

Overcast 2

Overcast 2 by Marco Arment is now available on the App Store. I’m sure I use Overcast more than any other app on my iPhone, and I think people are going to really dig the new streaming feature. Since I think I’m one of the people for whom streaming isn’t really a big deal, my favorite feature is the ability to support Overcast by actively (and optionally) patronizing the app. None of the features are locked behind a paywall anymore, if you like the app, give what you think it’s worth. I’ve already done it.

Marco explains why he went this way on his blog:

80% of my customers were using an inferior app. The limited, locked version of Overcast without the purchase sure wasn’t the version I used, it wasn’t a great experience, and it wasn’t my best work.

With Overcast 2.0, I’ve changed that by unlocking everything, for everyone, for free. I’d rather have you using Overcast for free than not using it at all, and I want everyone to be using the good version of Overcast.

NetNewsWire 4

The best is back! The folks at Black Pixel have shipped NetNewsWire 4 for Mac and iOS. I’ve already bought it from the App Store and it looks great.

Congratulations to all of my friends at Black Pixel for getting this out the door. It’s been a long road, and I’m glad to see their work paying off.

Acorn 5

It’s a couple of days back now, but Flying Meat has released a new version of their fantastic image editor: Acorn. I’ve used Acorn for my work and personal projects since version 1.0 in 2008, and it’s incredible to see how far it’s come while still keeping the simplicity that made it so appealing in that first version.

Gus is a friend — so don’t tell him I said this — but to me he’s always been the epitome of the one person indie who’s both a world class developer and also a fantastic designer. Check it out.

Real-World Testing with XCTest

Kind of old now, but I really like this post from the August issue of objc.io. The two things that stood out for me was that it used XCTest instead of a third party testing framework, and that it gives real examples of how to approach which tests to write. I’ve been totally totally on board with the idea of unit testing for a long time, but my biggest hurdle has always been knowing what to test. Thinking of what tests to write in terms of Given-When-Then pattern they go over has given me some new ideas.

iA Drops Syntax Control Patent, Internet Silent

Last week, the Internet exploded when the website for Information Architects new app, Writer Pro, mentioned the company filing a patent on a feature called “Syntax Control.” What the feature does is use Apple’s NSLinguisticTagger class to highlight syntactic components of your document (adjectives, nouns, etc), to help while editing. I’m not a patent expert, but based on what understand, I don’t believe in them. I’m willing to be flexible, but the point is I wouldn’t have filed for a patent if I were them, and I understand what everyone was so upset over: patents can be used for extorting other companies, and we all hate patent trolls.

One part of the reaction I don’t understand is those who say their patent is more invalid because it’s based on an Apple class. The building blocks for anything you want to do exist. What’s patentable is the specific way in which you took those building blocks and made something with them. Whether those building blocks got you 10% or 90% of the way there is immaterial. How you execute is all that counts. Since I don’t like any patents, it’s bad either way, but the idea that the technical difficulty to implement something matters doesn’t make sense to me.

The other thing I don’t get is why I saw no one commending acknowledging iA for this1:

So, what happened is:

  1. A company did something a lot of people didn’t like.
  2. Those people voiced their opinion.
  3. The company listened and corrected what everyone was upset about.

If a company does something you don’t like, you speak out, and they correct it, that means what you did worked. It means you got what you wanted. Isn’t the right thing to acknowledge them for it? If you don’t, why would anyone listen to you the next time?


  1. Except for all the people who retweeted and favorited their tweet. 

DragonDrop Is the Mac Utility I Use Most

DragonDrop has been out for a while, but I still get asked about it whenever I use it during a presentation. Let’s say you’re dragging a document (an image for example) from one app or Finder location to another, and the thing you’re dragging to is obscured. Without DragonDrop you may be able to do some trackpad acrobatics, enable Expose and make it work without losing the file. If you have the app though, you can just give your mouse a little shake and a small window like this will pop up:

Drag Things Here

Then just drag your file onto the window, and it becomes a floating panel that sits above other windows:

DragonDrop WithItem

Now you can move over to the app you were working with before and drag the files onto it from DragonDrop. I use this all the time when I’m adding files to Xcode, or when I’ve grabbed an image from online that I want to send to someone in an iMessage.

There’s probably a way to achieve a similar effect with LaunchBar or other similar apps, but DragonDrop is perfect as an app that does one thing really well. Plus it’s only $4.99, so why wouldn’t you have both? You can get it on the Mac App Store for $4.99.