A Clean Slate

Last Thursday my shiny new Space Gray MacBook Pro finally arrived at my doorstep and so far, I absolutely love it. This post isn’t about that, though. It’s about setting up a clean install on my Mac for the second time ever.

That’s right, I’ve been transferring files from Mac to Mac ever since I got my first iBook in 2002 or 2003 (can’t remember). As proof, here’s a couple pages from one of the welcome guide PDFs that came with that computer:

Where’s Wi-Fi?

Since that’s the way I’ve always rolled, the first thing I did when I opened my new MacBook Pro was connect my Time Machine backup via an Anker USB hub. The restore went surprisingly quickly, and I set about double-checking that everything was in order.

It was, except for one thing: most apps couldn’t establish a network connection. Dropbox wouldn’t connect and Safari Technology Preview wouldn’t load any websites. I spent several moments in despair, thinking I’d received a defective unit and would have to send it back after waiting for so long. Then I tried switching to regular old Safari and…everything worked fine. For some reason, Safari was the only program that was able to access the Internet. I still don’t know what the problem was, but evidently something went awry during the restore. [Update: Rob Poulter suggested that my recent installation of Little Snitch might have something to do with it, and I think he’s probably right.]

So, I wiped my new Mac clean again, re-installed Sierra and set up a new user for the first time in 13-ish years.

That Fresh App Smell

The first thing I did was install my must-have apps and utilities: Dropbox, Homebrew, Xcode, Pages, f.lux, Tweetbot, Textastic, Cyberduck, and Affinity Designer, to name a few. I installed Caffeine only to realize for the first time that it hasn’t been updated in several years and doesn’t even have a Retina-ready menu bar icon. I searched for alternatives and found Amphetamine (Mac App Store link), which is great and gives you a selection of menu bar icons to choose from (I chose the coffee carafe).

Finally it came time to download Photoshop CS6. The download took over an hour on my sad rural internet connection and when I finally ran the installer, it quit with an error every time. So, I got to test out a feature I never thought I’d use: Remote Disc. I found my Photoshop install CD, popped it in my old MacBook, and voila! I was able to install the software. I guess I should have tried that approach first!

Photos Woes

The next thing I wanted to do was move my Photos and Music libraries over. I dug into my last Time Machine backup and transferred the 90GB Photos library file to my new Mac. However, when I opened Photos, things got…weird. Only a few thumbnails appeared, and Photos refused to let me switch on iCloud Photo Library without purchasing more space, because it was planning to re-upload everything. I went ahead and upgraded to the next storage tier hoping that Photos would check with the server, realize it didn’t need to re-upload everything, and calm the heck down. I was wrong.

So, I closed the program, trashed the library, and started over. This time I switched on iCloud Photo Library to begin with. All of my thumbnails appeared, and Photos started downloading all 11,000 photos and 200+ videos from the cloud. Although not ideal, this was the better option for me because my download speed can top out at 10Mbps while my upload speed is only 0.73Mbps. As of right now, 6 days later, there are ~2,500 left to download.

Still, I can’t believe Photos forces users to either re-upload everything or re-download everything if they use iCloud Photo Library. (Wait, yes I can. ?) I’ve read that iCloud is supposed to check for duplicates server-side, but I’m skeptical because it definitely seemed like it was trying to upload files.

The Little Things

I never thought that performing a clean install would make much difference to me. However, here’s a short list of things that are so much better now (note: I could have cleaned all of this up on my old machine; I just hadn’t realized how cluttered everything had gotten):

  • FONTS. Oh my gosh, I had so many freaking fonts installed that I never use and the font menu in all of my apps was so horrible and unmanageable. A clean install fixed that!
  • System Preferences panes. I had icons in System Prefs for devices that I never use anymore, like a 10+ year old Wacom tablet that I’m pretty sure doesn’t even work.
  • Printer drivers and utilities. Back in high school, I’d install whatever drivers and printing/scanning utilities came with my printer. And I went through quite a few printers. Starting fresh helped get rid of whatever unnecessary software remained.

So yeah. If, like me, you’ve never set up a clean user account on a new Mac: I highly recommend it!

The Mac for Me

Last November, I published my wishlist for the 2016 MacBook Pro. Here’s what I wanted:

  1. Lighter. According to Apple, the average weight of the current 15″ MacBook Pro is about 4.49 pounds. Given the company’s unwavering commitment to shrinking things, I think I can reasonably expect that number to drop a bit for next year’s models. Check.
  2. Touch ID. Because why not? Check.
  3. Individually backlit keys. (Check.) I don’t really want to see any changes to the key travel, but those backlit keys on the new MacBook are rad.
  4. Wider color gamut, like the new iMacs. I don’t know if this is technically possible because I have zero knowledge about display technology. However, since MacBook Pros are generally geared toward creative professionals, this would be a change that makes sense. Check.
  5. Different finishes. Gold. Space Gray. Black. White. I don’t really care, as long as it’s not just stupid boring silver. Ugh. Check.
  6. USB-C/Thunderbolt 3 ports. Because if I’m going to be using this laptop for another 5 years, it needs to have the Port of the Future. Or whatever. Super check.

Looks like I’m six for six! (except the key travel did change, but ehhh I’ll get used to it.) Also, one of my “dream big” requests was for a bigger trackpad with Pencil support, so I guess you could even say I got six and a half of my wishes.

I’m really, truly sorry if this MacBook Pro isn’t for you, and I hope Apple will renew its commitment to the rest of the Mac lineup ASAP.

That said, this is absolutely the Macintosh for me.

On iPhone 7/MacBook Pro Compatibility 

I’ve been thinking about how neither the iPhone 7 nor its accompanying headphones can connect to the new MacBook Pro without an adapter. My conclusions are as follows:

  1. Apple wants you to use iCloud and to buy iCloud storage. I’ll come back to this in a moment.

  2. Apple doesn’t really intend for Lightning headphones to be a thing. They included Lightning EarPods in the iPhone 7 box as well as an adapter in order to appease consumers. They assume you either 1) already have some 3.5mm headphones you like or 2) will embrace wireless headphones. So why put a Lightning port in the new MacBooks?

  3. Apple doesn’t want you to charge your devices by connecting them to your computer. I think the 12″ MacBook introduced that idea. Apple wants everyone to charge their stuff via power outlet, probably overnight. I realize the batteries probably don’t last long enough for that to be practical for most people, but there it is.

  4. Apple doesn’t want you to backup your devices using your computer either. They want you to buy iCloud storage, as stated above, and use iCloud backups.

That leaves developers as the only ones who would need to connect their iPhones to their MacBooks, and Apple has no problem selling an extra $25 cord to developers.

So really, putting a Lightning port in the new MacBook Pro makes absolutely no sense, and neither does including a Lightning to Thunderbolt 3 cable.

Viva la (r)evolución

Much to laptop-lovers’ delight, Apple announced three new MacBook Pros yesterday: a 13″ model with a traditional row of function keys and two models, 13″ and 15″, with a “revolutionary Touch Bar.” Now, I don’t have the patience to scrub through the video of the event to see if Phil actually called it revolutionary. And actually, it doesn’t matter because the word is all over their marketing copy.

Apple ad for new MacBook Pro on Facebook

An ad on Facebook for Apple’s new MacBook Pro models.

I agree that the Touch Bar is revolutionary. It’s a dramatic change to what we’re used to. As many have noted, however, the new Touch Bar is also evolutionary: one more change in a long series of tweaks that Apple’s made to the lower half of the clamshell over the past several years. Jony Ive himself told CNET that this was “the beginning of a very interesting direction.”

As I sat mulling over which model and configuration I wanted to buy, I felt slightly uneasy knowing that the Touch Bar was only the first step towards some grand, yet-to-be-realized Jony Ivian vision. How long would I have to wait for him to complete his masterpiece? One year? Two? How about five? The answer, of course, is that it will never be complete. Technology evolves too quickly for anything to remain extremely cool and intensely desirable for more than a year. Design sensibilities fluctuate, new materials are synthesized, and new interaction models are imagined at an incredible rate. In the end, what’s important is that I have a good, functional, reliable tool for doing what I need to do right now.

So, I’ve decided to just embrace the evolution. I will have to buy a hub, as I am a frequent user of the SD card slot and regular USB ports. I’m looking forward to using the new Touch Bar and seeing what developers do with it.

I’ve also decided to move down to a 13″ display. In doing so, I’m going from a computer that weighs 5.6lbs to one that weighs 3lbs, which should feel amazing (and also fit comfortably in my giant diaper bag if necessary!).

“But won’t it suck to have less screen real estate?” my mind asks as I type this entire blog post on my 4.7″ phone display. Sure, Xcode will be a little cramped, but I’ll just have to learn to actually hide various panes when I’m not using them. Full screen will be my friend. And if I decide to get a 5K monitor someday, my little 13″ buddy can handle it.

I saw a lot of snark and negativity on Twitter yesterday, some of which was probably warranted. Regardless, I would encourage Apple lovers to try to separate your desire to see Apple be its best self (and be the perfect, pure source of your futuristic dream devices) from your actual, realistic day-to-day technology needs. If what Apple offers meets your current needs, be glad, and by all means continue to encourage Apple to excel still more. If it doesn’t, then maybe sit back and carefully (prayerfully?) consider switching to something else.

Life is way too short to be grumpy about tech all the time. Embrace the evolution!

Fall Corgi Sticker Pack Update

Sploot the Corgi Fall Promo art

Yesterday Apple approved an update to my Sploot the Corgi sticker pack that includes 5 fun new autumn-themed stickers!

New fall stickers!

Nearly all the stickers in Sploot the Corgi started out with hand-drawn doodles like this:

I then took pictures of my drawings and traced them with the pen tool using Affinity Designer.

I’m planning to add more new stickers (both winter-themed and general-purpose) in the coming months. I’m also considering increasing the price to $1.99 when I hit a certain number of stickers, so grab it early!

Sploot the Corgi Stickers!

I made a sticker pack!

It features a corgi named Sploot (a “sploot” is a common corgi position where both hind legs are splayed out, as illustrated by this helpful Buzzfeed article). There are currently a dozen stickers in the pack and I plan to add more throughout the year.

Sploot the Corgi

I want to talk a little bit about Sploot’s launch.

At some point last Monday night, the iMessage App Store unexpectedly went live and sticker packs became available for purchase for anyone running the iOS 10 beta. I rushed to the store and checked all the featured lists and…nada. Apparently Sploot, like many other apps, was still “Pending an Apple Release.” I admit, I was bummed not to be featured (doesn’t everyone love corgis?!). Looking through those lists, it seems I would have had better luck creating something that was purposefully bad (see: failmoji) than attempting to create something good and falling short of the mark.

Anyway, when my stickers were finally ready for sale the next day, I sent out a couple tweets about them. Meanwhile, other sticker packs were getting featured in round-ups on all my favorite Apple sites. My mistake? Not inviting bloggers to beta-test my sticker pack. Sure, they might not have listed it anyway, but it would have been worth a try! I’ve often talked about how important promotion is; apparently, I can’t take my own advice.

My next mistake became obvious to me as I was spamming my husband and best friend with stickers: my stickers were too big. I mistakenly thought that everyone would use the maximum sticker size of 206×206 points. However, it looks like most stickers are around 130×130 points. So, I resized mine and submitted an update (which was approved yesterday). I also changed the name of the pack from “Sploot” to “Sploot the Corgi” and switched it from the “Emoji & Expressions” category to “Animals and Nature.” I’m hoping these changes will make it easier to find.

In the last week I sold about 80 sticker packs—which is fine, but I was definitely hoping for better!

I think the best thing I can do now is to get working on an update with some seasonal stickers and continue hoping for a feature. And hey, if you’re in need of some cute corgi stickers, you can download Sploot the Corgi from the App Store!

Submitting Stickers Through iTunes Connect

As I sat down to submit my corgi-themed sticker pack last night, I realized I actually had no clue what to do. Apple’s instructions for submitting standalone sticker packs are actually spread across two separate guides (iMessage App Submissions | Sticker Submissions) which added to my confusion.

So, in case you’re as confused as I was, here’s some answers to questions you may have.

What size screenshots do I need to prepare?

You need to prepare two sizes: iPhone 6s Plus (or any of the 5.5″ devices) and 12.9″ iPad Pro.

Where do I upload the screenshots?

You need to add them in two places: at the top of the iTunes Connect record under “App Preview and Screenshots” and farther down under “iMessage App.”

Do I need to add a 1024×1024 square app icon even though Apple doesn’t list it in its Human Interface Guidelines or icon template?

Apparently. There’s a paragraph at the bottom of the iMessage App Submission guide that makes me think it might be possible to view sticker apps on the iOS App Store if you’re not running iOS 10:

if users are on an operating system lower than iOS 10, the link will open the product page on the App Store for iPhone and iPad, and users can download your app from there.

Of course, that might just apply to full iOS apps that include sticker extensions. Who knows? If you’re using the Photoshop template provided by Apple, double click on the “icon” layer under the 58×58 size. It will open as a 1536×1536  square version…you can size that down to 1024×1024 and hit “Save As” (so you won’t mess with the template) to easily fulfill this requirement.

What should I include in the screenshots?

I was a little unsure about this, but decided to go with one shot of my sticker pack in expanded view, and one shot of a sample conversation using my stickers. I took all of my screenshots in the Simulator because I don’t have test devices. I used Photoshop to add profile pictures for my message participants using royalty-free stock photos from Pexels.

What category should I put my sticker pack in?

Why, the Stickers category, of course! From there, you can choose a subcategory or two.

Can I use “stickers” and “iMessage” in my keywords?

Yep! There are some caveats though, as described in the iMessage App Submission guide.

Removing the Headphone Jack: Pros & Cons

I know, I know. This topic has been done to death. However, as we’re two days out from Apple’s “See you on the 7th” event, I thought it’d be fun to list my personal pros and cons of eliminating the headphone jack. 

Cons

  • Without a cable, baby will have one less thing to yank on while nursing. How will he occupy his hands? What will he coat with his drool?!
  • I won’t be able to practice identifying nautical knots several times a day after retrieving my earbuds from my pocket.
  • After I drop my phone in water for the 19th time, I won’t experience the simple joy of digging a single grain of rice out of the headphone jack.

Pros

  • I love remembering to charge things!
  • I’ll no longer be spoiling my ears with high quality audio. Take that, you pompous flaps of cartilage.
  • My phone will finally be thin enough to mince garlic on the go.
  • I love having to triple-check whether my headphones are paired so that sudden noise doesn’t wake Charlie. Aw, who am I kidding? I love it when he wakes up from his naps early!
  • Don’t tell anyone, but I dream of buying dongles. Especially when they’re $29.99. Especially when I’ll probably lose them.
  • Wireless stuff is so so so reliable always. And easy to use in old cars too.

Wow. After reviewing my pro and cons list, I’ve determined that I actually don’t care what happens to the headphone jack. If Apple thinks this will propel us into a perfect future filled with pure, unadulterated Slabs of Glass, then who are we to stand in the way? ?

On Stickers

As I seek to understand more about the popularity of stickers in messaging apps (hint: they’re more than just big emoji!), I thought I’d share some of the interesting articles I’ve come across.

Sticker Culture

  • Stickers: From Japanese craze to global mobile messaging phenomenon by Jon Russell (TNW)

    Despite success in Asia, it appears likely that the appeal of stickers is different in Western markets, where Romanic alphabets are better supported on smartphones and there is less of an emoji/cartoon culture.

  • Why is every messaging app under the sun trying to sell stickers to you? by Jon Russell (TNW)

    Stickers are a frictionless way to monetize a service. By that I mean that they do not immediately disrupt the user experience by serving adverts, forcing video plays or using other forced ‘interactions’ that might serve to draw revenue from sponsors. Stickers are not intrusive and can keep an app priced free.

  • The Elements of Stickers by Connie Chan (Andreessen Horowitz)

    The “trading” element, however, is less about statically collecting and more about dynamically custom-curating one’s personal collection of stickers. These collections also signal one’s “sticker street cred” in Asian messaging apps — you can always tell a newbie or non-tech savvy user by their use of the stock stickers only.

For Developers

For Users

Key Takeaways

  • Designers only need to submit @3x versions of stickers (max size: 618 x 618px, 500KB)
  • PNG files are preferred (even for animated stickers)
  • Pay attention to transparency because your stickers can overlap message bubbles and images in conversations 
  • If you are making stickers that feature a single character, name the sticker pack after the character (or “CharacterName & Friends”)
  • If you want to appeal to Asian users, a quick Google image search of the word “kawaii” wouldn’t hurt
  • Most sticker packs seem to have at least a dozen stickers

Even though I’m not the greatest artist, I’m hoping to have a sticker pack ready for September!

Voicemail Transcription in iOS 10 Beta

I don’t answer my phone much these days. It seems I’m always either holding my sleeping baby, dealing with some sort of unfortunate situation involving his clothes, or creeping around the house in ninja-like silence while he snoozes in his bassinet. There’s no room for noise in my life right now—not when my chances of getting a decent night’s sleep are on the line!

As such, one iOS 10 feature that I haven’t heard much about but that I’ve found very useful is voicemail transcription. For instance, I missed two calls from a friend today. Thanks to voicemail transcription, I found out that the first call was urgent: something had gone wrong in the online class that I helped him set up and he needed me to take a look at it.

The second call came just as Charlie was settling down for his all-important afternoon nap in my arms. This time, I saw that my friend just wanted to tell me a story and that I could call him back when I got a chance.

In both cases, glancing at the transcription was way more convenient than holding the phone to my ear and potentially waking Charlie, who I’m convinced could hear a butterfly flap its wings in Africa.

Another great thing about this feature is that it gives you the ability to provide quick and easy feedback on the quality of the transcription. Below the transcribed paragraph it says something like “How useful was this?” and you can select either “Useful” or “Not useful.” Dead simple, right? I’m sure that prompt will go away when the final version is released but for now I’m grateful for its existence.

It made me wish that Apple would add that same kind of feedback mechanism to all of its AI “suggestions,” even if only in the beta releases. Whether it be suggested apps, contacts, calendar items or locations, I should be given the opportunity to report on their usefulness/relevance. Otherwise, how does Apple get better at this? How do they know where they need to improve? Heck, how do they even know what they’re doing well?

Quick unobtrusive feedback prompts are a great “opt in” way of figuring out the answers to those questions.

Thoughts on Screen Time for Kids

In episode 176 of ATP, Casey, John and Marco discussed their thoughts on “screen time” for kids and whether or not parents should limit the amount of time their kids spend in front of screens of any kind. It caused me to reminisce about my own childhood as well as my [few] experiences with babies and screens, so I thought I’d share those memories here. (They might be kinda boring, so the tl;dr version is: I think screens are A-OK!)

A Childhood of Screens

You might know me as the stay-at-home mom who codes on the farm, but I actually grew up in Bristol, Connecticut. I have very fond memories of our house there; most of them involve me playing outside in our gigantic backyard: finding salamanders under rocks, riding around in my little motorized Jeep, trying to start fires with a magnifying glass…you know, kid stuff.

However, my mom worked a late shift so there was a period of time in the afternoon before my dad got home that I spent with a babysitter—a lovely, middle-aged French Canadian woman named Leona. “Ona” and I watched a LOT of television. I always joke that I learned how to spell by watching Wheel of Fortune. We watched the usual slew of early evening sitcoms (the one I remember most clearly is Roseanne) and I watched my favorite movie, Homeward Bound, at least a million times.

When I was 7, my family moved to Ohio and several things happened: 1) I started at a new school in the middle of second grade, 2) My parents bought me a TV for my room, and 3) I got a Super Nintendo. I had a hard time making friends in Ohio, so I spent lots of time playing Donkey Kong Country, pouring over Nintendo Power magazines, and watching TV. Every night I’d fall asleep watching Nick at Nite, through which I became familiar with many of the shows of my parents’ time: I Love Lucy, The Jeffersons, Mary Tyler Moore, All in the Family, BewitchedHappy Days, and more. In many ways, I think those shows helped me understand how adults related to one another, as well as develop a sense of humor and empathy.

Still, I spent plenty of time not looking at screens. Ohio used to be underwater once upon a time, and my parents and I would visit parks where you could dig for fossils of sea creatures. I also became interested in model trains, so we’d visit train museums and displays around the state.

Two years later, when I was 9, we moved to Nebraska. I spent hours on the family computer, playing with virtual pets, learning HTML, and discovering a vast world of pirated content. I’m pretty sure I played Pokémon on an emulator before my mom bought me my first Game Boy. Like many kids, I was so addicted to Pokémon that I’d sit in the back seat of the car after dark, struggling to play the game by the light of passing streetlights.

Let me tell ya, the late 80s/early 90s were a weird time to grow up because everything was changing so fast and nobody knew what they were doing. As a kid, I sort of straddled the divide between pre-Internet and always-connected—between one screen (the TV) and ubiquitous screens. Since computers and gaming systems were new, and cool, and fun, my parents didn’t think twice about letting me play with them. And now, after all those hours of unrestricted screen time, here I am: a relatively well-functioning human being.

Screens + Babies

Charlie's selfie

Charlie lined this shot up himself!

Charlie is three and a half months old now. He’s very interested in our phones and likes looking at himself via the front-facing camera. There’s a period of time during the day when he refuses to sleep, but is also too cranky/sleepy to play with anything. During that time, he sits on my husband’s lap and watches Fast and Loud, a show about restoring old cars. It’s all just a bunch of blurry blobs to him, yet he’s fascinated by the movement and the bright colors of the hot rods. When the episode is over, he’s usually ready to eat and finally take a nap.

There’s a little baby girl at our church that I watched a few times in the church nursery. She was too shy to interact with the other kids and so I just held her on my lap the whole time while she watched them play. Suddenly she noticed my Apple watch and was transfixed by the honeycomb screen. At a little over a year old, she figured out that if she moved her finger over the surface of the watch, the little app icons would move. That interaction paradigm of touching a screen is incredibly easy for babies to get the hang of. It opens up a world of learning to them that can serve as a good supplement to those all-important hands-on activities.

The Future

I’m not worried about managing screen time with Charlie. In the same way my generation remembers cassettes, record players, rotary phones, and finding the answers to our questions at the public library, our kids may remember smartphones and tablets and 5K displays. In other words, the children who grew up with nothing but screens may very well be the ones who lead us into a future without them (or with fewer of them).

Our kids may be the ones who bring augmented reality to the mainstream. They may laugh at the thought of us staring at our phones all day. They may very well straddle a new divide: between ubiquitous flat pieces of glass and…well, whatever’s next. Heck, in some ways, that screen time might be essential in helping them figure out what should be next.

Sherlocked?

Well my friends, WWDC has come and gone and I, like many of you, am now deeply engrossed in the plethora of new videos, sample projects, and API diffs that Apple has posted.

Whether you were actually there or experienced the fun from the comfort of your home, you may have noticed one fateful phrase wedged amongst the many words on the Developer APIs slide: “Live Photo Editing.” And if you didn’t see it there, you may have read about it on the “What’s New in Photos” pop-up in the iOS 10 beta:

What's New in Photos

Screenshot by Casey Liss

So yeah, with iOS 10 you can now rotate, crop, and otherwise adjust Live Photos right in the Photos app—which is awesome and just as it should be!

I hesitate to say that I was sherlocked (which, incidentally, keeps auto-correcting to “shellacked” ?). In order for an app to be sherlocked, I think there has to be some uncertainty involved. In other words, it wasn’t inevitable that Apple would build f.lux-like capabilities into iOS. Nor was it inevitable that Maps would gain the ability to locate your parked car, or that Photos would auto-generate compilations and call them Memories (there is an app by that name with similar functionality). However, I do believe it was inevitable that Apple would expand Live Photo-editing capabilities…the question was just “when?”

Now we know the answer.

And that’s OK. I learned so much building LiveRotate, and even sold a few copies! From its release on June 7 to today (June 28), LiveRotate was downloaded 304 times. A few people requested refunds, which was expected. I think the app can still provide value to the general public this summer, though when September rolls around I’ll likely remove it from sale.

Overall, I’m very happy with how well it sold, and am feeling more confident than ever about my ability to build apps!

LiveRotate stats

So what’s next for me? Well, I have two ideas for Messages apps: one sticker pack (depending on my drawing abilities) and one app that lets users build their own stickers. I’m also in the process of updating my Bible verse app for watchOS 3. After that, it’s back to Corgi Corral and then onward to some other app ideas that are floating around in my noggin (wow, does anyone use that word anymore?).

Best of luck to all of you with your summer projects! And for those tinkering with the idea of making an app: there’s no better time to get started! ?

The Making of LiveRotate

I thought it might benefit other beginners if I wrote up an overview of how I went about building LiveRotate. (Spoiler alert: there was a lot of Googling involved!)

Starting the Project

When I began, I didn’t have the foggiest idea how PhotoKit worked, and I had all but forgotten how to use collection views, which help you display things in a grid. So, I turned to Apple to see if they had a sample project for the Photos framework and luckily, they do. It has even been updated to “illustrate the use of LivePhoto APIs.” Right on! ?

I then translated almost the entire thing, line by line, into Swift. I’m not joking. I needed the code for the collection view, for displaying a Live Photo with a badge, and for caching thumbnails as you scroll, and that was honestly the bulk of the project (if anybody needs any of that code in Swift, just let me know!). As I translated the code, I learned what each piece did, so that I wouldn’t just be blindly copying things without building up my understanding.

Handling Rotation

Deciding how to rotate the photos was confusing at first because there are two ways you can do it. There are rotation flags that determine how a photo is displayed on a device (but that flag may not be respected by all programs/devices). Or, I could “physically” rotate the bits using some kind of transform. Option B seemed like the right way to go, so I set about learning two new frameworks: Core Graphics for the JPEG part of the Live Photo and AVFoundation for the Quicktime Movie part.

Rotating Photos

There are three types of image-related classes in iOS: UIImage, CGImage, and CIImage. For a beginner, that was SUPER CONFUSING (and still sort of is). Some more searching led me to a category for rotating CIImages by 90 degrees. The Swift equivalent of an Objective C category is an extension. So, I translated that code as follows:

Here’s an overview of the photo rotation steps:

  1. Request the photo data using PHAssetResourceManager
  2. Create a CIImage from the data and use the extension to rotate it
  3. Add appropriate metadata (more on this later), convert the resulting image to a JPEG and save it to a temporary location

Rotating Videos

Rotating the video portion of the Live Photo turned out to be much, much trickier. This Technical Q&A from Apple describes which methods actually rotate the buffers and which only set a rotation flag. In order to rotate the video, I needed to use an AVExportSession and apply a transform.

There are 4 orientations that a photo or video may be captured in. I made this convenience method to take the video’s original transform and return information about it.

Each of those 4 orientations could then be potentially rotated 3 different ways: 90 degrees, -90 degrees, and 180 degrees. When you rotate the video, you rotate it around its origin point, which can potentially move the video out of the frame. Therefore you have to apply a translation to get it back to where it’s supposed to be. Derek Lucas (@derekplucas) got me started by creating a Playground that rotated videos on the Mac. I took his translation values and had to tweak them, via trial and error, to get it to work on iOS. Here’s just a small sample of what that hot mess looks like:

Once rotated, I saved the video to a temporary file.

Live Photo Metadata

You can’t just throw any two photos and videos together and make a Live Photo without doing a little extra work. I found this project by genadyo on GitHub that shows what sort of metadata must be written into the photo and video files in order for them to be paired up correctly.

Basically, you have to do 5 things:

  1. Create an identifier of some kind, assign it to the key kFigAppleMakerNote_AssetIdentifier (which is “17”) in a new dictionary and set that dictionary as the kCGImagePropertyMakerAppleDictionary for your JPEG file.
  2. Create an AVMetaDataItem where the key is “com.apple.quicktime.content.identifier” and the value is the identifier you created in the first step.
  3. Create an AVMetaDataItem where the key is “com.apple.quicktime.still-image-time” and the value is 0. For some reason, this is required in order for iOS to recognize it as a true Live Photo.
  4. Use AVAssetWriter to re-save the video you made using AVExportSession, this time writing in the appropriate metadata. Of course, if you aren’t rotating the video, you could just use AVAssetWriter from start to finish.
  5. Save both the photo and the video to Photos like so (where “fileURLs” is an array containing the two temporary URLs for the photo and video):

Conclusion

I started LiveRotate on April 27 and finished it on June 6, so it took just a little over a month to make. I’ve had some good suggestions for improvements to the app and hope to implement those soon. For now, though, my brain can finally break free from “obsessive coding” mode and focus on important things like catching up on household chores and cooking some real food! ?
Edit: 4:35 pm CDT

I forgot to add that I created the app’s icon in Photoshop CS6, and translated it into German, Spanish, Italian and Russian via a hilarious process of changing my phone’s language, opening up apps that had the words/phrases I needed, and screenshotting them. I know—I’m a dang thief!

LiveRotate

This post could’ve easily been titled “I made an app with a two month old baby glued to me, AMA.” Of course, if it weren’t for Charlie, I wouldn’t have gotten the idea for the app in the first place! ?

It started with a giraffe.

At the ripe old age of two months, Charlie enjoys things like smiling, staring at ceiling fans, getting his outfit changed (that one seems unusual), and of course, conversing with stuffed animals. By “conversing” I mean “looking intently, grinning, and occasionally yelling at.” One day I snapped a bunch of pics him speaking with his giraffe pal and this happened:

 Pics of Charlie and giraffe pal incorrectly rotated
Whoops. I wasn’t paying attention and was tilting my phone in such a way that it thought I was holding it in portrait rather than landscape. When you attempt to edit a Live Photo beyond simply auto-correcting it, you get this message:

Editing will turn off Live Photo

At this point, I was kinda sad because the Live Photos were cute but weren’t captured as I intended. A few days later, I decided to do something about it.

Programming is fun!

I really enjoy writing code, especially when it requires me to learn a lot of new things. However, while I’m still really excited to finish my game, Corgi Corral, it’s officially on hold for two reasons:

  1. I don’t have the creative energy for it. Taking care of a baby who doesn’t sleep through the night has sapped me of the mental resources I need to make stuff like art and music. Someday!
  2. I’m interested to see what changes to GameplayKit and SpriteKit Apple will show off at WWDC. Maybe I’ll get some new ideas or will be able to improve my code in some way.

Even though I’m taking a break from Corgi Corral, I still have that itch to make something. So, I decided to dive head first into the Photos framework and create an app that rotates Live Photos.

It actually took me several weeks to get something working due to my lack of experience with both Core Image and AVFoundation (not to mention the fussy way that Live Photos are constructed). I’ll write more about the process of building the app in another post, but needless to say there were many headaches involved!

However, I still had a blast doing it. For the first time ever, I truly feel like a real app developer. Sure, my Bible verse app was fun to make, but there are a zillion Bible verse apps on the App Store. I haven’t found an app yet that can rotate Live Photos. Maybe one exists, maybe not, but I finally feel like I was able to identify a unique problem and build my own solution. It’s a powerful feeling!

Shipping things is fun!

Charlie & his giraffe

Confession: I love filling in all the blanks in iTunes Connect. The screenshots, the app preview video, the description…there’s something really satisfying about seeing my app’s profile come together. I even had fun making the screenshots, using David Verwer’s SimulatorStatusMagic to ensure the status bars looked nice and clean.

I don’t really know if there’s a market for this app. I mostly built it for myself, so I could enjoy my pictures of Charlie. Having it on the App Store is just the cherry on top. ? Still, it sure is fun to ship something—to be able to point to something and say “I made that.”

LiveRotate icon

The app is called LiveRotate (I decided to adopt _David Smith’s straightforward approach to naming apps) and it costs $0.99. Any money I happen to make will go towards purchasing the new MacBook Pro I’ve been dreaming of for the past two years!

First Apps Roundup [Updated June 3, 2016]

Last week I challenged iOS developers to share anecdotes and screenshots of their first apps and was delighted when a few people responded. These are exactly the kind of responses I was looking for!

Marius Constantinescu:

My first contact with iOS development was during my BSc. studies. We were a bunch of students and a passionate teaching assistant, and we were learning iOS development on our own, outside of the university curriculum, following Paul Hegarty’s Stanford CS193P course on iTunes U.

I think it’s really cool that Marius and his fellow students taught themselves by following along with the Stanford course. I also love the screenshot from his first (albeit unreleased) iOS game!

Rob Poulter:

Development is easy. We know (or quickly learn) the constraints of the development environment and platform, and the rest is about research and experimentation. Not having done a lot with UIKit before, learning the API was the most challenging part of this. I wish I’d tracked just how much time I spent on StackOverflow vs XCode.

I also wish I’d timed my Stack Overflow visits. I’m sure it’s been at least a couple of days.

Alistair Phillips:

After reading Becky Hansmeyer’s post I decided to dig up some screenshots of the first version of My Opal to see just how far things have come. My Opal was released not long after iOS 7 arrived so I started off with the clean/sparse look but about 8 months later it gained a little more personality.

The screenshots Alistair posted are downright inspiring.

I’ll continue to update this post if more people respond!

Update: April 18th, 4:00 p.m. CST

Curtis Herbert:

One conversation I keenly remember having with my partner on this venture was about the app’s worth. After nights and weekends spread out over a few months we had 1.0 in review for the store. We were talking next steps over lunch and he brought up his idea to approach the big-wigs in the server monitoring space about selling the app to them. For “easily $50,000+” as it existed today, he asserted.

I love that little anecdote! In a nutshell: app pricing is hard, man. As such, Curtis notes how important it is to have a marketing plan and to manage your expectations.

Isis sold 6 copies over its lifetime. I’m pretty sure one of those was my mom, trying to encourage me.

This made me laugh. I’m pretty sure the only people who bought my first app (a Bible verse app for Apple Watch) at $0.99 were my friends and family as well, probably out of pity. ? Once I lowered it to free, the downloads picked up considerably! Anyway, go read Curtis’s post because he included some nice old school iOS screenshots as well as reflections on his code organization and implementation.

Update: April 20th, 5:10 p.m. CDT

Yono Mittlefehldt:

In March 2010, I scrapped everything and rewrote the entire app from scratch. Even I, a novice iPhoneOS programmer, could see how bad it was. And it was really bad. Since it was just a side project and not a business, I had the luxury to do so. And I learned a ton in the process.
Then, in April 2010, I rewrote the entire app. Again. Seriously. It was still terrible.

Another awesome “first app” post! I’m starting to understand more and more than in order to make something great, you have to first be willing to make something terrible. And then figure out why it’s terrible, and try again. Lather, rinse, repeat. This is so hard for picky people like me, who want everything to be perfect the first time! Random, but: Yono’s post also makes me want to learn Hebrew. He’s got a cool language learning app for kids called Gus on the Go, which I plan on introducing to Charlie when he’s old enough!

Update: June 3rd, 9:15 a.m. CDT

Cesare Rocchi:

Beginning of May 2014. I get out of the hospital after a sleepless night. A few hours before my daughter was born. Happiness and concern both having a party somewhere in my body. I stood up and took a walk to think a bit. I made the error of checking my email. As I skim I end up on App.net State of Union. Bottom line: I spent my spare time building on an API that was going to slowly die. The first reaction was cursing. The second was realizing the crazy twist of fate: I was experiencing the joy of birth and the sorrow of death at the same time.

Cesare recounts the story behind what would have been his fourth app—a slick-looking App.net client—if it had ever been released. He encourages new developers to experiment with new APIs but also to be cautious with them and give them time to mature.