Automation & Scripting

RSS for tag

Learn about scripting languages and automation frameworks available on the platform to automate repetitive tasks.

Automation & Scripting Documentation

Posts under Automation & Scripting subtopic

Post

Replies

Boosts

Views

Activity

terminal fulldisk access fails for tmutil latestbackup
I am on MacOS 15.5 trying to access tmutil latestbackup in AppleScript: set latestBackup to do shell script "tmutil latestbackup" It works perfect when run from script editor, and script editor is in full disk access permission list. When I export to an app and run it it fails with: Error retrieving latest backup: tmutil: latestbackup requires Full Disk Access privileges. To allow this operation, select Full Disk Access in the Privacy tab of the Security & Privacy preference pane, and add Terminal to the list of applications which are allowed Full Disk Access. Error code: 80 Terminal is on list, as is name of the app. I have same issue running in safe mode. I have tried deleting and redefining full disk access entries, all to no avail. Apple tech support says its a developer issue, but code works in script editor. any ideas?
2
0
92
May ’25
Does INIntent no longer work on macOS? Can't get shortcut to show up in Shortcuts app
Was going to add a shortcut to an app via INIntent. I followed the WWDC developer.apple.com/videos/play/wwdc2021/10232/?time=986 Steps: Created a .intentdefinition file and created an intent. Added the intent to .intentdefinition and compiled the app. Import the header file for the custom intent in the AppDelegate MyIntentname.h Have the AppDelegate conform to the protocol created in the generated code. Implement: -application:handlerForIntent: and return self (the app delegate) Run the app. Open the Shortcuts app and search for the 'shortcut' (according to the WWDC video linked above it should show up in the actions list). Doesn't show up in the list. I tried moving the build application out from Debug to my Applications folder to see if that would help the Shortcuts app find it, but it didn't. Am I missing a step/doing something wrong?
2
0
80
May ’25
osascript System Events Failed to list Processes That Have The Same Name
I ran the following script while both VSCode and Windsurf were open. tell application "System Events" set electronProcesses to every application process whose name is "Electron" set outputText to "" repeat with p in electronProcesses set outputText to outputText & "Process: " & name of p set outputText to outputText & ", Displayed name: " & displayed name of p set outputText to outputText & ", Frontmost: " & frontmost of p & " " end repeat return outputText end tell The script incorrectly returned two Electron processes, where both were showing Windsurf as the displayed name. The output of the above script is: Process: Electron, Displayed name: Windsurf, Frontmost: false Process: Electron, Displayed name: Windsurf, Frontmost: false Separately, both Windsurf and VSCode share the same process name (Electron) but have different displayed names. This issue appears to affect how the frontmost application is detected, when using the following script: set frontApp to first application process whose frontmost is true The frontApp is incorrectly returned when switching between VSCode and Windsurf.
4
0
127
May ’25
Best Practice for Confirming Siri Shortcuts Availability Before Prompting User Interaction
I'm developing an iOS app that uses Siri Shortcuts to enhance the user experience. Currently, I have implemented functionality that allows users to perform certain actions via Siri Shortcuts. My team wants to improve the user experience by giving an instructional audio prompt (e.g., "say 'hey Siri [action name]' if you want to [perform action]") to users. However, we want to ensure this prompt is only played when the user has already enabled Siri Shortcuts. The challenge is determining whether Siri Shortcuts are properly enabled before suggesting their use. We want to avoid situations where users follow our audio instructions to use Siri, only to discover that Siri Shortcuts aren't properly configured on their device. Since we're using Siri Shortcuts for this feature, the standard requestSiriAuthorization(_:) method doesn't apply to our use case(It said You don’t need to request authorization if your app only supports actions in the Shortcuts app. in https://developer.apple.com/documentation/sirikit/requesting-authorization-to-use-siri). What is the recommended approach to verify that Siri Shortcuts are properly enabled before prompting users to interact with them? Is there a reliable way to check this status(should be the bool value of the toggle in the pic below) programmatically? Thank you for your assistance.
6
0
120
Jun ’25
How to initialize OpenIntent parameter when returning OpensIntent in perform
I have an app that lets you create cars. I have a CarEntity, an OpenCarIntent, and a CreateCarIntent. I want to support the Open When Run option when creating a car. I understand to do this, you just update the return type of your perform function to include & OpensIntent, then change your return value to include opensIntent: OpenCarIntent(target: carEntity). When I do this, I get a compile-time error: Cannot convert value of type 'CarEntity' to expected argument type 'IntentParameter<CarEntity>' What am I doing wrong here? struct CreateCarIntent: ForegroundContinuableIntent { static let title: LocalizedStringResource = "Create Car" @Parameter(title: "Name") var name: String @MainActor func perform() async throws -> some IntentResult & ReturnsValue<CarEntity> & OpensIntent { let managedObjectContext = PersistenceController.shared.container.viewContext let car = Car(context: managedObjectContext) car.name = name try await managedObjectContext.perform { try managedObjectContext.save() } let carEntity = CarEntity(car: car) return .result( value: carEntity, opensIntent: OpenCarIntent(target: carEntity) // FIXME: Won't compile ) } } struct OpenCarIntent: OpenIntent { static let title: LocalizedStringResource = "Open Car" @Parameter(title: "Car") var target: CarEntity @MainActor func perform() async throws -> some IntentResult { await UIApplication.shared.open(URL(string: "carapp://cars/view?id=\(target.id)")!) return .result() } }
2
0
131
Jun ’25
How to donate IndexedEntity, if required in iOS 26
In the Get to Know App Intents WWDC session, it was said New this year, you can now add Spotlight indexing keys directly on properties. Annotating properties allows Spotlight to show more relevant information to customers. When donating indexed entities, the framework will handle creating the searchable item and attribute set for you. After donating entities, they can be found in Spotlight. How do you donate indexed app entities? Making app entities available in Spotlight seems to state it's not necessary to donate entities: The system can automatically extract the keys for Spotlight indexing at compile time and store them in the App Intents metadata that Xcode generates as part of your app’s bundle. As a result, Spotlight indexing is faster and can find your app entities without launching your app, and without you having to explicitly donate the entities to Spotlight. You also don’t need to manually update or remove entities from the Spotlight index when your app’s data changes. Say I have a CarEntity. The user can create/update/delete cars at any time. What is the modern way to get cars to appear in Spotlight in iOS 26?
2
0
118
Jun ’25
Accessing Safari URL using com.apple.security.scripting-targets entitlement?
I've created an app that grabs the current URL and Title/name from the frontmost window/tab of Safari or any of a number of Chromium browsers, using NSAppleScript. The app sits in the menu bar and can be summoned by shortcut key combo. let script = """ tell application \"Safari\" if not (exists front window) then return {\"\", \"\"} set theTab to current tab of front window set theURL to URL of theTab set theTitle to name of theTab return {theURL, theTitle} end tell """ if let appleScript = NSAppleScript(source: script) { let output = appleScript.executeAndReturnError(&error) if output.numberOfItems == 2 { let url = output.atIndex(1)?.stringValue let title = output.atIndex(2)?.stringValue if let url = url, !url.isEmpty { return (url, title) } } } If I sign an archived build and run it locally it works beautifully, no matter which browser I am using. But the URL/title grabbing breaks in sandbox due to permissions. I read and have been informed that I need to use com.apple.security.scripting-targets entitlement. The example for this is in WWDC 2012 and talks about accessing Mail compose window. <key>com.apple.security.scripting-targets</key> <dict> <key>com.apple.mail</key> <array> <string>com.apple.mail.compose</string> </array> </dict> However, I don't want to control the app or use any access groups, as I've looked through the sdef and Safari/Chrome do not provide any access groups whose contents I'm interested in. I just want to get the property/values of a window/tab. So I think I could be quite restrictive about the read-only access to two properties or objects that I need. That said, I'm going back and forth with TestFlight review kind of shooting in the dark. I need help! So I figure it's time to ask: what content should my entitlement have? Or am I on the wrong path entirely? I know it's possible because an app called Neptunes does it to get properties from Music.app Many thanks in advance, matt
1
0
128
Jun ’25
How to get the "Is Completed" and "Is Not Completed" Filter in Shortcuts app like Reminders
When we use the "Find All Reminders" shortcut, there's these two filters "Is Completed and "Is Not Completed". When I implement this in my app, the best I could get is just "Completed" and "Not Completed", I can't figure out how to add the "Is" in front. In my entity: @Property(title: "Completed") var completed : Bool In the EntityPropertyQuery: static var properties = QueryProperties { Property(\GTDItemAppEntity.$list) { EqualToComparator { NSPredicate(format: "list.uuid = %@", $0.id as NSUUID) } } Property(\GTDItemAppEntity.$text) { ContainsComparator { NSPredicate(format: "text CONTAINS[cd] %@", $0) } EqualToComparator { NSPredicate(format: "text = %@", $0) } } Property(\GTDItemAppEntity.$completed) { EqualToComparator { NSPredicate(format: $0 ? "completed = YES" : "completed = NO") } } } If I change the property to @Property(title: "Is Completed") var completed : Bool Then it will show as "Is Completed" and "Not Is Completed" in the filter! Reminder: My App:
1
0
138
Jul ’25
I want the "Folder" property of a folder not it's class.
I'm trying to set a boolean value to myVariable using the "Folder" property, but the Applescript editor keeps interpreting it as a class. Here is a shorted code. this is part of a bigger code to identify files dropped into a folder and create a new folder which it renames based on the date of the file that is dropped into the folder. Unfortunately, it keeps making folders every time it makes a new folder. Resalting in continuous loop of folders being created and renamed to "2025". The plan is to us an IF condition to prevent the creation of folders when a folder/s are dropped into my folder with my Folder Action. property directory : "Catalina:Users:Username:Desktop:Folder:File.pdf tell application "Finder" set pathname to POSIX path of directory set item_info to the info for directory set myVariable to Folder of item_info return myVariable end tell I noticed the following when I compile the script The color of the "Folder" is blue. I believe this means it's a class. Normally when I call a property, the color turns pink. it does it correctly when I use "set the file_name to the "name" of this_file". I also tried declaring the "Folder" property in brackets "Folder". did not help I noticed the following when I run the script: It returns ---error number -10004 "A privilege violation occurred. When it runs the "info for" command. I gave the Script Editor Full File access, Full Accessibility access and the FolderActionsDispatcher has full Finder access. Can anyone point me in the right direction! What is the cause of the privilege violation or how would I find what the cause is? How do I force the Script Editor to get the "Folder" property of a folder?
1
0
145
Jul ’25
How to configure com.apple.security.scripting-targets in .entitlements file?
I use NSUserAppleScriptTask in my app to call Apple Script method to send Apple Events to Finder and System Events. The script has been deployed in the folder ~/Library/Application Scripts/{app bundle id}/ I have configured the com.apple.security.automation.apple-events in the .entitlements file, but how to configure com.apple.security.scripting-targets to meet the AppStore review requirements The existing official documentation is too incomplete to be of much use. If anyone has had similar experience, could you please share?
1
0
130
Aug ’25
INStartCallIntent requires unlock when device is face down with AirPods
When my Intents extension resolves an INStartCallIntent and returns .continueInApp while the device is locked, the call does not proceed unless the user unlocks the device. After unlocking, the app receives the NSUserActivity and CallKit proceeds normally. My expectation is that the native CallKit outgoing UI should appear and the call should start without requiring unlock — especially when using AirPods, where attention is not available. Steps to Reproduce Pair and connect AirPods. Lock the iPhone. Start music playback (e.g. Apple Music). Place the phone face down (or cover Face ID sensors so attention isn’t available). Say: “Hey Siri, call Tommy with DiscoMonday(My app name).” Observed Behavior Music mutes briefly. Siri says “Calling Tommy with DiscoMonday.” Lock screen shows “Require Face ID / passcode.” After several seconds, music resumes. The app is not launched, no NSUserActivity is delivered, and no CXStartCallAction occurs. With the phone face up, the same phrase launches the app, triggers CXStartCallAction, and the call proceeds via CallKit after faceID. Expected Behavior From the lock screen, Siri should hand off INStartCallIntent to the app, which immediately requests CXStartCallAction and drives the CallKit UI (reportOutgoingCall(...startedConnectingAt:) → ...connectedAt:), without requiring device unlock, regardless of orientation or attention availability when AirPods are connected.
1
0
122
2w
How do I flatten a PDF using Shortcuts or Automator?
Looking for any method to quickly flatten a PDF without opening Preview and without installing 3 party software. Any ideas? Save as PDF in Preview works, but I don't want to have to open Preview each time I need to do this. The Create PDF action which appears in Finder when you select 2 or more PDFs flattens PDFs, but it requires me to select 2 or more files, and I generally don't want to combine PDFs--I simply wish to flatten a PDF. Most Automator and Shortcuts options I am aware of do not flatten PDFs, and in some cases, strip out form field data from PDFs.
6
0
121
1w
AppIntents EntityPropertyQuery, how does "Filter Entity where" work?
When you correctly implement EntityPropertyQuery on an AppEntity, Shortcuts will expose a "Find Entity" action that calls into entities(matching:mode:sortedBy:limit:). This is demoed in the "Dive into App Intents" session and works as expected. However, with this action, you can change the "All Entity" input to a list variable which changes the action text from "Find All Entity" to "Filter Entity where" still giving you the same filter, sort and limit options. This appears to work as expected too. But, what's unexpected is that this filter action does not appear to call any method on my AppEntity code. It doesn't call entities(matching:mode:sortedBy:limit:). One would think there would need to be a filter(entities:matching:mode:sortedBy:limit:) to implement this functionality. But Shortcut just seems to do it all on it's own. I'm mostly wondering, how is this even working? Here's some example code: import AppIntents let books = [ BookEntity(id: 0, title: "A Family Affair"), BookEntity(id: 1, title: "Atlas of the Heart"), BookEntity(id: 2, title: "Atomic Habits"), BookEntity(id: 3, title: "Memphis"), BookEntity(id: 4, title: "Run Rose Run"), BookEntity(id: 5, title: "The Maid"), BookEntity(id: 6, title: "The Match"), BookEntity(id: 7, title: "Where the Crawdads Sing"), ] struct BookEntity: AppEntity, Identifiable { static var typeDisplayRepresentation: TypeDisplayRepresentation = "Book" var displayRepresentation: DisplayRepresentation { DisplayRepresentation(title: "\(title)") } static var defaultQuery = BookQuery() var id: Int @Property(title: "Title") var title: String init(id: Int, title: String) { self.id = id self.title = title } } struct BookQuery: EntityQuery { func entities(for identifiers: [Int]) async throws -> [BookEntity] { return identifiers.map { id in books[id] } } } extension BookQuery: EntityPropertyQuery { static var properties = QueryProperties { Property(\BookEntity.$title) { EqualToComparator { str in { book in book.title == str } } ContainsComparator { str in { book in book.title.contains(str) } } } } static var sortingOptions = SortingOptions { SortableBy(\BookEntity.$title) } func entities( matching comparators: [(BookEntity) -> Bool], mode: ComparatorMode, sortedBy: [Sort<BookEntity>], limit: Int? ) async throws -> [BookEntity] { books.filter { book in comparators.allSatisfy { comparator in comparator(book) } } } } The example Shortcut first invokes entities(matching:mode:sortedBy:limit:) with comparators=[], sortedBy=[], limit=nil to fetch all Book entities. Next the filter step correctly applies the title contains filter but never calls entities(matching:mode:sortedBy:limit:) or even the body of the ContainsComparator. But the output is correctly filtered.
1
0
1.6k
Jul ’25
Run Application In The Background Automation
I’ve developed an automation and shortcut using the iPhone Shortcuts app in IOS 18, something that hasn’t been done before. With support from Apple’s customer service, I was encouraged to bring this idea to life. The automation’s purpose is to open a specified iOS app, move it to the background, and use a txt database in Folders to ensure uninterrupted data flow and continuous connectivity—especially useful for health apps where wearable devices need consistent, uninterrupted operation and monitoring (e.g., doctor tracking or wearable device connectivity). I would like to share the Automation and the Shortcut with the community.
2
0
945
Oct ’24
AppleScript to Automate Envelope Printing
I have a VBScript routine to print envelopes by automating Word. This works just fine. Now I'm trying to do the same thing with AppleScript, also using the Word application. Here is what I have so far: set recipientAddress to text returned of (display dialog "Enter the recipient's address:" default answer "") -- Prompt for recipient city, state, and zip set recipientCityStateZip to text returned of (display dialog "Enter the recipient's city, state, and zip:" default answer "") -- Combine all address parts into a full address set fullAddress to recipientName &amp; return &amp; recipientAddress &amp; return &amp; recipientCityStateZip -- Create a new Word document and print the envelope set dialogResult to display dialog "To print envelope for:" &amp; return &amp; return &amp; recipientName &amp; return &amp; recipientAddress &amp; return &amp; recipientCityStateZip &amp; return &amp; return &amp; "Center envelope upside-down in printer with flap on left" &amp; return &amp; return &amp; "Continue?" buttons {"Yes", "No"} default button 2 with icon caution if button returned of dialogResult is "Yes" then tell application "Microsoft Word" set wdDoc to make new document -- Print the envelope with the collected recipient address and hard-coded return address -- wdDoc's print out envelope(address:fullAddress, returnAddress:returnAddress) -- Close the document without saving close wdDoc saving no end tell end if What does NOT work is the commented line near the end of the script which starts with -- wdDoc's print out envelope... Either I am doing it wrong, or Word for Mac can't be automated that way. Can anyone help with this script, or at least suggest a different method to print an envelope on demand? Thanks...
1
0
567
Oct ’24
Wallet "Open [Pass or Card]" Shortcut Input
Hello, There is a new shortcut recently in iOS shortcuts called "Open [Pass or Card]". It looks to take in a [Pass or Card] type, however I'd like to program it with a shortcut to dynamically select a card, and I noticed it works with strings, such as "BofA Customized Cash Rewards". Would there be a list of possible strings for supported cards and/or passes that I could pass in for this shortcut?
0
0
512
Oct ’24
Remotely Quit Remote Desktop
I often need to remotely control a Mac that has the Remote Desktop application running on it. Thus I need to create a script to kill it remotely. The following command gives me the process number (PID) on the remote machine when logged in via SSH. What I need to know is how to pass that number to kill -3 to quit it with one command, bad thing can happen if you make a typo on PID ps -ax | grep "Remote Desktop.app" | grep -v grep | awk '{print $1}'
0
0
581
Oct ’24