Underpass is back (though it never left)

March 30 2020 by Jeff Johnson

At long last, Underpass version 1.2.0 is now available in the Mac App Store and iOS App Store. Underpass for Mac was last updated in January 2019, and Underpass for iOS in December 2018. If you're not familiar, Underpass is a peer-to-peer file transfer and chat app with end-to-end encryption for complete privacy and security. Underpass is unlike any other chat app because it doesn't use a third-party service. The app is both a server and a client, so any two instances of the app running on a Mac or iOS device can make a direct network connection to each other, either on the internet or on a LAN, including ad hoc peer-to-peer wifi networks! You can use Underpass to exchange files and text between your own Apple devices or with another Underpass user.

If you use AirDrop or Universal Clipboard to transfer between your Apple devices, but you find these technologies unreliable, please try Underpass instead! Underpass is rock solid at networking, and it doesn't require iCloud or Bluetooth.

The big update today is Underpass for iOS. It now supports dark mode on iOS 13. It also adapts its user interface to iPhones without a home button; in other words, with a notch! And it fixes the file preview feature on iOS 13. You can preview a received file in Underpass by touching it in the messages list. Technically speaking, there's a bug in iOS 13 where the UITextViewDelegate never receives UITextItemInteractionInvokeDefaultAction. In truth, I've been waiting to update Underpass until Apple fixed this bug, but unfortunately it still exists in iOS 13.4, and it seems increasingly unlikely that Apple will ever fix the bug in any version of iOS 13, so I was forced to work around the bug in Underpass 1.2.0. Now you can preview files again!

Underpass for Mac is a relatively minor update. It enables the find bar in the received messages list, and it adds a keyboard shortcut ⌘0 to open the Saved Chats window. It also works around a bizarre Mac App Store receipt validation bug that can occur that can occur while using AirPlay 2 over ethernet with certain Mac models, though I've never actually received any reports of this bug from Underpass users (and now I never will).

The good news is the app updates. The bad news is that Underpass for Mac and Underpass for iOS must still be purchased separately. When you purchase Underpass in the Mac App Store you can run it on any and all of your Macs, and when you purchase Underpass in the iOS App Store you can run it on any and all of your iOS devices (iPhone, iPad, iPod touch). But if you want to run Underpass on both your Macs and your iOS devices, you have to purchase both versions. However, the Underpass network protocol is cross-platform: if you own Underpass for Mac, and another person owns Underpass for iOS, the two of you can communicate via Underpass.

A week ago, Apple announced that Universal Purchase was now available, which allows a single purchase for Mac and iOS versions of an app. This announcement received a lot of fanfare in the media and raised the hopes of customers, but when I looked at the implementation and practical details, they were very disappointing. It appears that the purpose of Universal Purchase was to encourage developers who didn't yet have a Mac version of their app to produce one (also the purpose of the Catalyst technology in Catalina). But for developers and customers of apps that already had both Mac and iOS versions, Universal Purchase is an incredibly bad deal. It feels like a betrayal from Apple, because developers who have been "loyal" and did the "right thing" from the beginning, who made native AppKit and UIKit apps, are punished, while developers who never bothered to make a Mac app are rewarded. Here's a section from Apple's developer documentation on Universal Purchase:

Multiple App Records. If your app is currently available on multiple platforms through separate app records, please note that app records can’t be merged. To offer universal purchase, remove all but one version from sale and add the other versions to the remaining app’s record. Once an app is removed from sale, its original product page on the App Store becomes unavailable and you are no longer able to provide updates to existing users. Ratings and reviews are not transferred to the new product page.

Thus, if you currently offer versions of your app in both the Mac App Store and the iOS App Store, as I do with Underpass, you have to permanently discontinue one of those versions. Then you create a new version of the app which is added to the surviving version for Universal Purchase. Suppose, hypothetically, that I discontinued the current Underpass for iOS and created a new version of Underpass for iOS attached to the Underpass for Mac App Store record. That might be fine with customers if they had purchased Underpass for Mac, though if they had also purchased Underpass for iOS, they'd have to delete it and download the new version in order to receive further updates, which is confusing and annoying. On the other hand, if a customer had only purchased Underpass for iOS, but not Underpass for Mac, then they'd be screwed. Their current app would be discontinued, with no further updates, and they wouldn't receive the new version automatically, because they never paid for the Mac version. Some developers will go through with this rotten procedure anyway, but I refuse on principle. Especially since I wouldn't be able to ship bug fixes to customers who purchased the now (hypothetically) discontinued version. As a small indie developer, the only asset I have is customer trust, and I don't want to do anything to betray that trust.

Initially, I thought that selling an app bundle including Underpass for Mac and iOS was a possible alternative to Universal Purchase, but it turns out to be impossible at this time. Apple's documentation is vague about the prospect:

Apps, including those that are part of a universal purchase, can be offered as an app bundle on the App Store. App bundles provide an easy way for customers to download up to 10 of your apps together. Apps that are part of a universal purchase still count as just one app in the bundle. Each app bundle includes its own product page with the opportunity to provide a unique icon, name, and description.

App Store Connect allows you to create a new app bundle that includes both Mac and iOS apps. But it's misleading, because App Store Connect won't let you save the bundle. When you try you get an error: "The apps in this bundle must match the bundle type and be available on the same devices." Thus it's clear that you can't make a bundle containing a Mac-only app and an iOS-only app. You can, however, include a Universal Purchase app in a bundle along with an app that's not a Universal Purchase. This is allowed because a Universal Purchase app has both Mac and iOS versions, so it is available on the same devices as the other app, regardless of whether the other app is for Mac or iOS. My guess is that an app bundle is only offered on stores where every app in the bundle is available. In other words, if there is a Mac-only app in the bundle, then the bundle would only be offered in the Mac App Store, not in the iOS App Store, even if another app in the bundle is a Universal Purchase. This is just a guess though, which I haven't yet confirmed. What I have confirmed is that I cannot offer an app bundle with Underpass for Mac and Underpass for iOS, so I still have to sell each version separately.

Jeff Johnson (My apps, PayPal.Me)