On coding, tech, privacy, AI and whatever else comes to this mind.

  • Always concerning when you google a crash and get zero results. Let’s make this a 1: If you hit an exception in [NSURL URLByAppendingPathExtension:] coming from [UIDocument saveToURL:forSaveOperation:completionHandler:], double check that you’re exporting or importing the UTI of the file you’re saving.

  • Tech Note: Using CoreData in a SPM executable
  • Updated my “Carthage and Catalyst” post from last year with further instructions to get it working on Xcode 12. Shame that this is still such a pain with Carthage. (Works so well with SPM.)

  • Black Friday/Cyber Monday sale of Longplay – it’s $1.99 until the end of November.

  • Tech giants and Nintendo

    In one short link post John Gruber indirectly makes an excellent case for breaking up tech giants:

    Really good quarter for Nintendo — converting yen to USD, about $4 billion in revenue, $1.4 billion in profit. That’s great for them, but peanuts by U.S. tech giant standards. Fascinating how outsized Nintendo’s influence is on both the gaming industry and pop culture at large compared to their financial size.

    Yuo can flip the last sentence the other way around: Isn’t Nintendo’s success, influence and financial success a great indicator that this is an excellent size for a tech company? What similar heart-warming tech companies didn’t make it this far because they got crushed by the giants?

  • The essence of an app

    Horace Dediu has a way of putting things into an insightful perspective that makes you look at things differently. In the latest Critical Path episode, he points out that what people enjoyed about the iPod (and the Walkman before) wasn’t just that it let’s you take your music with you, but that it gives you privacy in a public space. Similarly, the product of a gym is not just exercise, but delivering a feeling of guilt. It’s a way of looking at a thing beyond it’s features and immediate use case.

    Look at the current success of Widgetsmith. Apple touted widgets as a way to get glanceable information on your home screen, but that’s not why they took off - they took off because to many people their phone’s home screen is their virtual home and letting them decorate it their way means something to them.

    On a much smaller scale, when I released my album-focussed music player Longplay, I received a good amount of feedback and praise. Interestingly, a theme emerged after a while from people expressing that they love the app not because of any specific features but because it let’s them reconnect with their album library in a way that reminded them of their old vinyl or CD collections. It’s a wall of their favourite albums that has been with them for many years or decades. It’s something personal.

    While I developed and used the app myself, I had a vague sense of that, but soaking in that feedback from users and getting those different perspectives, revealed the the “heart” or the “essence” of the app. That in turn helps digest and prioritise other feedback, suggestions and wishes. When you have an understanding of what that essence of your app is, it becomes much clearer what to say “no” and what to say “hell yeah” to.

    What I’m taking away from this is that it’s important to look beyond the features, and try to get a feeling of what’s underneath and what’s the defining principle. It’s hard to find that yourself and you might need quite a bit of user feedback to get to that. But if you find it, it can be inherently rewarding, and might reveal aspects of directions to take your app that you did not consider before.

  • I updated the Longplay page to reflect the latest updates, including Home Screen widgets for iOS 14, and added a couple testimonials1. Really appreciate all the kind words and it’s great to hear from the people who love the app.

    1. That took longer than I thought as I’m rather rusty on my CSS, but these tutorials helped. Flexslider is nice. 

  • It’s launch day, and I’m both super-thrilled and humbled by the congratulations, thanks, feedback and screenshots that I have received so far. Couldn’t be happier. I especially love seeing screenshots from everyone’s music collection!

  • Introducing Longplay

    Longplay, my first self-published iOS app, is now available on the App Store. I’m super excited.

    What it is

    Longplay is a music player for anyone who enjoy listening to entire albums start-to-finish. It digs through your Apple Music or iTunes library 1 – that might have grown over the years or decades and is full of a mix of individual songs, partial albums, complete albums and playlists – to identify just those complete albums and gives you quick access to play them.

    It provides a beautiful view of all your album artwork, and let’s you explore your albums (or playlists) by various sort options. A unique one is Negligence which combines how highly you’ve ranked an album and when you last listened it, to let you rediscover forgotten favourites. Brightness sorts the albums by their primary colour for an interesting visual take on your albums collection.

    You can hide albums or playlists that you don’t want to show up - useful for meditation or kids albums, or smart playlists that you use for doing house keeping.

    For users who want to listen on specific AirPlay devices, such as multi-room audio systems or headphones, there’s a “Play on” feature that’s the quickest way to listen on the right device.

    It’s fully VoiceOver accessible, too. It works well on iPhone and iPad – including splitscreen support and a delightful cursor effect.

    If that sounds intriguing to you, head over to the App Store. It’s USD 2.99, EUR 3.49, AUD 4.49, or equivalent in your currency.

    Quick access to AirPlay & headphone selection

    Pointer effects on iPad

    The long road to Longplay

    I started building the app under the name Albums back in mid 2015 for iOS 8.3 to experiment with the nascent Swift programming language and to scratch my own itch of being frustrated with finding my complete albums in the iOS Music app. I had a smart playlist for it in iTunes on my Mac, but that didn’t translate to iOS. A short while later I came up with the name Longplay to give it some more character and made a first attempt to get the app onto the App Store. However, due to the screenshots all using artworks of my music album, that was a no-go and I didn’t pursue that avenue further, though I did keep using the app myself since then.

    In 2016 I started using Spotify and added the capability to Longplay to work both with an iTunes music library. While I got that working, I also encounteered a bunch of headaches with the closed-source Spotify SDK. Those meant I kept using the app just byself and had a couple of friends using it, but a public release would have meant addressing all those Spotify edge cases - not great for a side project.

    End of 2017 I did a minor update to Longplay to accommodate the latest Swift language features such as Codable.

    2018 and 2019 went by with me using the app using a lot but no code changes. During that time I started using a Sonos system at home and listening to my music on that. When AirPlay 2 came out and Sonos supported it but Spotify didn’t, I switched away again from Spotify to Apple Music.

    Early 2020 I decided that now that I’m not using Spotify myself anymore, I could release Longplay without the (headaches of the) Spotify integration. So I spent quite some time modernising the code base, squashing bugs, polishing and the app, and prepared for the public release.

    Getting the app itself ready for release was quite some work2. And then there was the challenge of getting it approved for an App Store release which went through several rejections and took one-and-a-half months. Alas, here we are! I’m really thankful for all the support, testing and feedback from my family and friends during development, the friendly folks over at the CoreInt Slack for emotional support and helping me collect the necessary fake and openly licensed artwork, and all my beta testers for their feedback.

    Developing Longplay is a blast – working on a music player is something special for me. I love listening to music. It always lifts my mood – in particular when I’m not aware that I needed to have my mood lifted. And whenever I work on Longplay I just have to listen to all my favourite music.

    What is next

    I’m curious how the app will be received, and I very much I look forward to keep supporting the app now that it’s out in the wild!

    A 1.0.1 update is imminent which aligns the play/pause button logic to mimick the Music app, and also adds to the contextual preview some information on the sorting: “Addiction” will show you how many times you’ve listened to an album, “Recency” will show when you added it to your library, and “Stars” will show your average rating for the songs on that album.

    For the upcoming iOS 14 release, I’m exploring a home screen widget to show the top albums/playlists by a sort order of your choice.

    Update: All these and more have been added and released in the mean-time, see here.

    There’s some more info on the app on its dedicated page and in the Press Kit. Any questions, ping me on micro.blog, by tweet or by mail. And, of course, I’d be thrilled if you get the app and I hope you’ll enjoy it.

    1. No, Spotify is not supported. Read on for more. 

    2. A few notable things from going through the git log: I switched from CocoaPods to Swift Package Manager and use diffable data sources, removed Spotify, made the settings discoverable and added VoiceOver support for accessing them, added contextual actions including quick access to AirPlay controls, added haptics, fixed a whole tons of smaller bugs and performance issues, indicate status of calculating the per-album brightness information, and added the little thank you screen. 

  • Very impressed with Apple’s free and online-only WWDC this year. The 1-on-1 labs are fantastic! The session videos are to the point and with direct access to the code samples. Hope WWDC will remain online-first from now on.

subscribe via RSS or via JSON