Penny Rose

Nothing reminds me of the steady, relentless march of time so acutely as having a newborn baby (well, except maybe having a blog that I don’t update often enough 😅).

Penelope Rose Hansmeyer was born on October 15 via a scheduled cesarean section. For those interested, she was 7 pounds, 8 ounces and 19 inches long. Everything to do with her birth went incredibly smoothly—a stark but welcome contrast to my son’s birth two and a half years ago! And speaking of Charlie: he’s adjusted really well so far to having a baby sister. He calls her “Baby Penny” and likes to pet her hair (which, holy cow, she has a lot of hair!).

I’ve been incredibly blessed not to experience some of the darker challenges of motherhood, such as postpartum depression and difficulties with breastfeeding. Charlie was a terrible sleeper which resulted in us co-sleeping for over two years, and I guess time will tell with Penny, but overall I just feel overwhelmingly happy with my little family and our humble little life.

I just looked back at my post about Charlie’s birth and realized he was born shortly before the Apple special event which introduced the iPhone SE and 9.7″ iPad Pro. It’s fitting, then, that Penny was also born shortly before a special Apple event. I didn’t quite get my order in before the shipping dates slipped, but I’m looking forward to receiving a silver 12.9″ iPad Pro with Apple Pencil sometime before the 20th. It sounds like an amazing upgrade from my iPad Air 2, and I can’t wait to share my impressions with you.

In the meantime, though, I’m gonna cuddle with this little pumpkin. 😊

Link

The Sweet Setup Review

The Sweet Setup Reviews Snapthread

I love this review of Snapthread by Josh Ginter, especially this paragraph:

These backdrops and Creative Commons music options are, again, very plain and simple. However, the point of the app is to be a quick and easy way to share Live Photos with non-iPhone users and with a little extra pizazz. Snapthread is not designed to replace iMovie, so feel free to export your video after the Live Photo conversion and do more major edits inside iMovie.

Josh really nails what Snapthread is all about: it’s meant to be simple and fast, with a few little extras for those who really want them. I’d absolutely advise people who want more control over music, titles, and other effects to continue editing in a more fully-featured editor like iMovie. I’ll continue to add more editing functions as time goes on, but my intention has always been to compete with super casual apps like Clips rather than bigger apps like iMovie.

I Forgot to Take Videos

I forgot to take videos for the first few days after my son Charlie was born. I made sure to pack a couple nice cameras in my hospital bag, and recall struggling against the harsh lighting in my recovery room (not to mention the constant stinging of my incision) to snap some semi-decent photos of my new little bundle. It felt like enough at the time, though now I wish I had done a little more.

Maybe I should have shelled out for the professional photographer. I definitely should have insisted my husband take more pictures of me holding Charlie. And I should have taken some videos, too. Over the past two years countless friends have had babies, and many of them took videos of some of their earliest moments. I find myself wishing I had done the same.

In a way though, I did. I was using an iPhone 6s when Charlie was born. I took a few photos of him at the hospital to easily send to family and friends, and of course took many [thousands] once we finally got home. I’ve always had Live Photos enabled, so each one of those snapshots recorded a tiny 3-second clip.

The clips are shaky, low-quality, and mostly lack sound (because the little guy was sleeping), but there’s just something about them. I’m glad they’re there. They add some “concreteness” to a time of my life that seems like a blur, in a way that a photo alone couldn’t quite accomplish.

When I’m considering how to record a moment, I almost always favor photographs over videos. After all, you can’t really hang a video on your wall. Live Photos make that choice even easier, and with an app like Snapthread, I can still salvage a great moment from a sub-par photo.

My hope for the future of Live Photos is that we won’t have to choose between taking the highest quality photo and capturing those precious little videos. Having portrait mode and adjustable depth data is amazing, but hearing my little boy’s laugh years later is perhaps even more so.

If all goes according to plan, I’ll be going in for a scheduled cesarean section two weeks from tomorrow and we’ll finally get to meet our little girl. You can bet I’ll be taking even more Live Photos (and longer videos too) this time around.

If you use Snapthread to share some of your favorite moments publicly, I’d love it if you’d use the hashtag #snapthread or tag @snapthread (either on Twitter or Instagram) in your post so I can find them. And if you’ve written an article or blog post about how Live Photos in general have affected your life, I’d love to read that too!

Link

Marzipan on Mojave

Benjamin Mayo on Marzipan

Marzipan apps are ugly ducklings. As soon as you use them, you can just know these are not at one with the system. You detect that there’s a translation layer of some kind at work here, just like when you use Slack on the Mac you instinctively feel that it’s a web app in a thin wrapper. The underlying implementation is exposed to the user with a bevy of performance sluggishness, UI quirks and non-standard behaviours. That’s bad.

Awhile ago I wrote about Marzipan and included a crowdsourced list of “what makes a Mac app a Mac app.” It was a pretty comprehensive list, yet lacking in minor details. I knew there had to be a bunch of nitpicky visual annoyances and UI oddities, and Benjamin covers those really well in his post. I feel like I have a much better understanding now of what needs to happen for Marzipan apps to feel native on the Mac.

 

Status

Here’s the new 40mm Apple Watch Series 4 on my tiny 6-inch wrist next to my original Series 0, and then on its own with my old Rose Red band attached to it (please ignore the weird white balance difference…the super pale one is correct).

Watch Series 0 to Series 4 Comparison

Displaying Photos by Moment with Section Headers

One feature I knew I wanted Snapthread to have from very early on was the ability to display a user’s photo library in a similar way to the native Photos.app: scrolled to the bottom, sorted by Moment, with selectable sections. What I ended up implementing is actually closer to the Photos app within the Xcode device simulator: it can’t “zoom” in and out of Moment clusters, but it can display assets organized in sections by location and date.

I created a sample project to demonstrate how I did that and put it on GitHub. This is the first time I’ve ever shared code on GitHub, and I know it’s not particularly good, but if you run the project on your device you should see just what I described: your most recent photos and videos at the bottom of the collection view, sorted by Moment. The project loads the user’s first 25 Moments immediately, and then performs a background fetch for the rest, refreshing the collection view only if the user scrolls to the top of the currently loaded content.

There might be much better ways to accomplish this. I welcome any feedback!

Here’s the project link again, for those interested: SwiftyPhotoMoments on GitHub.

Moving from Paid Upfront to Freemium: Logistics

If you’re thinking about switching your app’s business model from paid upfront to freemium and, like me, have no experience working with servers, I’m here to tell you that local receipt validation isn’t as horrible as it seems.

If you’re unconcerned about piracy and simply want to check to see which version of your app was originally purchased, I highly recommend following this tutorial by Andrew Bancroft: Local Receipt Validation for iOS in Swift From Start to Finish. What I did was skim through each step of the tutorial first to see what was involved. Then, I grabbed Andrew’s code from GitHub and read more carefully through the tutorial, copying files from his project to mine as needed.

Andrew’s tutorial doesn’t go into detail about how to check for original app version, which is why I’m writing this. Hopefully someone will find it useful!

Every time Snapthread’s main view controller loads, it runs a function called checkIAPStatus(). Here’s what that function does, in pseudocode:

if the “purchasedPremium” UserDefault has been set, don’t do anything because everything is already unlocked

else if a UserDefault that I set in the previous release of Snapthread called “originallyPurchasedPaidVersion” is true, unlock everything and set the “purchasedPremium” default (this covers users who paid upfront and have used Snapthread recently enough to have had the default set)

else retrieve and validate the receipt using the ReceiptValidator class created in the tutorial (it returns a ParsedReceipt struct if successful) and examine it for originally purchased app version

NOTE: One of the most important things to remember is that the receipt doesn’t list the original App Store version number that was purchased (such as 1.0, 1.1, etc.). Instead it lists the original build number. So you’ll have to note the final build number of your paid upfront version and check against that.

When you ask your ReceiptValidator to validate a receipt, it returns an enum that may or may not have an associated value (either .success, with a ParsedReceipt struct, or .error). So you can do a switch statement on the result, and do something like case .success(let receipt): to grab a reference to the associated ParsedReceipt so you can look at it.

The originalAppVersion property of the ParsedReceipt struct is a String, so you’ll want to convert it to an Int in order to do a less-than comparison.

The only real downside, in my opinion, to doing local receipt validation using Andrew’s method is that it uses OpenSSL, which requires you to disable Bitcode in your project because it doesn’t support it. Disabling Bitcode is easy, but can cause you to get a weird e-mail from the App Store after uploading a build telling you you’ve got extra symbol files, or something like that. It’s just a warning and doesn’t prevent your build from going through or anything, but I was confused by it.

So far I haven’t received any complaints from previous purchasers who can’t export long videos or are seeing a watermark, so I’m guessing I must have done something right!

Snapthread is Now Free!

Snapthread 1.8 is now available with a brand new business model and a gorgeous new icon designed by the incredibly talented Michael Flarup. The update includes mostly minor improvements, including the ability to select entire “Moments” of photos in one fell swoop as well as a button for quickly generating a video from your most recent photos.

There’s something about having a truly great icon that’s made me feel more dedicated to Snapthread than ever. There are so many improvements I still want to make as well—enough to keep me busy for a long, long time. In a way it’s become a sort of playground for me to practice and develop my programming skills, and I love the endless challenge of improving it.

Anyway, I hope you’ll consider giving Snapthread a try. You can use all of the app’s features for free with only two limitations: a watermark in the lower left corner and a 30-second limit for video exports.

Here are three things you can do quickly and easily with Snapthread:

  • Stitch together Live Photos of your kids, pets, latest vacation, etc.
  • Combine portrait videos for IGTV
  • Mix Live Photos and regular videos together

Thanks for all of your support, and extra special thanks to my awesome beta testers and translators. I couldn’t do this without you!

Status

I’ve always written blog posts in either Notes, the WordPress app, or the browser. This week I tried iAWriter and used Markdown for the first time. I like it! Next I think I’ll take MarsEdit for a spin. 👍🏻

Delicate Feature Dance

It’s mid-September, and as summer swiftly comes to a close it seems like a great number of other things are wrapping up in my life as well. The crops are nearly ready for harvest, I just submitted version 1.8 of Snapthread, and in exactly one month we’ll be welcoming a new addition to our family. Apple is busy wrapping things up as well, having debuted its new iPhone and Apple Watch models this past Wednesday, and preparing to release iOS 12 to the public this coming Monday (and macOS Mojave the following week).

As I watched Wednesday’s keynote, I was intrigued by the decisions Apple made regarding the iPhone lineup, particularly the differences between the iPhone XR (this is where I remind your brain to pronounce it “iPhone TEN ARRR”) and its considerably more expensive counterparts. I’ve been thinking a lot lately about “driving conversions” and how to nudge people to make certain buying decisions. Snapthread is becoming a freemium app on Monday, and as anyone who follows me on Twitter knows, I had a hard time deciding what features to gate off from my free customers.

Apple had to figure out where to draw that magic feature line too. The way I see it, if you have two models of the same product, a cheaper entry-level model and a premium one, you have two choices: present the cheaper one first and position the premium one as “this model has everything the first model has, PLUS all of these other must-have features,” or present the cheaper one second, and explain what features are missing, which kinda gives off a “sad trombone” vibe for anyone who can’t afford a >$1,000 cell phone. I’m fascinated that Apple chose to do the latter, and with a twist even: the iPhone XR is actually more compelling in some ways than the XS and XS Max. It has longer battery life, it comes in more colors, it has a bigger screen than the XS, all while sacrificing…what? Optical zoom and 3D Touch? An OLED screen? This phone is clearly meant for the masses.

It made me wonder what purchasing decision Apple is trying to drive customers to make, until I realized: they probably don’t care. Like, at all. Because regardless of which iPhone model turns out to be the breakout star of 2018, their average selling price goes up, up, up. My guess is that in the United States, the iPhone XR is going to sell like hot cakes. Everybody and their brother and their middle schooler is going to want one of those suckers, probably in yellow or orange.

Overall, the event made me even more excited for the iPad and Mac announcements likely coming in October. Will Apple make similar decisions with the MacBook lineup? Just like iPhones, MacBooks have gotten gradually more and more expensive. Will Apple make their entry-level laptops so fresh and compelling that choosing between them and a MacBook Pro is somehow more difficult? And what about iPad Pros? Certainly they’ve got more up their sleeve than just FaceID and edge-to-edge displays (or really really slim bezels, for the pedantic). It’s all very exciting, and if I weren’t having a baby in ~4 weeks I’d say the October event is the one thing I’m most looking forward to this year.

In the meantime, I ordered an Apple Watch Series 4 (GPS) in silver aluminum and a tangerine sport loop, which should arrive this Friday. There was something bittersweet about setting an alarm on my Series 0 for 1:59AM so I could order its replacement; on the other hand, I’m definitely looking forward to the enormous difference in speed and features I’ll get with the Series 4. I’m also looking forward to seeing what I can do with Siri Shortcuts to manage life with both a toddler and a newborn.

My list of potential blog topics continues to grow, so expect to read more from me soon!

Looking Ahead

It’s been quite a summer. This pregnancy has been pretty miserable compared to my first; a combination of loosening ligaments and chronic lower back/hip issues has made walking extremely painful, and it’s been hard for Charlie to understand that I can’t play with him exactly like I used to. On the other hand, baby is healthy and the end is in sight with only 8 weeks to go!

Snapthread’s revenue dropped off considerably about two weeks ago, so I’m particularly eager to transition to a freemium model to see if that helps. In the free version you will be able to export videos up to 30 seconds long, with a watermark. You can create a longer movie and preview it, but if you try to share it, you’ll get a prompt to upgrade (before that there will be a noticeable warning in the UI when the duration limit is exceeded). This approach will give people a good sense of what the app can do, and while I realize I could probably get a higher conversion rate by being a little more limiting, I’d rather attract and retain a large user base. With all of the feature ideas I have, it’s very possible that more things will wind up behind the paywall in the future.

Speaking of features, I thought I’d list some of the things I’d really like to add to Snapthread as time goes on. Some of these I’ve mentioned before and others are new ideas.

  • The ability to add text and stickers to clips
  • The ability to select a specific section of a song
  • The ability to adjust the crop rectangle of clips for any aspect ratio, not just square
  • Support for still photographs (ideally with a Ken Burns effect)
  • Basic video adjustments: contrast, brightness, saturation, color balance, etc.
  • An option for at least one type of transition (fade, dissolve, etc)
  • A simpler way to loop a video multiple times (this is currently possible by just adding the same clip more than once)
  • The app should cache the most recent project so it can be restored in case of a crash
  • A way to “intelligently” auto-generate a video from a recent Moment

Honestly, that’s probably a couple year’s worth of features right there, at the rate that I’m able to work on it. 

I once stated that Snapthread’s mission was “to provide the fastest, most intuitive way for people to merge Live Photos and videos for the purpose of compiling and sharing their memories,” and to that end I want to make sure that any features I add don’t clutter up the interface. It will be a careful balancing act but I already have plans to streamline the clip-editing UI so that it’s easier to perform multiple edits quickly.

Anyway, I feel like I’m just rambling now, so: look for Snapthread 1.8 to arrive around the time iOS 12 is publicly released (with a pretty new icon, too!). After that, it’s anybody’s guess as to when I’ll be able to get another version out (besides bug fixes) because Baby Girl Hansmeyer will be here October 15th! 

Status

I always figured I’d make a whole bunch of apps that would each generate a little income, like David Smith. Instead, it’s become increasingly clear to me that Snapthread should be my main gig. I have so many feature ideas for it, and I think there’s a lot of potential for growth and improvement!

Apple, Marzipan, Delight

Note: This is not a recipe. For desserts, please see: Marzipan Apple Pie or Apfel-Marzipan-Kuchen

Here’s two opinions. They aren’t necessarily my opinions, but I know many of you share them.

  1. The visual design of iOS has grown stale and is in need of an overhaul.
  2. Marzipan apps, while better than Electron apps, still don’t feel like they “belong” on the Mac. They don’t feel like “real” Mac apps.

Let’s talk about these things.

I think iOS 7 was an important design reset for iOS. I also think that it’s taken WAY too long to walk it back, in terms of intensity, to something more reasonable, accessible, and beautiful. 

Before the rumor broke that iOS 12 was going to focus primarily on stability and performance, I think many people, including myself, were hoping for a major UI makeover. In addition to a system-wide dark mode, some folks were hoping for a fresh look for first party apps like Reminders and Notes, and others wanted to see updated appearances for controls like UIButtons, UISwitches, and UIPickerViews.

I’ve watched a good number of WWDC 2018 sessions and if I had to pick an overall theme for this year’s conference, it would be “Delight Through Interactions.” So many of the sessions are all about how we can make our apps better by leveraging fluid, reversible, and interruptible gestures and animations, how we can extend them by making them more useful across platforms, and how we can improve their performance by writing efficient code that scales. (Note: I could have selected like five different sessions to link to for each of those phrases. I just picked my favorites)

Hmm. A focus on delightful gestures, low latency transitions, and cross-platform usability? That almost sounds like Apple is working on some special new hardware. It also sounds like its preparing us to port our apps to Marzipan. In the absence of major API changes and with the focus on how apps should behave, we’re left wondering whether or not Apple still has the same opinions about how apps (and the OS as a whole) should look.

Here’s my theory: Apple is working on a significant design overhaul for iOS 13, and it will address many of the issues people currently have with Marzipan.

Why did macOS get Dark Mode before iOS? That’s weird, right? These days, macOS typically follows in iOS’s footsteps. On the other hand, why should Apple designers waste time creating “dark” versions of every UIKit control now when they’re just going to have to re-do it to match iOS 13’s new look?  

Anatomy of a Mac App

Tuesday morning I asked Twitter what makes a Mac app a Mac app. I was genuinely curious, because I’ve been using Macs for 15 years and didn’t feel like I had a complete sense of what differentiates a native app from a non-native one. Greg Pierce (developer of Drafts) helpfully referred me to a section of Apple’s Human Interface Guidelines that lists four main characteristics of a Mac app: flexible, expansive, capable, and focused.

I got many other answers as well, including one that referred me to a list that Steve Troughton-Smith crowdsourced a few days ago. Here’s that list, plus a few extras in bold:

  • Menu bar and window toolbars
  • Sidebar/source list
  • Preference windows
  • Touch Bar support
  • Contextual menus
  • Tooltips
  • Multi-column tables
  • Field editors
  • AppleScript
  • Tabbed windowing
  • Multiple windows
  • Standardized color picker and font panels
  • Pop-up menus
  • Time machine/versioning
  • Compact control sizes
  • Resizable split views
  • Outline views
  • File-system access
  • Scroll bar elasticity (often missing in non-native apps)
  • Selectable text where you would expect 
  • Customizable toolbars
  • Honors general system preferences (e.g. button color prefs) and default apps 
  • Support for Services
  • Drag and drop support

Writing about Marzipan for 9to5Mac, Guilherme Rambo notes:

“Other Mac-like elements that can be used by iOS apps on macOS are contextual menus, the menu bar, translucent sidebars (such as the one in the News app), window toolbars and the Touch Bar. These elements have been exposed to the iOS apps through new classes in the version of UIKit available on the Mac.”

That knocks a few items off the list, at least! Many of the other things listed would greatly improve iOS apps as well. After all, there’s nothing that should prevent iOS apps from also being flexible, expansive, capable, and focused. Which brings me to…

WWDC 2019

Here’s some things I’m hoping to see at WWDC 2019:

UIFontPicker
This could be in the same, hopefully refreshed, style as UIPickerView and UIDatePicker. There could be a standard version that would automatically list all installed fonts, with a way to customize which fonts are listed. This could be easily hooked up to a label or text view as well.

UIColorPicker, UIColorPickerController, and UIColorPickerDelegate
UIColorPicker would be more modular and would require manually setting up a delegate. UIColorPickerController would contain the boilerplate delegate methods and would be an entire view controller dedicated to color selection.

iOS Time Machine versioning support
This might be too much to ask for next year, but I’m imagining this being announced at the same time as a new hardware accessory similar to the AirPort Time Capsule that would enable wireless iOS backups to a local physical drive.

iOS support for rearrangeable UIButtons in a toolbar/nav bar
This could be as simple as a new boolean: isMovable. I’m guessing UIButtons and UIBarButtonItems are going to look a heck of a lot more like buttons in iOS 13.

Auto-generated tooltips
Tooltips in Marzipan apps could be drawn directly from accessibility hints or labels.

Consistent, system-wide, default keyboard shortcuts for iOS 
I don’t even use a hardware keyboard with my iPad, but this still pains me to think about.

Dark Mode
Oh, and maybe the custom accent colors from Mojave? Because why not?

Final Thoughts

I noticed some fussing about the scaling of apps ported to the Mac using Marzipan, which are apparently rendered at 1.3x and downscaled, or something like that. I’m guessing that’s going to become a non-issue eventually, between the iOS redesign which may allow for a smoother translation between touch-optimized and mouse-optimized (compact) controls, and the likely-to-be-increased screen resolutions of new devices released this September. But what do I know? (Hint: not much, lol)

Anyway, I’m really excited about Marzipan. I think it’s a great idea, and I can’t wait to see what waits for us in Phase 2 of the project and beyond. Ultimately, I think it will make both iOS and macOS more useful, powerful, and delightful, without taking away anything that people love from either platform.

What do you think? Will iOS get a re-design next year? Will the Marzipan project ultimately improve both macOS and iOS in tandem? Feel free to share thoughts with me on Twitter, or better yet: write your own blog post.