Archive for January 20, 2020

Monday, January 20, 2020

Creating Root-level Directories and Symbolic Links in Catalina

Rich Trouton:

The use of firmlinks is exclusively reserved for the OS’s own use, but Apple has also made available what are called synthetic firmlinks. These synthetic firmlinks are how the OS enables folks to create directories and symbolic links on the read-only boot volume.


Whomever designed this came down on the “tabs” side of the “tabs vs. spaces” debate. When creating the separation between installers and Users/Shared/installers in the /etc/synthetic.conf file, you need to use tabs. If you use spaces instead, the synthetic firmlink won’t be created.


For more information, please see the synthetic.conf man page.


Farewell, Carcassonne

The Coding Monkeys (tweet):

With a heavy heart we have to announce that our rendition of Carcassonne will no longer be available for purchase as of March 1st 2020. Our contract with the Company behind Carcassonne, Hans im Glück, has come to an end. Shortly after that, the interpretation by Asmodee will be available for purchase for Mac and iPhone/iPad, so your Carcassonne needs will be catered for in the future.


This has been an amazing ride for us. Our online service catered for over 2 Million active devices at peak times. You finished over 8.5 Million games, and on average there are around 3.500 games up and running at any point in time. We launched on non-retina iPhones, and expanded and supported over 20 models of iPhone and 19 models of iPads. From iPhone OS 3 up to iOS 13 today. We proudly have a service uptime of over 99,999% during that decade, thanks to our erlang-based technology.


Update (2020-02-18): The Coding Monkeys (tweet):

Instead of just putting our head in the sand we decided that we will do one last Update to put as much life into our rendition as we can. And here it is, with 2 weeks left on sale, Carcassonne 4.40. It might not look like much, but making Carcassonne finally™ adjust fully to the extended screen estate of the newer iPads was quite a bit of (scary) work.

Profiling Mac Unit Tests

Ilja A. Iwas:

Mac Devs: Is it just me, or is the “Profile ‘Test XYZ’” command in Xcode 11.3 broken? Instruments launches the main app, but does not run any tests. 🤷‍♂️

He’s filed bug FB7543911.

There was a brief period of time where running tests under Instruments worked for me, and it was glorious. Then the handy “Profile [test]” command stopped working—Instruments would launch but not record anything from the test. I reverted to the old method of setting a breakpoint and manually attaching Instruments to the test process while it was paused. Lately, that no longer works for me, either.

Mostly, I use Instruments to track down memory leaks. An alternative tool is the Memory Graph Debugger, which works within Xcode itself and never seems to have trouble attaching/recording.

Rejected for Working Around macOS Bugs

Daniel Jalkut:

It’s a dramatic day for @MarsEdit and compatiblity, as App Review has suddenly become more interested in private WebKit SPI. I patch WebHTMLView to work around serious bugs which I have filed. One of them is a crasher. I don’t think WebKit1 is the best focus for App Review?

A truly unfortunate situation to be in as a developer. Apple will likely never fix the bugs, as WebView is now deprecated. Its replacement, WKWebView, is not fully ready yet, and will require a complete rewrite in a different language to get the same functionality, if that’s even possible.

Daniel Jalkut:

Spending my whole weekend, apart from celebrating the delightful birthday of my little baby 8yo, working around issues that App Store review put on my plate. The price I pay for playing this game, I know. I just wish the game were a little different.


Overall I am pretty chill about App Store review and the goals of bringing developers into line. I do think it would be massively improved by a graduated system of warning of future rejection while allowing immediate fixes to pass through.

As a Mac App Store developer whose apps have been in the store since the beginning, it’s not a great feeling to know that any critical update might be held up because Apple decided to get more uptight about something that was OK for the past 8 years.

Daniel Jalkut:

Generally I would say the thing for other developers to look out for is Apple may be improving its ability to detect things like patches as opposed to outright “use” of private API, and they may also be getting less forgiving of some behaviors, even if in the name of better UX.

This is the thanks you get for filing Radars and putting up with bugs for all those years.

It’s not exactly altering the deal because the Mac App Store has always banned private API. As was said at the outset, this is not realistic. There will always be (different) OS bugs. Even in the best case, they will take time to fix. Nobody—not customers, developers, nor Apple—wants apps to exhibit bugs, but that’s the inevitable result of a policy that forbids patching to work around buggy API.

When the Mac App Store debuted with this policy, some people said it would force Apple to fix the bugs faster. I don’t think that’s happened. Rather, developers kept doing what they were doing—I bet most large or popular apps are using private API to work around bugs—and Apple either failed to detect this or chose to look the other way.

Now, the rules haven’t changed, but perhaps enforcement has. This is a problem both because of increased user-visible bugs and fairness. Some apps like MarsEdit will eat up development time to end up with something buggier than they started with. Other apps will get a different reviewer and slide right through. Apps that Apple deems sufficiently important will be exempt from the rule.

With out-of-process Web views, increasing use of Swift, and direct Objective-C properties, patching will be more difficult. This will level the playing field—but to the lowest common denominator.

Daniel Jalkut:

My compromise build was approved by Apple this afternoon. I found another way around one of the bugs I was fixing, but have no fix for the other one, yet. It’s a fairly minor thing, but the Mac App Store version is now buggier than it was, thanks to App Review.


Update (2020-01-20): Jeff Johnson:

Apple currently lets Catalyst apps use private API as workarounds, but at some unpredictable time they’ll get rejected for it.

Update (2020-01-24): Jesse Squires:

Anyone who's worked at any big company knows Apple lets private API use slide.

IG and FB both used private iOS APIs. Appple knew and always approved. Big Apps™ are too important to reject.