Friday, June 2, 2023

WWDC 2023 Preview

Hartley Charlton:

Apple is overtly teasing the start of “a new era” and the ability to “code new worlds” at WWDC this year, building anticipation around the widely expected announcement of its mixed-reality headset.

Apple:

Activities are now open for sign-up for eligible developers. Designed to connect you with the developer community and Apple experts, they’ll feature Q&As, Meet the Presenters, and community icebreakers in online group chats.

Paul Hudson:

There are lots of events happening in and around Cupertino, along with other events happening around the world. Most in-person events require tickets, and are likely to sell out quickly.

Jordan Morgan:

Our favorite conference is here, which means that the ninth annual edition of the Swiftjective-C W.W.D.C. Pregame Quiz is ready to go!

MartianCraft:

Below, we share some of our talented staff’s thoughts about and predictions for WWDC and the transformative impact the forthcoming announcements might have on the industry.

Marco Arment:

Great things to do THIS week instead of next:

  • Prepare test devices with a test Apple ID to run the betas
  • Decide which devices will stay on iOS 16/watchOS 9/etc. (keeping in mind that Watches cannot downgrade!)
  • Start wearing your test watch to collect health data if applicable (thx @_Davidsmith)
  • Create a new version of your app in App Store Connect, and get its first build through TestFlight approval, so you can quickly issue another build next week if beta 1 breaks your app

Stephen Hackett:

Here are the rest of my picks on the show[…]

David Price:

Just like last year’s iPhone event, by an amazing coincidence, we’ve again stumbled across Tim Cook’s video script for Monday morning’s keynote presentation and of course, we’re going to share it all with you.

There are also a variety of books on sale, from:

See also: Who’s Going to WWDC23?.

Previously:

A Vision for Using C++ From Swift

John McCall:

I’m pleased to announce that the Language Steering Group has accepted a vision document entitled Using C++ from Swift.

[…]

It is a companion to the previously-accepted vision document Using Swift from C++; together these two visions lay out a technical vision for how Swift can interoperate with C++.

Using C++ from Swift:

Swift’s memory safety is a major feature of its design, and C++’s lack of safety is a major defect. If C++’s unsafety is fully inherited when using C++ APIs from Swift, interoperability will have made Swift a worse language, and it will have undermined one of the reasons to migrate to Swift in the first place. But Swift must also make C++ APIs feel natural to use and fit into Swift’s strong language idioms. Often these goals coincide, because the better Swift understands how a C++ API is meant to be used, the more unsafety and boilerplate it can eliminate from use sites. If the Swift compiler does not understand how to import an API safely or idiomatically, it should decline to import it, requesting more information from the user (likely through the use of annotations) so that the API can be imported in a way that meets Swift’s standards.

[…]

Swift should recognize common C++ patterns like ranges (pairs of iterators) and containers and map them into Swift Collections, making them automatically work with Swift’s library of safe and idiomatic collections algorithms. For example, Swift code should be able to filter and map the contents of a std::vector[…]

[…]

There are three common patterns for managing reference object lifetimes in C++. Swift should endeavor to support all three of them[…]

[…]

Swift will need to decide how to handle projections, and more generally the use of view types, that it doesn’t recognize how to make safe. This may come with difficult trade-offs between usefulness and safety.

[…]

Generic code in Swift will not be able to use C++ templates generically without substantial new language features and a lot of implementation work. Allowing C++ templates to be used on concrete Swift types is theoretically more feasible but still a major project because of the ad hoc nature of type constraints in templates. If this feature is ever pursued, it will likely require substantial user guidance through annotations or wrappers around imported APIs.

Using Swift from C++:

For “reverse” interoperability, Swift generates a header that uses C++ language constructs to represent Swift APIs that are exposed by the Swift module. Because of the relatively high expressivity of C++ headers, the generated header is able to provide representation for most native Swift functions, methods, initializers, accessors and types without needing any extra code to be generated in the Swift module. This allows C++ programmers to call into Swift APIs using the familiar C++ function and member function call syntax.

[…]

Swift chose to require programs to opt in to Objective-C interoperability with the @objc attribute, both to make export more predictable and to avoid emitting extra code and metadata for all classes. In contrast, as long as the C++ compiler supports the Swift calling convention, a C++ header can call native Swift functions directly, and the C++ type system can be used to wrap most Swift types in a safe C++ representation. Because of this, there is no reason to require Swift module authors to opt in into C++ interoperability. Instead, any Swift module that can be imported into Swift can also be imported into C++, and most APIs will come across automatically.

Some API authors will desire explicit control over the C++ API. Swift will provide an annotation such as the proposed @expose attribute to allow precise control over which APIs get exposed to C++.

[…]

The existing Swift to Objective-C bridging layer should still be supported even when C++ bindings are generated in the generated header. Furthermore, the generated C++ bindings should use appropriate Objective-C++ types or constructs in the generated C++ declarations where it makes sense to do so. For instance, a Swift function that returns an Objective-C class instance should be usable from an Objective-C++ compilation unit.

Previously:

Xcode 14.3.1

Apple:

The Xcode 14.3.1 release supports on-device debugging in iOS 11 and later, tvOS 11 and later, and watchOS 4 and later. Xcode 14.3.1 requires a Mac running macOS Ventura 13.0 or later.

[…]

Fixed: When targeting devices running iOS 13, apps built with Xcode 14.3 and using Objective-C protocols from Swift, sometimes crash at launch.

[…]

Fixed: Applications using Swift Concurrency could crash when run on a specific OS version

Xcode 14.3 was a buggy release. It’s not clear what’s changed in Xcode 14.3.1 since the unusual second release candidate, but judging from the sparse release notes most of the issues are still outstanding. Testing is still broken for me.

Previously:

watchOS 9.5.1

Juli Clover:

Apple today released watchOS 9.5.1, a minor bug fix update designed for the Apple Watch.

[…]

According to Apple’s release notes for the update, it includes “improvements and bug fixes” for the Apple Watch, with no details on which bugs have been addressed.

Curiously, it’s not listed on the About watchOS 9 Updates page, and the security updates page says only that “the update has no published CVE entries.”

watchOS 9.5 came out at the same time as iOS 16.5 and macOS 13.4, and there have been no corresponding 0.0.1 updates for those operating systems.

Previously:

Thursday, June 1, 2023

WWDC 2023 Wish Lists

Krishna Sadasivam:

Let’s be clear: what I really and truly wish for the next iteration of macOS is a new found-focus on stability, polish and bug fixes.

Mario Guzman:

The next macOS should be a “Snow Leopard” kind of release.

Nick Heer:

As Apple’s operating system line has grown from one to at least five — more if you count the HomePod’s audioOS and BridgeOS for Macs with T-series chips — the limitations of scale have begun to show. New versions of iPadOS oscillate between key feature updates to fundamental parts of the system, like multitasking, one year, and tepid improvements the next. iOS is a mature platform and, so, it makes sense for there to be fewer core feature updates, but one wishes the slower development cycle would bring increased stability and refinement; actual results have been mixed. MacOS is the system which feels like it ought to be the closest to some imagined finish line, but it also seems like it is decaying in its most core qualities — I am having problems with windows losing foregrounding or not becoming focused when they should. Also, why are Notifications still like that?

Daniel Andrews:

A general theme on speed and reliability at the OS and app level. Especially Mail and Music.

[…]

Extensions for 3rd party browsers.

Dan Moren:

For example, one addition I’d really like to see is improvements to iOS’s autocorrect system.

[…]

Other small improvements that would be nice to have could include breaking the Passwords section of Settings out into its own app, tweaking the way multiple calendars appear in the Calendar app, and allowing more widgets on the lock screen, just to name a few.

[…]

One big nice to have feature I’d like to see in macOS 14 is letting widgets live outside of their little column in Notification Center.

Jack Brewster:

My iOS 17 feature request is for Safari extensions to work in embedded views.

Francisco Tolmasky:

All I want out of macOS 14 is for a screenshot naming scheme that results in them being in chronological order when they are sorted alphabetically.

Kelly Guimont:

Here’s my dream for WWDC23:

In macOS 14, when you open a new Mail draft, if you close it within 5 seconds you will not be prompted to save that unaddressed, empty, clearly accidental draft.

Christian Beer:

  • Xcode only shows actual, current errors
  • Xcode shows errors where they happened
  • Xcode doesn’t run an old version of an app if there were build errors
  • Xcode doesn’t come up with some strange error if I forgot a „?“

Miguel Arroz:

Xcode can actually attach the debugger to the test runner app reliably.

Guilherme Rambo:

  • When a build fails, actually show me the build errors, every time, without me having to attempt the build again or restart Xcode
  • When a build error/warning is corrected, stop showing it, instead of leaving it on the list, sometimes for days, unless I do a full derived data delete and restart

Juri Pakaste:

WWDC 23 wish: fast, reliable UI tests.

This message brought to you by Failed to launch app with identifier and Failed to terminate.

My top Xcode issues are showing incorrect errors, compiler crashes, tests failing to run, and tests not running in Instruments.

Jack Brewster:

If the only new feature in the next macOS is that they’d quit hiding controls (like the button on Reminders notifications), I’d be pretty dang happy.

Jesse Squires :

If the only bug fix in macOS 14 is the server icon in the Finder sidebar, I will be happy.

I really shouldn't be so bothered by this. But goddamn. It annoys the hell out of me every. single. time.

Pierre Igot:

For the record, it’s not just the server icon in the sidebar. It’s also the server icon on the desktop and in Finder windows. And it’s network folder icons too. In other words, it’s even more annoying than what Jesse says. But of course it’s intermittent, so Apple’s software engineers cannot be bothered to make the effort to reproduce and fix.

Simon B. Støvring:

Me if iOS 17 does not let me replace the flashlight and camera buttons on the Lock Screen with buttons that run any shortcut.

Mysk:

The top feature on our iOS wishlist remains: “Allow app access to location for 10 minutes”

Beardy Guy:

What I’m hoping or expecting to see in terms of iPadOS and apps[…]

John Voorhees:

This week on AppStories, we talk about Logic Pro for iPad and our wishes for Apple’s rumored mixed reality OS, xrOS.

Timothy Perfitt:

macos wishes for wwdc that will not happen but totally should:

  1. netboot returns.
  2. configuration xml at root of drive to configure setup assistant
  3. system preferences that work like a mac app
  4. don’t have to quit apps when enabling sharing screen
  5. ability to install profiles without an mdm or user approval each time.
  6. a pony

John C. Welch:

A single, coherent, OS-wide automation framework that allows non-devs to create their own automation solutions and not rely on app devs to build shortcuts.

You’ll absolutely get a pony first.

Previously:

Update (2023-06-02): Brian Stucki:

Another wish list item: fix screen time.

Lickability:

We asked our team to share their biggest wishes and predictions for the event, from SwiftUI APIs to interactive widgets on iOS.

Dave Wood:

Every single year: “The next macOS should be a ‘Snow Leopard’ kind of release.”

John Gordon:

Every year we ask Santa for a Snow Leopard and we get whatever iOS didn’t want.

Aaron Pearce:

All I want for WWDC is to be able to delete this:

UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)

Chris Turner:

My wish for WWDC2023 is if I get a voice mail on my iPhone, I actually have the voice mail available before or at the same time as the transcribed text message, instead of hours or days later.

Robert Hammen:

A softwareupdate function that works repeatably and reliably to present the user with pending updates. This functionality has been broken and unreliable on macOS since macOS 11 and the changes revolving around Apple Silicon (volume ownership).

Same here.

Jeff Johnson:

My WWDC wishlist is an M3 processor for the App Store Connect server.

Reddit to Charge for API

Christian Selig (tweet, Mastodon, Hacker News, AppleInsider):

Had a call with Reddit to discuss pricing. Bad news for third-party apps, their announced pricing is close to Twitter’s pricing, and Apollo would have to pay Reddit $20 million per year to keep running as-is.

[…]

I’m deeply disappointed in this price. Reddit iterated that the price would be A) reasonable and based in reality, and B) they would not operate like Twitter. Twitter’s pricing was publicly ridiculed for its obscene price of $42,000 for 50 million tweets. Reddit’s is still $12,000. For reference, I pay Imgur (a site similar to Reddit in user base and media) $166 for the same 50 million API calls.

John Gruber:

Right now Apollo is free to use, but offers a Pro tier with a slew of additional features and fun stuff for a one-time payment of $5, and an Ultra tier with even more for a $13/year subscription. If Reddit goes through with this API pricing, Apollo’s free and Pro tiers would be unsustainable, and the Ultra subscription would have to cost at least $50 or $60 per year.

Jason Snell:

As with Twitter, there is a path for Reddit to walk that allows Selig to build a sustainable app business and for Reddit to be compensated for its service. But this isn’t it.

Adam Chandler:

I’m an Apollo for iPad user and pay for the highest tier to compensate the developer for their time. I also pay Reddit for their premium service to compensate them for their time and so I don’t see any ads.

Why can’t Reddit just require Apollo only work with users who are paying for Reddit Premium? Introduce an Ads-API that’s free to Apollo and charge the end user to disable ads?

I had the same thought about Twitter, but I guess it’s more about control or LLMs than money.

Brent Simmons:

NetNewsWire has special support for Reddit — we use the Reddit API.

[…]

We already went through this with Twitter. Not happy to be doing it again.

Federico Viticci:

To be fair, I feel like Reddit should pay @christianselig $20 million to help them improve their shitty app.

Apps like Apollo have made Reddit usable for millions of people. This is an idiotic move.

Sören:

Tweetbot was the one way I could enjoy reading the Twitter timeline. Without it, my Twitter use is reduced to occasional glances at individual profiles.

Apollo and old.reddit.com are enjoyable ways to use Reddit. The latter’s days are presumably numbered, and the former soon won’t be able to afford paying for the API.

The app is awful, and the new website is worse than the old one.

Kevin R Jones:

The other big problem about this Reddit stuff, is that a third party client is about the only efficient way a screen reader user can use it. Blind screen reader users will basically be prohibited from using Reddit from now on.

Sean Heber:

It’s amazing that Reddit, having watched the fallout after Twitter killed off their third party developers, would go on to say, “You know what, that’s an excellent idea and we should do it too!”

Paul Haddad:

The thing that bothers me most about this Reddit stuff is the Gaslighting. If you are going to kill off all clients, just own it. Don’t lie and say you value 3rd party clients and then act like they should be thankful for your over priced, unsustainable access plans.

Khaled:

At least they talked with him. 🙄

Craig Hockenberry:

HOW MUCH IS APPLE GONNA CHARGE ME TO USE THE PING API

Previously:

Update (2023-06-02): See also: Luke Plunkett (via Hacker News).

Centering the macOS Ventura Form Layout

Vidit Bhargava (Mastodon):

As you can see with this design, it’s got a couple of glaring of issues when used in wide width situation:

  1. There’s too much space between the title and value. This makes reading the values veery difficult.
  2. Even when grouping, the sameness of each item makes it look like a block of text even more so than the previous versions

[…]

The center equalise process, solves the issue of tracking values very elegantly, and overall offers a much more readable UI.

The design where the control and its label are as far from each other as possible makes a lot more sense on a narrow phone screen that’s in portrait orientation. There, they’re not actually that far apart, and it makes everything line up. Federighi claims that this is not where the idea for the macOS System Settings came from, but it’s hard to see why this design would make sense on its own. He says that the main goal was “consistency,” but System Settings is not consistent, with some areas using the sidebar and form interface and other areas using:

A modal sheet has a navigation link to another… sheet? which can close the modals or take you back. But the back button is now in the bottom bar.

This is just so odd because you see the gymnastics they had to do because they brought a design that was born out of mobile, extended for tablet, and now trying to make it work on desktop.

Previously:

Update (2023-06-02): Clarko:

SwiftUI isn’t responsible for what you dislike about System Settings.

By default, SwiftUI uses the AppKit widgets. You have to opt in to different styles, which System Settings has done.

And you can quibble about those styles, for sure. But this is about the designers, not the technology.

Difference between the screenshots below:

.formStyle(.grouped)
.toggleStyle(.switch)

Otherwise it’s the same code in both cases.

Sarah Reichelt:

The things people object to in the System Settings app are design decisions, not SwiftUI bugs. It also seems that a different team designed each pane, leading to a lot of inconsistent UI. But I seem to be in the minority who actually likes the formStyle(.grouped) look.

I mostly agree with this, but I would note that (especially early on) there were a lot of glitches that seemed to be due to SwiftUI bugs, or I suppose perhaps the developers not knowing how to use SwiftUI properly. Secondly, it’s not only about widget styles but also layouts and navigation. Using SwiftUI encourages the developer to choose certain kinds of designs. And perhaps it also influences which engineers management assigns to the project and how much time they are given to work on it.

StopTheMadness 39: Hiding Page Elements

Jeff Johnson:

StopTheMadness already allowed you to write your own site-specific CSS, but along with knowing CSS, this requires digging around in the browser’s web inspector, which is particularly difficult on iOS. I needed a solution that avoids both of these problems, and I think I finally got something decent.

To use the new feature, you first click the Hide Page Element button in the StopTheMadness extension popup, which triggers element selection mode. Then you close the popup and click on the web page element that you want to hide. If your device (a Mac or an iPad) has a physical keyboard, you can skip the clicks with a keyboard shortcut: hover the pointer over the web page element that you want to hide, and press ⌘-delete. In either case, you’ll get a list of one or more elements to hide (there’s a 3D hierarchy of elements on the page). You can select each of the elements in the list, previewing what the page looks like when it’s hidden, and then click Save when you’ve found what you want.

[…]

I’ve recently learned that Medium, for example, exploits a newer technique to detect whether you’re viewing the web page in a Safari private window. I’ve created my own test page to demonstrate the technique. I’ve also created a new StopTheMadness website option to stop it: Protect private windows.

I don’t really care about the privacy aspect of a site knowing that I’m using a private window, but some sites nag you about it or refuse to work, so hopefully this will be able to foil them.

Previously:

Wednesday, May 31, 2023

WordPress at 20

Matt Mullenweg:

Today is the 20th anniversary of the first release of WordPress. None of us knew what we were getting into when it started, but we had a shared conviction that the four freedoms of the GPL combined with a mission to democratize publishing was something worth spending our time on.

Om Malik:

The software’s first official release (WordPress 1.0) was made available on May 27, 2003. I had been using the software for a little longer when it was still in alpha. In 2004, I switched my old website to WordPress, becoming the first major blog to embrace the platform. Considering obsolescence is a given, nothing lasts that long in the technology industry. It might not be as nimble or as basic as it started out, but it can still do one thing — help me maintain a homestead on the Internet, not controlled or defined by a platform.

John Gruber:

I, for one, never would have predicted that WordPress would grow to become, by far, the most popular CMS in the world, and the foundation of a thriving company whose primary goal is making the web a better platform.

Previously:

Update (2023-06-02): Hide Shidara (via Hacker News):

Out of a sample set of 600+ pre-seed to seed stage startups we’ve found that 29 startups still use WordPress and various plugins. At this point marketing site architecture is outsourced to no-code tools like WP and Webflow, so I expect that 100% of these startups are just using WP as a blog, hiring board, or a landing page builder.

Tuesday, May 30, 2023

Rewriting Remotion in SwiftUI

Dan Wood:

It took a while — August 2022 — before we felt that we were targeting a new enough version of macOS that we could feasibly start using SwiftUI in our code base. Since then we haven’t looked back: Development is faster, the app is more stable, and new teammates are ramping up faster thanks to the simpler code base.

We now think: If you are a macOS or iOS developer who hasn’t yet taken the plunge yet, now is a great time to start writing a new app using almost exclusively SwiftUI, and use its friends Combine and concurrency for the data flow.

[…]

While SwiftUI is all you’ll need for a basic Mac or iOS application, there are still quite a few gaps that will require you to partially make use of classic Cocoa views. In our code base, for example, we need some access to NSEvents, text input, and tweaking the first responder that just aren’t possible with pure SwiftUI. Fortunately Apple has provided bridges — the NSHostingView and NSHostingController for embedding SwiftUI in a Cocoa view, and NSViewRepresentable and NSViewControllerRepresentable for embedding a Cocoa view in a SwiftUI view. A really powerful technique we can’t neglect to mention is combining these two together, as described in this SwiftUI Lab article.

Previously:

Rewriting SoundCloud in SwiftUI

Matias Villaverde and Rens Breur:

We will share all the mistakes we made in the past two years while rewriting the whole SoundCloud iOS application in SwiftUI. The talk emphasizes problems that can happen when writing SwiftUI applications at scale. Hopefully, many engineers find our mistakes and learnings useful for adopting and migrating UIKit to SwiftUI.

Previously:

SwiftUI Notes Before WWDC 2023

Here are some posts I’ve been collecting since iOS 16 and macOS 13. Hopefully they will soon be outdated.

Phillip Caudell:

Has anyone got NavigationSplitView working reliably on macOS yet? Even the NavigationCookbook demo from Apple has broken things like double clicking to open new window?

Peter Steinberger:

“It is really cool, wild even, but also, if you use this, it crashes. Really unfortunate. Made it into iOS 16 GM as well.” -@mbrandonw on NavigationPath in SwiftUI

[Update (2023-06-02): Brandon Williams: “[This] bug was fixed in Xcode 14.1 beta 3. There are still plenty of bugs in SwiftUI navigation APIs though.”]

Phillip Caudell:

The new SwiftUI navigation API straight up doesn’t work if you have a List that supports selection.

Worse, the same code works on macOS but silently fails on iOS.

This is what drives me nuts about SwiftUI: how can something so simple be so broken?

Gwendal Roué:

Both List and LazyVStack are not as lazy as expected: they both access all elements in the collection, even if they are not rendered (it’s still iterating the million items as I’m writing, poor boy).

Damien Petrilli:

So it seems Apple changed the way the TabView with paging is rendered causing the bug when you resize the content of a page within it.

The lesson I am learning doing SwiftUI is to never trust Apple provided views and always make your own… unlike it used to be in Cocoa

Phillip Caudell:

Another day, another serious SwiftUI bug: List on macOS won’t select its initial value if the binding has an optional value type. Works on iOS, fails on macOS.

Worse, changing to non-optional then works, but then doesn’t compile on iOS (FB10013937)

Phillip Caudell:

Add a .onDrag() handler to an item in a List. Now try select the item. You can’t.

Adding a drag handler literally breaks the entire List. People have been complaining since last year[…]

Christophe Sauveur (via Hacker News, tweet):

I somewhat regret not being able to use SwiftUI in this project. I have the feeling that it is a great technology, but I reckon now that it is probably not suited for my specific use case. However, I still don’t know if I was doing things the wrong way or not. I still plan to use SwiftUI for the updated version of Nihongo no Kana, but as an iOS/iPadOS app with much less frequent redraws, I suppose it won’t be an issue.

Maybe SwiftUI over AppKit is not ready yet. The authoring tools for The Untitled Project are not build as a Catalyst app and do not rely on UIKit. One of the benefits of this refactor however is that there is absolutely no delay whatsoever and everything works perfectly. Sure, it is way more verbose and Auto Layout is not the most pleasing tool to use. But you also get much more control over the behaviour of the app and everything can be meticulously tweaked to your desire.

Daniel Jilg (via Peter Steinberger):

The app is also hard to develop because we seem to be fighting against a host of bugs and unclear behaviours in SwiftUI on macOS, even in the newest versions.

[…]

The iOS app will lose its editor and become a viewer app.[…] Going forward, Dashboard [for the Web] will be our primary and canonical app. It will receive updates first, and any support requests regarding the Dashboard will float to the top. Once a feature is more stable, we’ll try and port it to the macOS and iOS apps.

Andreas Monitzer:

The weird thing is that SwiftUI has all the disadvantages of being non-native while not being cross platform (except iOS/macOS, but there’s Catalyst for that). Also, the documentation is bad.

Christian Selig:

I’m legit looooving how easy SwiftUI is making it to add some new cool views to Apollo, but it takes the wind out of your sail a little when alongside the smooth UIKit ones the SwiftUI animations look so choppy[…]

Bruno Rocha:

I can’t stress hard enough how awesome SwiftUI’s previews are. […] To be fair, the previews aren’t perfect. I had a frequent bug where the preview refused to show up and was unable to do any form of debugging on the preview itself, and a lot of people reached out to say that the previews are painfully slow on their older Macbook models, but it generally works well and I’m very happy we finally have official hot-reloading support in iOS.

[…]

While Burnout Buddy took me a couple of weeks to build, the majority of that time was spent on the logic and architecture. The UI itself for the entire app was built in just a couple of minutes.

It’s important to mention that this is not always true. As we’ll see down below there’s an entire category of “more complicated” products where SwiftUI is actually extremely detrimental to development speed, but we should still appreciate that SwiftUI works amazingly well for the more straight-forward category of projects that the majority of developers deal with. It’s also not too surprising that this is the case considering that they have been Apple’s primary target audience for Xcode features since the dawn of iOS.

[…]

SwiftUI forces you to shape your model in a way so that the complete structure and state of all views are static and known well in advance, which while not an impossible task, can be insanely difficult for views that have lots of moving parts and conditions.

Steve Troughton-Smith:

Another day, another fatal SwiftUI problem I have to now drop everything to work around.

Related to the last one, but Picker popups now auto-size to the longest menu item, ignoring all other layout cues.

[…]

I did everything right; this is a 5-line SwiftUI view wrapped in manual UIKit layout, treated with oven mitts to minimize potential damage. And it still went wrong.

[…]

Do note, as you flip through these three screenshots, that the same SwiftUI code has different layout on each. You simply can’t set it and forget it. You gotta re-test every OS you support with every SDK update and OS point release.

This kind of software decay is completely opaque to the developer; because Apple provides no kind of macOS Simulator to run older OSes, and TestFlight does not support macOS 11, devs relying on SwiftUI will be shipping bugs like this without knowing, without having a way to test.

Damien Petrilli:

Code works perfectly when compiled directly on the device but crashes when deployed through TestFlight and only for some devices…

And no way to debug as it’s internal. So you have to isolation the views and try alternatives to not trigger the bug.

Brian Webster:

So, the thing I couldn’t get SwiftUI to do is this layout, with the following conditions:

  1. Both vertical stacks should size to the width of the stack’s widest control (e.g. the “Import whatever version is available” button).
  2. The vertical stacks should be just as tall as needed to fit the controls and wrapped texts.
  3. The window should autosize to fit the stacks on both axes.
  4. The General tab is much smaller, but the window should *not* change size when switching tabs.

[…]

That’s the thing though, it’s absolutely trivial in AppKit (and I’d guess UIKit too). Just shove everything in an NSStackView and you’re done. I was genuinely surprised I couldn’t get it to work in SwiftUI without crazy shenanigans.

Helge Heß:

I’m slowly becoming a SwiftUI Table view expert. It can be a weird thing, especially cross platforms (iPadOS vs macOS have a set of different behaviours). E.g. on macOS “sections” do not become proper (sticky) group rows, which is quite weird given that this is an intrinsic NSTableView feature, they just scroll like regular contents.

On iOS there is “some” stickyness, but in a somewhat crazy way: a section title propagates to the content of the first column. Which breaks if it is short (overlaps w/ the second column). Also sections contents on macOS clip and don’t on iOS. And section contents on macOS respond to clicks, but not on iOS.

Clarko:

Anybody dealt with this macOS table-selection weirdness before?

It’s only happening for a small number of testers, and I can’t repro, so it’s a pretty frustrating bug!

Steve Troughton-Smith:

Every WWDC from here on in I’ll be looking at from the perspective of ‘can you make better apps with SwiftUI vs not-SwiftUI?’. The answer right now is ‘no’, not for the apps I want to build and the platforms I want to build them for, but boy would it sure be nice to say yes and start using more of AppKit in my cross-platform apps.

Previously:

Building Large-Scale Apps With SwiftUI

Mohammad Azam (via Christian Tietze):

I have been experimenting with MV pattern to build client/server apps and wrote about it in my original article SwiftUI Architecture - A Complete Guide to MV Pattern Approach. In this article, I will discuss how MV pattern can be applied to build large scale client/server applications. […] The main idea behind the MV Pattern is to allow views directly talk to the model.

[…]

Based on Apple’s recommendation in their WWDC videos and code samples and my own personal experience, I have been implementing a single aggregate model, which holds the entire state of the application. […] Once, you have identified different bounded contexts associated with your application you can represent them in the form of aggregate models.

[…]

To prove that a View Model unit test does not verify user interface elements, simply remove the Button view or even the Text view from the ContentView. The unit test will still pass. This can give you false confidence that your interface is working.

Pet peeve: the parameters to XCTAssertEqual() should always have the actual value first and the expected value second.

I do not recommend testing Core Data with NSInMemoryStoreType because a lot of features don’t work with it, the performance characteristics are skewed, and having an actual file helps track down memory management bugs. I find that, with modern SSDs, using NSSQLiteStoreType with a temporary folder is fine, and there are various pragmas to make it go faster. If you really need in-memory, use /dev/null/DatabaseName as the file path.

Previously:

Monday, May 29, 2023

Receipt Validation With SHA-256

TN3138:

Apple is updating the App Store receipt signing intermediate certificate with one that uses the SHA-256 algorithm in the sandbox, TestFlight, and App Store environments, on the dates shown below[…]

[…]

If your app verifies App Store receipts on the device, follow the instructions outlined in this document to ensure that your receipt validation code is compatible with this change.

[…]

If your app follows the instructions in Validating receipts on the device, the new certificate affects step 2, which involves verifying the certificate chain. Be sure your app uses the latest certificates from Apple PKI.

Previously:

Photo Stream Shutting Down

Juli Clover:

Apple’s “My Photo Stream” service is set to shut down on July 26, 2023, which means customers who are still using that feature will need to transition to using iCloud Photos prior to that date.

You can see why they are consolidating on iCloud Photos, but Photo Stream had some appealing features that will be lost. First, you could backup/sync an unlimited amount of data (for a limited time). There was no need to worry about upgrading your account temporarily or having photo storage crowd out storage for other apps. Second, you could access recent photos and videos on all devices without having to store everything in the cloud.

Stephen Hackett:

Photo Stream is one of the original components of iCloud, and was kept around even after iCloud Photo Library launched in 2014. Here’s how Apple pitched the feature when iCloud was new[…]

Update (2023-06-01): Michael Steeber:

I don’t know if my memory is toast or what, but until the news last week of Photo Stream shutting down, I cannot recall one single time before that it was ever called “My Photo Stream.” I’ve known it as just “Photo Stream” since day one.

I was thinking the same thing.

Apple Intelligence

Daniel Jalkut:

People are justifiably less confident about Apple’s prospective plans in the area of artificial intelligence (AI), and particularly in the realm of large language models: the technology behind such imagination-captivating products as OpenAI’s ChatGPT, and GitHub Copilot (which itself uses another OpenAI language model).

I zeroed in on ChatGPT and Copilot because it’s easy to imagine the functionality of these services shining in the context of two important Apple products: Siri, and its Xcode developer tools. In fact, technology is advancing so quickly that the absence of something like ChatGPT and something like Copilot in these products seems likely to be viewed as major shortcoming in the near future, if it isn’t seen that way already.

[…]

Apple Intelligence won’t be as good as ChatGPT or GitHub Copilot, at least not to start with. But it will be Apple’s. They can frame the pros and cons however they see fit, working their typical marketing magic to make its shortcomings seem less important, if not downright advantageous.

It would seem that Apple is way behind, not only in terms of announced products, but also because, as large language models become commoditized, access to proprietary training data and integrations will become key. Apple does have some unique data such as iTunes and App Store reviews, but these seem less useful than what its competitors have. Xcode Cloud could potentially be a great data source, but it, rightly, is designed for privacy:

Source code is only accessed for builds and the ephemeral build environments are destroyed when your build completes.

On the other hand, perhaps we are not that far from fitting really useful, if not market-leading, models on device. Apple has great hardware to run them, which is already deployed. It could work offline and preserve your privacy. This could be easier and cheaper to scale up to large numbers of users than models running in data centers.

Previously:

Friday, May 26, 2023

Disabling Quick Look In-Icon Previews

Craig Hockenberry:

This is ridiculous.

If you don’t have enough space to show paging arrows, you certainly don’t have enough space to view the content.

[…]

Where there’s a will, there’s a way. To disable movie, PDF, and other useless previews, but still maintain the image on the icon, use this from Terminal:

$ defaults write com.apple.finder QLInlinePreviewMinimumSupportedSize -int 512

Then relaunch the Finder.

Stop Smooth Scrolling in Safari 16.4

Jeff Johnson:

Smooth scrolling means that when you press the arrow keys to scroll down or up on a web page, the scrolling is animated rather than immediate.

[…]

My blog post macOS Containers and defaults explained why Terminal needs Full Disk Access. Next, you need to quit Safari and enter the following command in Terminal:

defaults write com.apple.Safari IncludeInternalDebugMenu -bool true

Then launch Safari, open the Debug menu at the end of the main menu, select WebKit Internal Features, and uncheck “EventHandler driven smooth keyboard scrolling”.

I see smooth scrolling as an accessibility issue and wish I could turn it off in all apps.

I’d been meaning to post about this and was reminded about it after installing Ivory, which doesn’t follow the NSScrollAnimationEnabled system setting.

See also: Glenn Fleishman.

Wallaroo and SwiftUI on macOS

Craig Hockenberry:

We have a View in the app that uses SceneKit to display a 3D scene with a confetti flourish after a customer starts a subscription. I was expecting stuff like that to take a lot of effort to get working on the Mac. Instead, it ran 100% out of the box with no modifications at all.

And the stuff that I was expecting to be easy, like a settings view, buttons, and menu commands, turned out to be hard. To put that “hard” in context, it took me about a month to go from an app that we were proud of on iOS to one that we were equally proud of on macOS[…]

[…]

We also found that many of the issues encountered on macOS were things we had done wrong on iOS. Porting the app to the Mac made both platforms better. We’re also rethinking our View architecture so things that are currently Mac-only can be used to improve the iPad experience.

[…]

You’re going to have platform-specific code. More than you realize: certainly more than I expected!

[…]

It took me three days to hook up a Save menu item and have it work reliably.

I don’t understand why they had to use a custom button style and a hard-coded radius to get buttons that looked good on both platforms. I thought the point of SwiftUI was that you’re supposed ot just specify that you want a button and it does the right thing on each platform.

Craig Hockenberry:

SwiftUI’s default mechanism for handling URLs on macOS isn’t great. If you’ve used .onOpenURL on a View to handle external events, you’ll be disappointed to learn that a URL scheme on macOS opens a new window (Scene) before it hands the URL to the view modifier. And if you’re using a single Window instead of a WindowGroup, nothing happens at all.

[…]

One thing we wanted to do was use the Escape key to pop the NavigationStack. On the Mac, it’s a key that has always represented “go back” and many apps (like Photos) take advantage of that. Unfortunately, to accomplish that in Wallaroo, we had to use an invisible ToolbarItem with a .keyboardShortcut(.escape, modifiers: []).

[…]

While you’re struggling with window and sidebar size constraints, you end up with UserDefaults for frames that have “fun” keys like "NSWindow Frame SwiftUI.(unknown context at $1acd3d768).SceneBridgeReader, SwiftUI.ModifiedContent>, SwiftUI._PreferenceWritingModifierSwiftUI.PreferredColorSchemeKey>, SwiftUI._EnvironmentKeyWritingModifier>>>>-1-AppWindow-1".

Craig Hockenberry (Mastodon):

You won’t realize how much you depend on SwiftUI previews until you start working on macOS.

Sometimes they kinda work, but more often than not you’ll get an endless spinner. When they do work, they’re not interactive (you have to use the selectable mode with the arrow icon).

[…]

The similarity of the key names makes this a hard lesson to learn. I looked at “aps-environment” and “com.apple.developer.aps-environment” for hours before I realized they were different. After you add the one for macOS manually, everything is golden.

[…]

We weren’t able to get FileRepresentation working in a Transferable. Other applications can’t access a temporary file that’s created for the export. This feels like a sandbox problem that we couldn’t work around.

Previously:

Thursday, May 25, 2023

Kaleidoscope 4

Leitmotif:

  • Syntax coloring, with multiple built-in themes.
  • Transform any comparison into a merge document that can be edited inline.
  • Text filters to clean up diffs by removing irrelevant data, such as time stamps, object addresses and unique identifiers.
  • Kaleidoscope Prism, a new helper app in the menu bar to quickly launch comparisons even if Kaleidoscope is not running.
  • Debugger integration for Python developers.
  • File properties show metadata, including size, file type, dates, and encoding.
  • A welcome window that speeds up the processes of creating new comparisons or finding recent ones.

The syntax coloring is nice. The most interesting feature for me is the text filters, which have a nifty interface that reminds me of BBEdit pattern playgrounds. I expect that they will prove useful when comparing Xcode debug or test output.

Previously:

Update (2023-05-30): Florian Albrecht:

While the new version is very much a continuation of what we started 2.5 years ago with Kaleidoscope 3, we modernized many aspects of the app. This screenshot of a simple text comparison shows off some of the changes[…]

Update (2023-06-01): Florian Albrecht:

Kaleidoscope 4.0 comes with 7 predefined [text] filters. Most of them are designed for immediate real-world use. To illustrate how to use them, I am just going to run a simple and unfinished SwiftUI app to create license files from Xcode, twice, and copy the log output into Kaleidoscope.

[…]

While this result is not hard to understand, it contains a lot of “noise”, i.e. data that is not relevant to finding important differences. Let’s go ahead and clean this up a little.

Viewing Large Text Files

I recently needed to view and search a 20 GB log file and realized that I don’t know of any Mac text editors that are disk-based, i.e. that don’t load the entire file into RAM. Wikipedia has a list of editors with Large File Support, but it seems to be more about not having artificial RAM limits rather than supporting files that don’t fit in memory.

What I ended up doing in the moment, because I knew it would work, was to use split to break the file into smaller chunks. I then did a multi-file search with BBEdit.

I considered Hex Fiend, which is disk-based. It’s fast and has a find feature, but it’s less than ideal for this use case because it doesn’t support UTF-8 or show line breaks.

For short tasks in the future, I will probably use less, because it can directly open and search large UTF-8 files. But for longer tasks I don’t want to be working in Terminal.

Disk Utility in macOS 13.4

Howard Oakley:

Yet for those few years, Disk Utility’s First Aid feature has frequently failed to perform checks on APFS volumes, reporting various errors that are the result not of file system problems but bugs in Disk Utility. These boil down to the fact that fsck_apfs requires the volume to be unmounted, and Disk Utility has been unable to do that reliably. This has left users having to manually unmount volumes before using the First Aid tool.

[…]

Apple has at long last responded, and Disk Utility in Ventura 13.4 reaches new heights in version 22.6. I’m delighted to report that you can now check and repair almost every APFS volume you might wish. I’ve tried it on a wide range, including Time Machine backups, and on both internal and external disks.

[…]

What then appears to happen is that, because that Data volume is joined to the System volume using firmlinks, and mounted at a different path, Disk Utility can’t unmount the Data volume alone, so fails with the original error. The workaround is to select the Data volume, click the Unmount tool, which will then unmount both System and Data volumes, and you can then run First Aid without error.

Previously:

Wednesday, May 24, 2023

Ivory for Mac

Tapbots:

Ivory is free to download, but requires a subscription to use. You may subscribe and immediately cancel to activate a 7-day free trial and evaluate its features in full. Outside of the trial and subscription, the app is limited to one account and limited to read-only mode. The iOS+iPadOS app is a separate subscription, but there is a bundled discount if you want use Ivory across iOS, iPadOS, and macOS.

Joe Rossignol:

A new “Universal” subscription tier allows users to access Ivory across the Mac, iPhone, and iPad for $24.99 per year, or users can subscribe to the Mac app on its own for $14.99 per year.

John Voorhees:

What Ivory brings to the growing field of native apps is what we saw with iOS and iPadOS: impeccable taste and snappy performance that few other apps can match.

[…]

Ivory’s multi-column design is the most readable of any Mastodon app I’ve used. It’s easy with multiple columns of text and media for a multi-column window to look cluttered, so it’s a testament to Ivory’s design that it’s as readable as it is. One of the touches that helps a lot is that instead of including a tab bar for each column, Ivory uses drop-down menus at the top of each column to allow users to pick what the column shows. That eliminates a lot of duplicative interface elements you find in other apps like Mona.

I really appreciate the additional columns I can open on the Mac. When I use Ivory on my iPhone, it’s usually to read my own timeline. However, when I’m at my Mac, I’m usually working and want to keep tabs on the mentions coming into our MacStories accounts.

I discovered in the interregnum that the traditional Twitter client paradigm is not ideal for me. After using NetNewsWire to read Mastodon, I find that I prefer reading posts by account rather than mixed together in a timeline. I like having unread indicators and being able to bulk-mark certain ranges, accounts, or folders as read. I like not worrying about losing my scroll position or losing access to older posts if I take too long to read them. I like single-press archiving to EagleFiler.

That said, the combination of RSS and a Web browser is awkward and slow for basically any interaction other than skimming/reading, though Homecoming for Mastodon helps. I’d like to be able to use Ivory for these other tasks and to handle multiple accounts. I’m a bit put off, though, that it feels so much like an iOS app, in ways that Tweetbot didn’t. The Settings window seems even more constricted and rigid than System Settings, and I can’t close it with Command-W when it’s showing a subscreen. On the other hand, without Catalyst there wouldn’t be a Mac version today.

More importantly, I can’t stand being forced to use Universal Links. Universal Links that I could opt into would be great, but it seems like you can still only manually opt-out on a per-click basis. If every Mastodon link is going to switch to Ivory instead of staying in my browser—or, worse, open in Safari with a “Do you want to allow this page to open ‘Ivory’?” alert—I’m afraid I’ll probably have to uninstall it.

Previously:

Update (2023-05-29): John Gruber:

Ivory for Mac is a Mac app. But, numerous Catalyst-isms show through. System-wide Services menu items don’t work. Smart punctuation (automatic curly quotes and proper em-dashes when you type two hyphens) only work when you type slowly. Some views scroll via standard keyboard shortcuts (space/shift-space, Page Up/Page Down), but some don’t. A lot of these are things that I consider shortcomings in Apple’s Catalyst framework — the whole point of Cocoa from 20+ years ago is that standard controls get standard behavior out of the box, relieving developers from the drudgery of making simple expected platform-standard features work. Catalyst isn’t like that — or at least isn’t like that yet.

Old Macs and Activation Lock

Brendan Nystedt:

Within the secondhand community, even Macs with soldered-down components are looked at as having value, and ingenious tinkerers are repairing, upgrading, and adding software support to old machines long after Apple moved on to something new.

YouTuber Collin Mistr, known as dosdude1, demonstrates his skilled approach to upgrading and modifying older Macs on his channel. The videos are far from polished but show off how modifications and soldered-on upgrades can give old Macs new life.

[…]

As old Macs are dropped from Apple’s supported list, the Open Core Legacy Patcher project swoops in, using tricks learned when running macOS on non-Apple hardware and gives its utilities away for free.

[…]

A hard reality may be coming up for these savvy hardware and software hackers. With the advent of tighter security, things like Apple’s T1 and T2 chips, along with device management software, can turn older Macs into trash, with little hope of resuscitation or repair. “I know Apple claims [Activation Lock] is mostly for anti-theft, which it does prevent, but they try to hide from you that most locked devices you find out there, on eBay or in surplus sales, are locked not because they were stolen, but because the organization that had the devices didn’t know the lock exists in the first place,” opines Colin Mistr. “[Apple] doesn’t care…they’d rather the device be destroyed than reused.”

Tom Shouler (via Hacker News):

Jordan works at a small business. On her first day, Jordan purchased a brand new MacBook at the Apple Store and signed into her personal iCloud account. A year later, Jordan enrolled the device in the company’s MDM solution, but shortly after that, she left the company and moved across the country for a new job. Jordan’s device was wiped two days after her last day, consistent with the company’s usual off-boarding procedures. A new hire replaced Jordan and was given that same MacBook a few weeks later, but the MacBook was Activation Locked behind Jordan’s iCloud account. The company reached out to Jordan for help, but she couldn’t remember the device password and felt uncomfortable sharing her personal iCloud credentials. The device was unable to be used, so it had to be eWasted.

[…]

This is an unfortunate story, especially since MacBooks are not a trivial investment for most businesses. We’ve heard from many administrators who have been caught by surprise with Activation Lock and now own a $2,000 paperweight. It’s critical for any company that owns macOS devices to understand this risk.

[…]

To best insulate your business from this pain, we recommend two things[…]

Activation Lock is tied to Find My, which I have always disabled because I’m more worried about remote wiping than losing my Mac. I kind of wish these settings weren’t all bundled together.

Mr. Macintosh:

You can remove the firmware password + erase all data on a 2018-2020 T2 Mac with Apple Configurator 2 (Does not remove Activation Lock)

Previously:

The AARD Code and DR DOS

Geoff Chappell:

Some programs and drivers in some pre-release builds of Windows 3.1 include code that tests for execution on MS-DOS and displays a disingenuous error message if Windows is run on some other type of DOS. The message tells of a “Non-fatal error” and advises the user to “contact Windows 3.1 beta support”. Some programs in the released build include the code and the error message, and even execute the code, performing the same tests, but without acting on the result to display the error message.

Geoff Chappell (via Hacker News):

For roughly a year after I noticed on 17th April 1992 that the HIMEM.SYS driver from a Microsoft Windows 3.1 beta contained what eventually became known as the AARD Code, I had no idea which non-standard DOS had been affected.

[…]

By the late 1990s, the AARD code had no small role in a court case, Caldera, Inc. v. Microsoft Corp., 72 F. Supp.2d.1295 (D. Utah 1999), which Caldera, who was by then the owner of DR DOS after Digital Research and Novell, brought against Microsoft “for damages and injunctive relief under the antitrust laws of the United States, and for damages in tort”. The AARD code has ever since been for many some sort of pin-up for anti-competitive practices by Microsoft.

[…]

I, for the record, have tended to side with Microsoft on this: not on the general question of anti-competitive practices, for which Microsoft deserves far greater condemnation than the computer industry and various governments have allowed it to escape with, but on the AARD code specifically; and not then for the disingenuous error message and the code’s obfuscation, which I always thought childish and quickly also regarded as despicable, but for Microsoft’s general disposition to DR DOS.

Previously:

Tuesday, May 23, 2023

Microsoft Still Anti-Competitive

Thomas Germain (via Hacker News):

An April Windows update borked a new button in Chrome—the most popular browser in the world—that let you change your default browser with a single click, but the worst was reserved for users on the enterprise version of Windows. For weeks, every time an enterprise user opened Chrome, the Windows default settings page would pop up. There was no way to make it stop unless you uninstalled the operating system update.

[…]

This petty chapter of the browser wars started in July 2022 when Google quietly rolled out a new button in Chrome for Windows. It would show up near the top of the screen and let you change your default browser in one click without pulling up your system settings.

[…]

Mozilla’s Firefox has its own one-click default button, which worked just fine throughout the ordeal.

[…]

In response, Google had to disable its one-click default button; the issue stopped after it did.

Tom Warren (via Hacker News):

Microsoft has now started notifying IT admins that it will force Outlook and Teams to ignore the default web browser on Windows and open links in Microsoft Edge instead.

[…]

While this won’t affect the default browser setting in Windows, it’s yet another part of Microsoft 365 and Windows that totally ignores your default browser choice for links. Microsoft already does this with the Widgets system in Windows 11 and even the search experience, where you’ll be forced into Edge if you click a link even if you have another browser set as default.

[…]

“This change is designed to create an easier way for Outlook and Microsoft Teams users to reduce task switching across windows and tabs to help stay focused,” says Katy Asher, senior director of communications at Microsoft[…]

[…]

Microsoft tested a similar change to the default Windows 10 Mail app in 2018, in an attempt to force people into Edge for email links. That never came to pass, thanks to a backlash from Windows 10 testers. A similar change in 2020 saw Microsoft try and force Chrome’s default search engine to Bing using the Office 365 installer, and IT admins weren’t happy then either.

Previously:

2022 App Store Transparency Report

Apple (MacRumors):

Today, Apple announced that in 2022, the App Store prevented over $2 billion in potentially fraudulent transactions, and rejected nearly 1.7 million app submissions for failing to meet the App Store’s high standards for privacy, security, and content.

[…]

In 2021, Apple terminated over 802,000 developer accounts for potentially fraudulent activity. In 2022, that number declined to 428,000 thanks in part to new methods and protocols that allow the App Store to prevent the creation of potentially fraudulent accounts. Additionally, nearly 105,000 Apple Developer Program enrollments were rejected for suspected fraudulent activities, preventing these bad actors from submitting apps to the App Store.

[…]

In the last 30 days alone, Apple blocked close to 3.9 million attempts to install or launch apps distributed illicitly through the Developer Enterprise Program, which allows large organizations to deploy internal apps for use by employees.

Nick Heer:

Apple also says it stopped “more than one” app that “the potential” for credential theft. But how many is that? Is it two? Is it fifty? A bigger number would be more fitting for the apparent objective of this kind of report — to explain why iOS software distribution ought to be permitted only through the Apple-administered App Store instead of third-party stores — so the use of “more than one” is conspicuous.

[…]

Again, the unspoken rationale for these news releases — which Apple started publishing around the time European regulators began looking into its App Store-only iOS software distribution policy — is that Apple is uniquely suited to protecting its users from fraud and abuse. But it has also repeatedly struggled with preventing pretty obvious scams. I do not think its failure to achieve a perfect success rate is an indication that App Store protections are ineffective, but the company’s own statistics are also not necessarily painting a complete picture.

The more interesting numbers would be the false positives—how many apps were incorrectly rejected and how many developers gave up because of such rejections—and the false negatives—how many bad apps were not caught until after they were in the store or are still in the store.

Rob Jonson:

Chatter was rejected about 8 times for spam before finally being accepted with this REDACTION

Mysk:

Apple says it prevented over $2 billion in potentially fraudulent transactions. And this is only the transactions that got caught. How about the transactions that didn’t get caught? How much did they cost victims, who trusted the App Store? At Apple’s scale, even with 99% accuracy there would be a lot of mistakes.

James Thomson:

I think it says something about the scale of the App Store that Apple terminates more than a thousand developer accounts for fraud, per day.

Jeff Johnson:

It says the App Store is very profitable for scammers, otherwise they wouldn’t try so hard and so much.

Juli Clover (PDF, data, Hacker News, Slashdot):

Apple today published an inaugural App Store Transparency Report, something that the company agreed to provide to developers as part of a 2021 lawsuit settlement.

[…]

Developers appealed 18,412 app removals in total, and Apple restored just 616 apps. Apple says that apps that are appealed were typically pulled from the App Store for fraud or illegality, which is why the rejected appeal number is so high.

[…]

There are 36,974,015 registered developers, and in 2022, Apple terminated 428,487 developer accounts. According to Apple, developers are removed from the Apple Developer Program “for a number of reasons,” but most commonly because of accounts that are connected with other terminated developer accounts. 3,338 developers appealed their App Store bans, and Apple reinstated just 159 accounts.

Ryan Jones:

26% of app submissions are rejected (1.6 of 6.1M)

They say how many submissions were approved after rejection, but because there are multiple submissions per app we don’t know how many apps were eventually approved.

Basically, people go to the App Store wanting to download 1 specific app = No more browsing

And they redownload 2x as often as download = must be the major apps mostly, like Fb, Ig, banks, etc

Previously:

Monday, May 22, 2023

SwiftUICoreImage

Dan Wood:

Core Image is a wonderful image-processsing toolkit in macOS and iOS, but it’s a bit clunky to use. Even after Apple added Swift APIs to many of the filters (CoreImage.CIFilterBuiltins), it’s still pretty tedious to chain filters to images.

The purpose of this package is to provide an easier way to chain multiple filters to CIImage instances and then render them into SwiftUI (or any other context — SwiftUI is not needed).

[…]

Similarly to how SwiftUI view modifiers each return a modified View instance, these modifiers on CIImage take care of the core image chaining by creating a corresponding CIFilter, hooking up the inputImage for you, and returning the resulting outputImage.

[…]

The contents of CIImage-Filters.swift are generated source code, using code that I’ve included in this repository (CIImage-Generation.swift, not included in the package import). This loops through the core image metadata that Apple provides (CIFilter.filterNames(inCategories: nil)). Unfortunately this list is somewhat out of date and contains a number of inconsistencies that I’ve done my best to overcome.

Monduo 16-Inch Pro Duo

Eric Slivka:

The $800 Monduo Pro Duo isn’t the only dual portable external display accessory on the market, but of the major ones I’ve seen it comes the closest to approaching the high-end specs of the built-in displays on Apple’s notebooks. Optimized for 16-inch laptops like Apple’s larger MacBook Pro, the Pro Duo’s displays each measure in at a very similar 16 inches, with 100% DCI-P3 color support, 2560 ✕ 1600 resolution on each display, 500 nits of brightness, and variable refresh up to 144Hz.

[…]

That gives it a bit larger footprint than my 16-inch MacBook Pro while being slightly lighter, but it’s nearly twice as thick. Still, if you have a spacious computer bag with a couple of compartments as I do, there’s a chance the Pro Duo could slide right in there.

[…]

Once everything is physically connected, you’ll need to download the Monduo app, which manages the display drivers to support high-resolution options and synchronization with the built-in display.

I don’t understand why, even with USB-C, all these portable displays seem to need drivers. I ended up giving up on the AOC display because the drivers didn’t always work and seemed to cause crashes.

Previously:

Setting Up Sparkle

Sarah Reichelt:

Sparkle is an open-source update framework for macOS. It’s very popular and I’m sure you will have seen it used, even if you didn’t recognise it. But setting it up isn’t totally straight-forward, at least I didn’t find it so, which I why I’m using this post to document the process.

[…]

The Sparkle documentation is excellent and contains everything you need to know, but they allow for a wide range of use cases and configurations, which makes it difficult to follow at times.

[…]

Adding Sparkle to a sandboxed app requires some more steps[…]

[…]

Drag the image file into your disk image. Don’t worry about positioning it - you’re about to make the file invisible.

DropDMG is an easier way to create a disk image with a background picture, and it will code sign the .dmg file, too.

Previously:

Friday, May 19, 2023

2023 Automation April Shortcuts Winners

John Voorhees:

What Biatek did to solve this daily annoyance was to create Yes More Events, a shortcut that looks at your overdue tasks in Reminders and adds an event to the end of your day that starts at 11:45 pm and ends just before midnight. The event lists how many overdue events you have and includes the task titles in the event’s notes field. That way, if you finish your events for the day and find yourself with a little extra time, you can jump right into the shortcut-created event to pick a task or two to complete.

[…]

When you run the shortcut, you’re given four initial choices. You can start a workout, which opens up your list of activities. Once one is chosen, the Apple Watch’s Workouts app starts the corresponding workout. The other options available are logging your weight, water intake, or caffeine consumption.

[…]

The beauty of this shortcut is that, on macOS, the ‘Take Screenshot’ action can display the native screenshot tool’s crosshair anywhere on the system, allowing you to capture any region of the screen in seconds. Once this shortcut has been assigned a keyboard shortcut, you’ll be able to quickly take a screenshot of the QR code – it doesn’t have to be precise – and, a few seconds later, its link will open in a new Safari tab.

[…]

The only problem: inline conversion wasn’t brought over to macOS. […] Meme Maker, saw an opportunity for a macOS shortcut designed to replicate the inline unit conversion feature of iOS, and he got to work. The result is Inline Converter, a shortcut that is best experienced on the Mac – but which I also love to use on my iPad – that lets you select any text anywhere on the system and instantly converts recognized values for distance, volume, temperature, weight, and angles.

[…]

Feedback to Markdown can convert the RTF files generated by the Feedback app for Mac when pressing ⌘E (this is something I learned from this shortcut) into readable Markdown files.

Unfortunately, Feedback Assistant only lets you export one at a time.

Google Updates Inactive Account Policy

Juli Clover (via Hacker News):

Going forward, if a Google Account has not been used or signed into for at least two years, Google may delete the account and its contents. This includes content from Gmail, Google Docs, Google Drive, Google Meet, Calendar, YouTube, and Google Photos.

The policy is applicable to personal Google Accounts rather than those created for businesses and schools. Users with an inactive account will see those accounts being deleted starting in December 2023, but Google plans to provide plenty of notice before it starts to cull accounts.

Michael Simon:

Nor is it out of step with what Apple does. In fact, Apple will delete an inactive account a lot quicker than Google will and seemingly with less warning. Here’s what Apple says in its iCloud terms:

In addition, Apple may terminate your Account upon 30 days’ prior notice via email to the address associated with your Account if (a) your Account has been inactive for one (1) year; or (b) there is a general discontinuance of the Service or any part thereof.

Previously:

Update (2023-05-22): Ron Amadeo (via Bruce Schneier):

Google’s new inactive account policy already has people up in arms. The company announced on Tuesday that accounts that have gone unused for two years will be deleted, and a lot of people are asking what exactly this means for YouTube content. There are probably millions of videos out there from dead and inactive YouTube creators—would Google’s new data policy mean deleting nearly two decades of online history?

[…]

YouTube’s creator liaison, Rene Ritchie, clarified on Twitter that Google has “no plans to delete accounts with YT videos.” 9to5Google heard the same statement from a Google spokesperson. That is great news, but that’s also very vague and runs contrary to what all of Google’s current documentation says, including the blog post. Can people keep a Google account alive forever with a single video? We’ve had an email out to Google since Tuesday night asking for some kind of formal policy regarding YouTube videos, but we haven’t heard anything yet.

Thursday, May 18, 2023

macOS 13.4

Juli Clover (release notes, security, enterprise, developer, full installer, IPSW):

There are several bug fixes in the update, with Apple addressing problems with Auto Unlock with Apple Watch, Bluetooth keyboards, Screen Time, and VoiceOver. The update also adds a Sports feed in the sidebar of the Apple News app, and it introduces the simplified beta installation method that was first introduced in iOS 16.4.

See also: Howard Oakley and Mr. Macintosh.

Nathaniel Strauss:

Starting in macOS 13.4, there is no longer a way for Mac admins to programmatically manage beta program enrollments. During the 13.4 beta cycle it was announced seedutil is deprecated, to be removed entirely in a future release, and the only path forward to enroll in beta programs being Apple IDs. Apple has taken away a long used utility relied upon by Mac admins and not given much back in return.

Jeff Johnson:

So, uh, Apple credited me (and others) with a security bug, but… they didn’t actually fix the bug.

The description of the bug seems wrongish too.

Previously:

Update (2023-05-23): Howard Oakley:

Significant version changes seen among bundled apps include[…]

Howard Oakley:

There are several factors that could be responsible for Ventura’s updates being so relatively small.

[…]

Apple has also been steadily improving the engineering of macOS updates since the heady days of Big Sur. The minimum size of a Big Sur update was 2.3 GB for Intel and 3.3 GB for Apple silicon, which has reduced in Ventura to 0.5 GB and 1.9 GB respectively. On some older Intel Macs, these new more compact updates do take longer to prepare, but are normally far more rapid on Apple silicon Macs.

Big Sur seems to have marked the high tide for macOS update size. With improved engineering, falling overhead from firmware updates, and RSRs, macOS updates should be even lighter in their burden.

Howard Oakley:

The best solution is to enable network diagnostic logging, but as of macOS Ventura 13.4 that has changed and become more inaccessible, as it requires that SIP is disabled.

Previously:

Update (2023-05-30): Jeff Geerling:

Something’s seriously broken with monitor support in macOS Ventura 13.4

Now both computers I updated go into this endless monitor sleep/wake loop if I have the display off without sleep. […]

Happening on two different model LG 4K displays, one on MacBook Air M2, one on Mac Studio M1 Max.

If I put the Mac to sleep, the monitor powers off and stays off.

In both cases, this has never been an issue until updating to 13.4.

See also: Reddit and the Apple Developer Forums.

Update (2023-06-01): Dave Wood:

Holy. I updated to macOS 13.4 today, figuring it couldn’t get any worse than 13.2 that I was on. Boy was I wrong.

I use hot corners to put my displays to sleep. I just triggered the corner, and the machine rebooted.

This just happened to me this morning when I accidentally moved the mouse into the corner.

iOS 16.5 and iPadOS 16.5

Juli Clover (missing release notes, security):

In iOS 16.5, Apple is adding a new Pride wallpaper, a Sports tab in Apple News, and fixes for issues with Spotlight and Screen Time.

Previously:

Update (2023-05-23): Juli Clover:

This guide highlights all of the new features in the iOS 16.5 update.

Joe Rossignol:

Apple’s Lightning to USB 3 Camera Adapter does not work with iPhones and iPads that have been updated to iOS 16.5 and iPadOS 16.5, according to several users across the MacRumors Forums, Apple Support Community, and Reddit.

Update (2023-05-26): Contacts syncing is broken in macOS 13.4/iOS 16.5 (FB12205324). Editing a related name deletes all related names from the card on other devices. And then if you try to edit them there it deletes them from the original device. They also don’t export to .vcf.

macOS 12.6.6 and 11.7.7

Apple (full installer):

This document describes the security content of macOS Monterey 12.6.6.

Apple (full installer):

This document describes the security content of macOS Big Sur 11.7.7.

See also: Howard Oakley.

Previously:

Photomator for Mac

Tim Hardwick:

Photomator 3.0 today got its official release on macOS, bringing Pixelmator’s iPhone and iPad photo-editing app to MacBooks and Mac desktops for the first time.

With an interface that will be familiar to users of Photomator on iOS and iPadOS, the Mac app includes a fully fledged photo browser with native Photos app integration, allowing users to organize, duplicate, share, and favorite images, as well as sync edits between Photomator and the Photos Library.

I guess this is the new name for Pixelmator Photo. It’s $29.99/year or $99.99 lifetime, up from $23.99 and $54.99 when it was iOS-only.

It’s really cool how multiple apps can plug into the system photo library, but it has practical as well as hard limits, and it’s just not what I want to use to consolidate all of my photos and videos or use for long-term storage.

Previously:

Update (2023-05-24): Nick Heer:

But, as these are merely suggestions, it makes for an effectively no-lose situation: if the automatic repair or cropping works perfectly, it means less work; if neither are effective, you have wasted only a few seconds before proceeding manually.

The Photos integration is fantastic. If you have ever used a mixed Lightroom and iCloud Photos environment, the simplified workflow is a dream come true. Photomator is also a damn good RAW photo editor. While Photos has some editing tools built in, they are cumbersome for experienced users — there are three modes for white balance editing in Photos, but you cannot select Temperature/Tint as the default, for example. Photomator feels like it has been designed by people who edit photos for people who edit photos.

FTC Says Facebook Violated 2020 Consent Decree

FTC:

The Federal Trade Commission proposed changes to the agency’s 2020 privacy order with Facebook after alleging that the company has failed to fully comply with the order, misled parents about their ability to control with whom their children communicated through its Messenger Kids app, and misrepresented the access it provided some app developers to private user data.

[…]

This is the third time the FTC has taken action against Facebook for allegedly failing to protect users’ privacy.

Via Matt Stoller:

So the FTC will ban targeted ads to children, to stop the incentive to engage in surveillance.

[…]

Facebook is extremely mad and calls it a ‘political stunt,’ saying the FTC should focus on TikTok.

[…]

The order has some other requirements, like forcing a privacy assessment before launching new products.

[…]

What happens now? There will be a hearing where Facebook will make its case that they didn’t in fact violate the consent decree or laws against deception and tracking children online.

Nick Heer:

Strange how Meta, previously Facebook, keeps having problems with its video and advertising products in ways which benefit the company. It should really look into why that is so often the case.

Previously:

Facebook owner Meta has been fined a record 1.2 billion euros ($1.3 billion) for transferring EU user data to the United States in breach of a previous court ruling, Ireland’s regulator announced on Monday.

Meta seems to be right in pleading scapegoat for a technique used by plenty of other businesses. However, few can claim the scope and scale of Meta’s violations, and especially its frequency. Companies owned by Meta represent seven of the ten greatest penalties issued under GDPR rules.

Wednesday, May 17, 2023

Apple’s 2023 Accessibility Feature Preview

Apple (Hacker News):

Coming later this year, users with cognitive disabilities can use iPhone and iPad with greater ease and independence with Assistive Access; nonspeaking individuals can type to speak during calls and conversations with Live Speech; and those at risk of losing their ability to speak can use Personal Voice to create a synthesized voice that sounds like them for connecting with family and friends. For users who are blind or have low vision, Detection Mode in Magnifier offers Point and Speak, which identifies text users point toward and reads it out loud to help them interact with physical objects such as household appliances.

[…]

With Live Speech on iPhone, iPad, and Mac, users can type what they want to say to have it be spoken out loud during phone and FaceTime calls as well as in-person conversations. Users can also save commonly used phrases to chime in quickly during lively conversation with family, friends, and colleagues. Live Speech has been designed to support millions of people globally who are unable to speak or who have lost their speech over time.

For users at risk of losing their ability to speak — such as those with a recent diagnosis of ALS (amyotrophic lateral sclerosis) or other conditions that can progressively impact speaking ability — Personal Voice is a simple and secure way to create a voice that sounds like them.

Will there be a way to export your Personal Voice so that you aren’t totally reliant on iCloud to preserve it? Many of these users will not be able to just re-record new prompts if something goes wrong or if they need to switch to a different Apple ID.

Emma Roth (via Hacker News):

Additionally, Apple is introducing streamlined versions of its core apps as part of a feature called Assistive Access meant to support users with cognitive disabilities. The feature is designed to “distill apps and experiences to their essential features in order to lighten cognitive load.” That includes a combined version of Phone and FaceTime as well as modified versions of the Messages, Camera, Photos, and Music apps that feature high contrast buttons, large text labels, and additional accessibility tools.

[…]

As an example, Apple says a user can aim their device’s camera at a label, such as a microwave keypad, which the iPhone or iPad will then read aloud as the user moves their finger across each number or setting on the appliance.

Shelly Brisbin:

Photos and Music each display their contents in a grid that’s “flatter” in structure than the hierarchical interfaces the standard versions of those apps offer.

Assistive Access is the closest Apple has come to an interface designed specifically for people with disabilities or elders—an option that Android has offered via its support for alternative launchers. It will be interesting to see if it’s full-featured enough to not only support users with cognitive disabilities, but also offer a “grandparent-friendly” experience for those trying to choose between and iPhone and an Android phone.

[…]

Last year’s accessibility preview featured a handful of enhancements for hearing aid owners who use an iPhone. This year, Apple says support for Made for iPhone Hearing Aids is coming to the Mac. That’s been a long time coming. You’ll need an M1 or better Mac to make the connection, though.

Previously:

Update (2023-05-19): Mr. Macintosh:

In a few of the images, System Settings has a forward button ?

Joe Rossignol:

Those with an iPhone, iPad, or newer Mac will be able to create a Personal Voice by reading a randomized set of text prompts aloud until 15 minutes of audio has been recorded on the device. Apple said the feature will be available in English only at launch, and uses on-device machine learning to ensure privacy and security.

Harry McCracken:

People who create Personal Voices will get to judge for themselves how well the company met this goal. With audio samples I heard, reproducing a variety of distinct voices, the intonation and pacing could be a bit flat, as computerized speech tends to be. Overall, though, they were impressive, entirely distinct from each other, and certainly worlds apart from the one-voice-fits-all feel of most of the synthesized speech in our lives.

[…]

Those creating voices for later use will presumably want to sync them to their iCloud account for eventual access on devices they may not yet own. But that process only happens at their express instruction, and the data is encrypted on Apple’s servers.

So backup is opt-in, and there’s no mention of exporting.

John Voorhees:

To get a better sense of what some of this week’s announcements mean, I spoke to David Niemeijer, the founder and CEO of AssistiveWare, an Amsterdam-based company that makes augmentative and alternative communication (AAC) apps for the iPhone and iPad, including Proloquo, Proloquo2Go, and Proloquo4Text. Each app addresses different needs, but what they all have in common is helping people who have difficulty expressing themselves verbally.

.zip TLD

Christina Yeh (tweet, via Hacker News):

Google Registry has launched some of the most popular (and secure) top-level domains, such as .app and .dev. Today, we’re adding eight new extensions to the internet: .dad, .phd, .prof, .esq, .foo, .zip, .mov and .nexus.

Terence Eden (via Hacker News):

Many years ago, Google applied for the .zip Top Level Domain. ICANN, in its infinite wisdom, granted it. And now, I think, bad things are going to happen.

[…]

So what happens when things which are not domain names look like they are domain names? I’ve been worrying about this for a few years[…] Anyway, have fun determining if the link you see was ever intended to link to a website!

He’s referring to confusion over the .zip filename extension for compressed archives. Amazingly, the original idea for the TLD was in reference to the Iomega Zip drive.

Karen West (via Hacker News):

You can now purchase .zip and .mov domain names, like the one this page resides on! Isn’t that just fun for the entire family?

[…]

For decades engineers have been working hard to try and make the internet less susceptible to phishing attacks, look-alike domains, etc., and now money men have decided to unravel that work so somebody can purchase anyword.zip as a domain name.

Previously:

Update (2023-05-18): Ezekiel Elin:

I’ve seen points claiming that apps will auto link something like document.zip and then a scammer could pre-emptively have created a scam website - but I feel like most systems don’t auto link without http(s):// and when they do it’s usually just .com/.org

Martin Brinkmann (via Sören):

The .zip extension allows cyber criminals to run phishing campaigns that abuse the fact that .zip is a popular file extension and also a top level domain.

Domains such as officeupdate.zip or microsoft-office.zip have already been used in phishing campaigns. The latter is still online but safe browsing should warn users prior to accessing the site in question. Several of the registered domains could be used in phishing campaigns, while others may be used for legitimate purposes.

[…]

Some applications may attach hyperlinks to ZIP file names now, which may lead to the firing of DNS queries and the leaking of information to the .zip domain.

The ICSS recommends to disable access to .zip domains entirely until the dust settles and risks can be accessed.

Bobbyr (via Sören):

Can you quickly tell which of the URLs below is legitimate and which one is a malicious phish that drops evil.exe?

[…]

As you can see in the breakdown of a URL below, everything between the scheme https:// and the @ operator is treated as user info, and everything after the @ operator is immediately treated as a hostname. However modern browsers such as Chrome, Safari, and Edge don’t want users authenticating to websites accidentally with a single click, so they will ignore all the data in the user info section, and simply direct the user to the hostname portion of the URL.

Volume Names, Mount Points, and Normalisation

Howard Oakley:

[The] current Data volume, by default named either Macintosh HD - Data (Intel) or simply Data (Apple silicon), isn’t mounted in /Volumes at all, but at /System/Volumes/Data. This article looks at another situation where APFS volumes will appear at mount points that differ from their volume name, when there’s the potential for a name collision, such as one resulting from Unicode normalisation.

[…]

The last time that I looked at the state of normalisation in APFS, almost two years ago, I found there were still issues and bugs, most weirdly with the fact that a volume whose name contains composed forms (Form C) was inaccessible to Spotlight indexing. That wasn’t helped by the fact that, unlike the Finder, Disk Utility doesn’t normalise the names of APFS volumes, and lets you create two volumes in the same container that differ only in their normalisation, and appear identical to the user.

[…]

APFS and Disk Utility are very flexible when it comes to naming volumes. If you want, you can mix cases across volumes that aren’t case-sensitive, and even use exactly the same name for as many volumes as you want, because the file system doesn’t identify volumes by name. What’s most important to APFS is the UUID of the volume: try mounting two volumes with identical UUIDs and you’ll see what I mean.

[…]

What happens is that the volume name is normalised to Unicode Form D, or decomposed, and compared without case-sensitivity to existing mount paths. If there’s any clash, then a number is appended after the normalised name to form the additional mount path.

Previously: