Archive for October 2024

Friday, October 4, 2024

“Damaged” Mac App Store Apps

Keith Gugliotto:

The Mac App Store places a receipt file in each purchased application. The receipt includes a certificate the application uses to validate that receipt to be sure you’ve made a bona fide purchase. That certificate is only valid for a limited amount of time – in our experience, up to about 25 months, though sometimes significantly less, which could indicate the App Store renews these certificates every so often. So, when you see this “damaged” message out of the blue, it’s almost surely because the certificate in the receipt has expired. You could set the date on your Mac back a bit to work around it, but you really want to straighten things out so you don’t have to go through that fun every time you sit down to use an application.

Usually, as long as your current Apple Account has a valid purchase for the application in question, you won’t ever see the “damaged” message because the application will tell the Mac the receipt’s invalid, the Mac will automatically refresh your receipt, and you’re on your way. You should only see the message in those three cases we outlined above.

Matthias Gansrigler:

Are any other Mac developers observing a surge of support requests for “<App> is damaged and can’t be opened. Please re-download it from the Mac App Store” recently?

It started yesterday, out of the blue. macOS 15, 14, 13 and 12 as well…

I am not seeing this personally, and I’m not sure what’s going on here, but there are multiple reports of problems launching Mac App Store apps.

This bug thread suggests that some receipt validation code needs to change because Sequoia adds MAC address randomization. This post and other sources suggest that it’s important to use StoreKit 2 instead of validating receipts directly, although perhaps that only pertains to IAP. Apple’s sample code does not seem to have changed.

Previously:

Setting Up an iOS VPN Without an App

ForestVPN:

Many of us rely on VPN apps to secure our online activities, but did you know there’s a way to set up a VPN on your iPhone without downloading an app? This method not only saves space but also provides a seamless experience for users who prefer a more direct approach.

Via John Gruber:

It just requires some futzing in Settings and a VPN provider that supports it. Presumably, this technique remains available to iPhone users in Russia.

[…]

VPN apps remove complexity from this process, but it’s worth noting that VPN access doesn’t require an app.

However, at least in the case of ForestVPN, it’s confusing how to sign up for the service without using an app. If you click Get Started it just directs you to download the app. It looks like if you click Get MacOS CLI it will let you sign up on the Web.

Riley Testut:

Anecdotally, Russia has long been the most popular country for AltStore Classic usage by far

Previously:

macOS 15.0.1

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

According to Apple’s release notes, macOS Sequoia 15.0.1 fixes a bug that could cause the Messages app to crash when a message with a shared Apple Watch face was sent, and it improves third-party software compatibility.

See also: Mr. Macintosh and Howard Oakley.

Previously:

iOS 18.0.1

Juli Clover (release notes, security, enterprise, no developer):

iOS 18.0.1 update addresses issues with several bug fixes for the touch screen, camera, and Messages app.

Previously:

iPadOS 18.0.1

Juli Clover (release notes, security, no developer):

Apple today released iPadOS 18.0.1 for the iPad, and it brings iPadOS 18 to the for M4 iPad Pro models for the first time since the iPadOS 18 update was pulled for those devices. After iPadOS 18 was released, it was found that a small number of M4 iPads were bricked when the software was installed. If you haven’t been able to install iPadOS 18 on your iPad Pro, it is now available.

Previously:

watchOS 11.0.1

Juli Clover (release notes, no security, no developer):

watchOS 11.0.1 introduces bug fixes for the Apple Watch. It fixes an issue that could cause the Music app to crash, plus it addresses a bug that could cause the battery to drain faster than expected. There’s also a fix for a bug that could cause the touchscreen to be unresponsive on the latest Apple Watch models, and a bug that could cause unexpected restarts.

Previously:

visionOS 2.0.1

Juli Clover (release notes, no developer, no security, no enterprise):

The visionOS 2 update fixes a bug that could cause YouTube in Safari to freeze, plus it addresses an issue with Safari Web Extension data.

Previously:

Thursday, October 3, 2024

PDFpen/Nitro and Cleverbridge

Matt Henderson:

There used to be a great PDF app for the Mac called something like PDFPro [PDFpen]. At some point it got acquired by @NitroHQ, and began to ask to upgrade to a new version seemingly every time I launched it—up to version 13.

Today, on macOS 15, I needed it, but it wouldn’t launch. So I visited the website and it’s been acquired by a faceless enterprise company called @cleverbridge.

Version 14 for Mac is $170 (!) but I needed it so off to checkout. I enter my details, all fields light up green, and—purchase failed, please fix the “incomplete fields”. Wtf.

They double-billed him and signed him up for an unwanted subscription.

Not only that but I get activation instructions for the Windows version of the app! The Mac version simply shows a login screen.

But I don’t have an account! Create an account with the same email address, and their system doesn’t recognize I’ve purchased the app.

[…]

Visiting the “customer support portal” and trying to submit a request results in a—blank page.

As far as I can tell, Nitro purchased Cleverbridge and is using it to process payments:

Online orders of Nitro PDF Pro are processed (payment and order fulfillment) by our partner, Cleverbridge, Inc.

If you are an account admin who has purchased a Nitro Pro subscription through our partner reseller CleverBridge, you can now purchase additional licenses directly from within the Nitro Admin app.

[…]

When your payment is successfully processed, you will be directed to a Purchase Confirmation page with your CleverBridge Order number and invoice.

But if you need a refund you’re supposed to contact Nitro:

If you recently purchased Nitro Productivity Suite and wish to request a refund, please contact Nitro directly via their website. They would be happy to assist you with your request. While Cleverbridge is a partner of Nitro, we do not currently process their refunds.

It’s too bad that Smile didn’t want to keep developing and supporting the app.

Previously:

Finder Sync Extensions Removed From System Settings in Sequoia

ZigZag (also):

Even though Finder Sync extensions are embedded and distributed in their containing applications (like containing application FileUtils embeds its extension FileUtilsSync), the actual hosting application for those extensions is Finder. They modify Finder’s appearance and behavior, adding menu items and icon badges. Hence, fundamental things related to these extensions, like registering with OS, start and termination, as well as enabling and disabling them, aren’t controlled by the containing application, but by Finder and macOS instead. Registration with OS is done by Launch Services. It usually happens at the time the containing application is launched for the first time (after passing TCC quarantine check). Starting and termination of Finder Sync extension is also controlled by Finder/macOS and there may even be more processes of the same extension running, depending on how many Finder windows and file selectors (open/save panels) are open. The containing application can surely try to start and terminate its embedded extension, but the documentation clearly discourages that, since it can collide with how Finder controls them.

Finally, there’s enabling and disabling Finder Sync extensions. Even though an extension can be installed and registered, per user request it can be disabled (thus, completely ignored) and enabled. Containing application can do this programmatically, by tasking pluginkit command line tool to list, enable and disable (any, not just Finder Sync) extension, or using private NSExtension class found in FoundationKit framework. End users traditionally performed this task in System Settings application (System Preferences on macOS 12 Monterey and earlier). Well… Until macOS 15 Sequoia! In the latest incarnation of macOS, there isn’t any graphical UI way to manage Finder Sync extensions!

[…]

Revealing “Extensions” settings in System Settings on Ventura shows the same subsections like in System Preferences on Monterey, with one, for this story very important, change… “Finder Extensions” subsection is missing! The only place to find Finder Sync extensions settings is “Added Extensions” subsection. Early versions of Ventura even had “Finder Extensions” subsection, dedicated to Finder Sync extensions, but it was buggy and unreliable.

[…]

And then macOS 15 Sequoia came some 17 days ago. In its third reincarnation, System Settings application experienced third rearranging and shifting. “Extensions” settings are now under “General” section, “Logging Items & Extensions” subsection. […] Yes, you see it right, there is no “Added Extensions” section!

Managing extensions using the pluginkit command-line tool is not very friendly (and can’t be invoked by a sandboxed app), so Dragan Milić has written a free app called FinderSyncer that puts a nice user interface on top.

It’s not entirely clear what Apple is doing here, but the impression I get is that these days Apple is focusing on the File Provider Extension architecture that’s used for cloud syncing. It’s a shame because this does not allow all the same functionality as Finder Sync Extensions:

I believe many other developers understood it the same as me, especially considering the fact that Finder Sync extensions provide a way to add custom menu items to Finder’s contextual menu. I think most developers saw it as a sort of continuation of old CMPlugin API from MacOS (yes, the capital ‘M’) 8/9 days, which was available until Mac OS 10.6 Snow Leopard. It’s seen as a way to extend Finder’s capabilities, by executing custom operations (not limited to “synchronize the contents of a local folder with a remote data source”) on files selected in Finder.

I think I know about 50 - 60 applications embedding Finder Sync extensions at the moment, and only a dozen of them actually “synchronize the contents of a local folder with a remote data source”, mostly coming from huge and well known cloud providers (Dropbox, Google, Microsoft…). All others, mostly coming from independent Mac developers, offer some custom operations of files selected in Finder, nothing related to any sort of syncing. I believe MR_Noodle’s case is the similar one, “outside of its recommended use case”. Taking the above into consideration, I think it’d be a huge mistake for Apple to discontinue and deprecate Finder Sync extensions without providing functionally equivalent replacement. That would break a lot of third party Mac software and render those applications completely useless.

Previously:

IDA Pro 9 Switches to Subscriptions

Alex Petrov (release notes):

This release is amplified with new disassemblers and decompilers, such as the RISC-V decompiler, the disassembler support of T-Head instruction set for the XUANTIE-RV architecture, the nanoMIPS decompiler and disassembler, and the Web Assembly (WASM) disassembler.

Balaji N:

The latest version of the Interactive Disassembler (IDA) software introduces a unified licensing model, allowing users to operate a single license across Windows, Linux, and macOS platforms.

Also, there are no more perpetual licenses, only subscriptions. The home version (2 cloud-based decompilers) is $365/year, while the Pro Expert 2 version (2 local decompilers) is $2,999/year.

Stefan Esser:

In light of recent changes to the IDA license model my training courses will be adjusted to fully support Ghidra scripting within the next 12 months. Existing IDA 8.x scripts will not be ported to IDA 9.

No idea what happens to the free version but for pay versions will become a yearly subscription that actually expires one month after it runs out. IDA will stop working then. Furthermore the subscription with 2 decompilers will cost nearly double what I pay now for 4 dexompiers

And it seems like they are reneging, in that if you had recently purchased a perpetual license for version 8, you were supposed to get free updates for a year. Instead, they are giving access to version 9 for a year, but then it stops working and you have to go back to version 8 or sign up for a subscription.

Previously:

Restoring Shift-Key Slow-Motion Minimizing to Dock

John Gruber:

What I’d forgotten is that Apple had removed this as default behavior a few years ago (I think in MacOS 10.14 Mojave), but you can restore the feature with this hidden preference, typed in Terminal:

[…]

defaults write com.apple.dock slow-motion-allowed -bool YES; killall Dock

Wednesday, October 2, 2024

Juno for YouTube Removed From the App Store

Christian Selig (tweet, Mastodon, Hacker News):

For those not aware, a few months ago after reaching out to me, YouTube contacted the App Store stating that Juno does not adhere to YouTube guidelines and modifies the website in a way they don’t approve of, and alludes to their trademarks and iconography.

I don’t personally agree with this, as Juno is just a web view, and acts as little more than a browser extension that modifies CSS to make the website and video player look more “visionOS” like. No logos are placed other than those already on the website, and the “for YouTube” suffix is permitted in their branding guidelines. Juno also doesn’t block ads in any capacity, for the curious.

I stated as much to YouTube, they wouldn’t really clarify or budge any, and as a result of both parties not being able to come to a conclusion I received an email a few minutes ago from Apple that Juno has been removed from the App Store.

The App Store guideline is stacked against developers:

5.2.2 Third-Party Sites/Services: If your app uses, accesses, monetizes access to, or displays content from a third-party service, ensure that you are specifically permitted to do so under the service’s terms of use. Authorization must be provided upon request.

So it doesn’t matter whether the app was actually violating the terms of use. If YouTube complains and won’t provide authorization, there’s nothing you can do. There seems to be no limiting factor that would prevent any Web site from objecting to any app that displays Web content.

Juli Clover:

YouTube does not have a dedicated app for the Vision Pro, which is why Selig designed and released Juno last February. Prior to when the Vision Pro launched, YouTube said that it would not develop a Vision Pro app, nor would it allow the YouTube iPad app to run on the headset. With Juno removed, those who want to watch YouTube on Vision Pro will need to use Safari.

Kyle:

Dang, just last night I thought to myself, “if it wasn’t for Juno I would never use my Vision Pro.”

David Barnard:

Welp… with that, the one use-case I really cared about on Vision Pro is now gone (or at least unable to be updated, and Google may eventually break the app).

Vision Pro is probably the worst “business investment” I’ve ever made. As much as I love the hardware, there’s just not enough content and not enough compelling apps. If Google does break Juno, my several hour a week usage will probably drop to near zero.

John Gruber (Mastodon):

I don’t expect to see YouTube launch a native VisionOS app soon, and even if they do, I doubt it’ll be anywhere near as good as Juno. What I was obviously wrong about in that February post was thinking that YouTube wouldn’t care about Juno’s existence, given that Juno did not block ads. All it did was make the YouTube experience great on Vision Pro.

This makes Selig — one of the most gifted indie developers working on Apple’s platforms today — 2 for 2 on getting hosed by big platforms for which Selig created exquisitely well-crafted clients.

It’s a shame, but clients for services that you don’t control just seem to be a bad place to be. If the service is free, the company providing it can kill your app. If it’s paid, Apple will want a cut of the revenue, even though it doesn’t pass through you.

Previously:

Update (2024-10-03): Andre LaBranche:

There is exactly one reason that Juno is very easy for YouTube to kill and yt-dlp is very hard for YouTube to kill.

Pinning iCloud Drive in Sequoia

Howard Oakley:

The reason for this bizarre and annoying interface is the way that pinning is implemented.

When you pin files individually or in groups of up to ten, each file gains its own pinning extended attribute, of com.apple.fileprovider.pinned. But when you pin a folder, only that folder gains the extended attribute, none of the files or folders within it. The whole folder and the paths within it are designated as being pinned. And, as far as I can tell from the absence of any better information in Apple’s missing documentation, there’s no single method to determine whether a file in iCloud Drive is pinned.

Instead, you have to both

  • look for the extended attribute attached to the file, and
  • check all the folders in its path to determine if any of them has the extended attribute, which would then pin everything in their path.

Apple doesn’t document any file or URL attribute that can be used to determine whether a file or folder is pinned.

I think the design makes sense in that if I pin a folder I do want its future contents to be pinned. This is also how inclusions and exclusions for backup software generally work. But it seems that the interface could be clearer and more helpful.

Previously:

Update (2024-10-03): Howard Oakley:

If you have 100 files in a folder and want to pin 99 of them, you have to select groups of no more than 10 and pin each group, ten times.

Migrating the TelemetryDeck SDK to Swift 6 Mode

Cihat Gündüz:

And this summer at WWDC 2024 the longest session of them all was migrating your app to Swift 6 for a reason. This major new update to the language brings a new level of safety – namely data-race safety – which is awesome news for more correct code, but it also comes with a lot of new requirements we all need to adapt to.

[…]

The following 3 sections explain how we fixed the ~30 issues we've run into in our code, grouped by the solution we applied and an explanation why we opted for that solution with a code sample.

[…]

As ISO8601DateFormatter is a type defined within Foundation, we can't make it concurrency-safe itself, so we just need to deal with its mutable nature and work around it. The easiest way to this in our case was to turn our let constant into a get-only computed property, like so[…]

I find this aesthetically displeasing. It would be unusual and bad form to modify the properties of a shared formatter. But there’s no way to tell Swift you’ll treat it as immutable, so therefore we give every user a fresh copy? There’s probably a way to wrap it in a Sendable type, but how much do you want to contort your code to avoid this inefficiency?

Migrating to Swift 6 mode with all of its data-race safety glory was not an easy task. Despite our small project size, we ran into many warnings that all looked similar on the surface, but each of them needed careful consideration.

Previously:

Update (2024-10-03): Jesse Squires:

Ok so it appears someone has botched Swift Concurrency for UICollectionViewDiffableDataSource.

How are you supposed to work around this?

Local Network Privacy on Sequoia

Collin Allen:

Running into a Sequoia bug where third party binaries running under a launchd agent are denied local network access despite approving the privacy prompt. This has the effect of making my iOS app’s CI unable to deploy successful builds, as my deployment tool is not one that ships with macOS.

Quinn:

  • If you run a tool from Terminal, then Terminal is considered the responsible code and, as a system app, it’s not subject to local network privacy.

  • If you run an executable as a launchd daemon, it runs as root and local network privacy does not apply to code running as root.

However, if you configure the executable to run as a launchd agent, you will see local network privacy prompts.

dverevkin:

Here my experiments also show different results - if the bundled application is launched as a launchd daemon, the prompt will appear, even though the app runs with root privileges[…]

And, apparently, even approving the prompt doesn’t work.

Previously:

Tuesday, October 1, 2024

Hurricane Helene and Messages via Satellite

Ryan Christoffel:

Hurricane Helene has caused massive damage and taken over 100 lives across several US states. Many thousands of people are without power and/or cell service. But in the wake of the storm, reports have surfaced about a key iOS 18 feature that has been a lifeline for survivors: Messages via satellite.

[…]

To learn more about Messages via satellite, Apple has a support document available here.

Satellite messaging was added in iOS 16 (for iPhone 14 and newer) but only supported contacting emergency services. With iOS 18, you can also contact family and friends when there’s no Wi-Fi or cellular coverage.

Eric Berger:

Unfortunately, the National Climatic Data Center is based in Asheville, North Carolina. As I write this, the center’s website remains offline. That’s because Asheville, a city in North Carolina’s Blue Ridge Mountains, is the epicenter of catastrophic flooding from Hurricane Helene that has played out over the last week. The climate data facility is inoperable because water and electricity services in the region have entirely broken down due to flooding.

[…]

So how does a region nearly 500 miles from the Gulf of Mexico become devastated by flooding from a hurricane that originated there?

The answer is that Helene’s rapid movement inland—it was one of the fastest-moving storms at landfall in the Gulf of Mexico in recent history—created a massive river of atmospheric moisture and funneled it into parts of North Carolina, northern Georgia, and southeastern Tennessee.

Kanishka Singh:

The White House said on Monday dozens of Starlink satellite systems that provide high-speed internet access were in use in North Carolina, with over 100 more in transit to areas devastated by Hurricane Helene.

Tommy Greene (Hacker News):

Spruce Pine sits about an hour northeast of Asheville, Mitchell County, and is home to the world’s biggest known source of ultra-pure quartz—often referred to as “high-purity quartz,” or HPQ. This material is used for manufacturing crucibles, on which global semiconductor production relies, as well as to make components within semiconductors themselves.

[…]

Spruce Pine supplies around 70 percent of the naturally occurring HPQ that is needed for computing devices and products. The site’s market position and significance were underlined in 2019 when a manager for Quartz Corp, one of the two main mining companies that works the deposit, told the BBC: “Inside nearly every cell phone and computer chip you’ll find quartz from Spruce Pine.”

Previously:

Swift Concurrency and Objective-C

Paul Haddad:

Anyone know why calling the following in a MainActor class/func

MyTest.increment(1) { result in
    NSLog("result=\(result)")
}

crashes (asserts) when building with Swift 6?

I get that its not happy that the completion is coming in on another dispatch_queue but it should complain about it at compile time, or ignore it at run time.

Unfortunately, it seems to be designed this way.

OneSadCookie:

SE-0423 “Dynamic actor isolation enforcement from non-strict-concurrency contexts” adds the crash (otherwise your “safe” Swift 6 code is unsafe).

It’s not that the code is unsafe but that neither the Swift compiler nor the Swift runtime can prove that it’s safe because the MyTest class is written in Objective-C. You are supposed to annotate your Objective-C code so that Swift Concurrency can understand it, though this is not really documented.

Doug Gregor:

In Swift 5 mode, this code silently introduces a data race into the program.

In Swift 6 mode, the data race is caught by the dynamic isolation check. That’s the first point at which the data race can be detected, and the check is there to prevent this race from becoming weird runtime behavior.

This is all as designed. If that Objective-C code were Swift 6 code, we’d catch the error at compile time. As Objective-C, runtime is the earliest it’s possible to detect the race. Enabling Swift 6 language mode means turning previously-unobserved or undiagnosed data races into ones that fail predictably to flush out any contract violations outside of the Swift 6 code. As more code enables Swift 6, the runtime checks get replaced with compile-time.

Swift 6 mode is being “helpful” by proactively crashing the app even though there’s not necessarily a problem. It may be that it just doesn’t understand that GCD is being used to call everything on the right thread.

I get why Swift 6 is designed this way, but I don’t understand how you’re supposed to make the transition. Swift 5 mode gives no errors at compile time and doesn’t even log any errors at runtime. Swift 6 mode gives no errors at compile time and crashes at runtime. To get from one to the other you’re supposed to go through the code line-by-line and not make any mistakes.

Personally, I’m skeptical of the benefit of switching to Swift 6 mode with a hybrid codebase. If you started off with good code, it seems more likely that you’ll get some annotation wrong and have Swift 6 trigger an unnecessary crash than that you actually discover a latent concurrency bug that matters. I think it makes more sense to migrate the code to Swift before flipping the switch. Then you can get errors at compile time instead of at runtime.

Mike Apurin:

I think that Swift 5 mode doing nothing is part of the problem here. I’ve run in similar issues in Combine and was very blindsided by it. There is no way to progressively discover and deal with such isolation violations, just enabling 6 mode and praying.

But this illustrates that porting your code to Swift doesn’t fully solve the problem, either. It seems that you still have to annotate your closures because of Apple’s code.

Matt Massicotte:

The core problem, in my opinion, was Combine was not updated and that’s bananas.

Previously:

Update (2024-10-02): See also: further discussion on Mastodon.

Epic’s Document Request and Apple’s Injunction Challenge

Anthony Ha (Hacker News):

Apple faces a looming deadline to produce what it says are more than 1 million documents related to recent App Store changes.

On Friday, Judge Thomas S. Hixson denied the company’s attempt to extend that deadline, describing the request as “bad behavior.” So Apple’s deadline is still Monday, September 30: “It’s up to Apple to figure out how to meet the deadline, but Monday is indeed the deadline.”

[…]

In August, a judge directed Apple to produce all documents related to how it decided on the new App Store rules. But on Thursday, Apple said Epic’s search terms surfaced more than twice as many documents as expected, so the company needed two more weeks to review what turned out to be “north of 1.3 million documents.”

Ben Lovejoy:

A second judge in the Apple versus Epic Games lawsuit has implied that the Cupertino company has lied to the court. It comes after the original judge strongly implied that Apple had not told the truth about the reasons for its new App Store policy.

A second judge tasked with overseeing Apple’s disclosure of decision-making documents in the antitrust case said that a court filing made by the company was “simply not believable” …

[…]

Apple had claimed its decision wasn’t financially motivated, despite the 27% commission being identical to 30% less the 3% typically charged by payment processors (which would now be paid by Epic). The judge expressed skepticism, and ordered the iPhone maker to hand over all documents leading up to it decision to continue charging commission even on sales made outside the App Store.

[…]

In a response (spotted by The Verge), the Judge Hixson has rejected that request, and said that Apple’s claim that it had only just discovered this error was “simply not believable.”

Wesley Hilliard:

The Epic vs Apple saga resulted in an injunction forcing Apple to remove its anti-steering rules, but Epic wasn’t happy with Apple’s implementation. After more back and forth, Apple was meant to produce 1.3 million documents related to the App Store rules, but it produced something else unexpected on Monday.

Apple has filed for the court to set aside its injunction based on two new sets of precedents that didn’t exist when the injunction was filed. The 32 page court document goes into excruciating detail, and was first shared by X user Vidushi Dyall.

Basically, Apple says the injunction is no longer viable given two specific cases that took place in recent months — Beverage vs Apple and Murthy vs Missouri. The first is a state case that establishes Apple’s anti-steering rules aren’t unfair, and the second is, well, complicated.

Jeff Johnson:

The weird thing about the continuing Epic Games v. Apple case is that Epic is still banned in the US App Store, so even if they win on the anti-steering charge, they can’t take advantage of any remedy.

Previously:

Sequoia’s Warning When Turning Off Bluetooth

Jeff Johnson (Mastodon, Hacker News):

Does this prompt appear monthly? No, that would be far too convenient. So how often? Every. Single. Time. You. Try. To. Disable. Bluetooth.

Have I mentioned that Apple re-enables Bluetooth on every OS update on purpose? This behavior continues with macOS 15. Also, Bluetooth is notorious for security vulnerabilities; just google site:support.apple.com bluetooth “security content”.

The prompt warns that I “won’t be able to use a Bluetooth keyboard or mouse,” despite the fact my Mac mini already has a USB keyboard and mouse plugged in. Indeed, the Mac isn’t using any Bluetooth devices, and macOS knows this but doesn’t care. Moreover, the Bluetooth prompt appears even when all Bluetooth-related features are disabled such as AirDrop and Handoff. There’s no “intelligence” to the prompt.

[…]

The issue isn’t whether the existence of a warning makes sense. The issue is that the warning can’t be suppressed. The prompt has no “Don’t ask me again” checkbox.

Phillip Cohen:

thankfully, looks like you can still turn it off without a confirmation by using the shortcut action, but still ridiculous

Jeff Johnson:

The prompt also appears on macOS 14.7 (but not macOS 13.7).

The prompt does not appear on laptops.

Previously: