From 60840e87f177600314faf1e8496245a8eceeaafc Mon Sep 17 00:00:00 2001 From: Tony Li Date: Mon, 6 Jul 2026 11:31:38 +1200 Subject: [PATCH 1/3] Format SearchableActivityConvertable with swift-format --- .../Swift/SearchableActivityConvertable.swift | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Modules/Sources/WordPressData/Swift/SearchableActivityConvertable.swift b/Modules/Sources/WordPressData/Swift/SearchableActivityConvertable.swift index 7f7132f7bc02..6753b5b31399 100644 --- a/Modules/Sources/WordPressData/Swift/SearchableActivityConvertable.swift +++ b/Modules/Sources/WordPressData/Swift/SearchableActivityConvertable.swift @@ -31,7 +31,10 @@ extension WPActivityType { case .appSettings: return NSLocalizedString("WordPress App Settings", comment: "Siri Suggestion to open App Settings") case .notificationSettings: - return NSLocalizedString("WordPress Notification Settings", comment: "Siri Suggestion to open Notification Settings") + return NSLocalizedString( + "WordPress Notification Settings", + comment: "Siri Suggestion to open Notification Settings" + ) case .support: return NSLocalizedString("WordPress Help", comment: "Siri Suggestion to open Support") case .notifications: @@ -49,30 +52,30 @@ public enum WPActivityUserInfoKeys: String { @objc public protocol SearchableActivityConvertable { /// Type name used to uniquly indentify this activity. /// - @objc var activityType: String {get} + @objc var activityType: String { get } /// Activity title to be displayed in spotlight search. /// - @objc var activityTitle: String {get} + @objc var activityTitle: String { get } // MARK: Optional Vars /// A set of localized keywords that can help users find the activity in search results. /// - @objc optional var activityKeywords: Set? {get} + @objc optional var activityKeywords: Set? { get } /// The date after which the activity is no longer eligible for indexing. If not set, /// the expiration date will default to one week from the current date. /// - @objc optional var activityExpirationDate: Date? {get} + @objc optional var activityExpirationDate: Date? { get } /// A dictionary containing state information related to this indexed activity. /// - @objc optional var activityUserInfo: [String: String]? {get} + @objc optional var activityUserInfo: [String: String]? { get } /// Activity description /// - @objc optional var activityDescription: String? {get} + @objc optional var activityDescription: String? { get } } public extension SearchableActivityConvertable where Self: UIViewController { From 62c9f05900d232eb4de9075a20be63f8e98d1da3 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Mon, 6 Jul 2026 11:39:06 +1200 Subject: [PATCH 2/3] Stop donating screen activities as Siri predictions The Jetpack app's App Shortcuts are the modern replacement for Siri suggestions, so the prediction donation, the suggested invocation phrases, and the now-unused MobileCoreServices import are removed. The system keeps previously donated suggestions until they are explicitly deleted, so all saved user activities are deleted once at launch and upgrading users do not keep stale suggestions. The screen activities remain eligible for Spotlight search, whose index is separate and unaffected. --- .../Swift/SearchableActivityConvertable.swift | 33 ------------------- .../Classes/System/WordPressAppDelegate.swift | 14 ++++++++ 2 files changed, 14 insertions(+), 33 deletions(-) diff --git a/Modules/Sources/WordPressData/Swift/SearchableActivityConvertable.swift b/Modules/Sources/WordPressData/Swift/SearchableActivityConvertable.swift index 6753b5b31399..65d9ff9fc79e 100644 --- a/Modules/Sources/WordPressData/Swift/SearchableActivityConvertable.swift +++ b/Modules/Sources/WordPressData/Swift/SearchableActivityConvertable.swift @@ -1,7 +1,5 @@ import UIKit import CoreSpotlight -import Intents -import MobileCoreServices import UniformTypeIdentifiers /// Custom NSUSerActivity types for the WPiOS. Primarily used for navigation points. @@ -17,32 +15,6 @@ public enum WPActivityType: String { case notifications = "org.wordpress.notifications" } -extension WPActivityType { - var suggestedInvocationPhrase: String { - switch self { - case .siteList: - return NSLocalizedString("My Sites in WordPress", comment: "Siri Suggestion to open My Sites") - case .siteDetails: - return NSLocalizedString("WordPress Site Details", comment: "Siri Suggestion to open My Sites") - case .reader: - return NSLocalizedString("WordPress Reader", comment: "Siri Suggestion to open My Sites") - case .me: - return NSLocalizedString("WordPress Profile", comment: "Siri Suggestion to open Me tab") - case .appSettings: - return NSLocalizedString("WordPress App Settings", comment: "Siri Suggestion to open App Settings") - case .notificationSettings: - return NSLocalizedString( - "WordPress Notification Settings", - comment: "Siri Suggestion to open Notification Settings" - ) - case .support: - return NSLocalizedString("WordPress Help", comment: "Siri Suggestion to open Support") - case .notifications: - return NSLocalizedString("WordPress Notifications", comment: "Siri Suggestion to open Notifications") - } - } -} - /// NSUserActivity userInfo keys /// public enum WPActivityUserInfoKeys: String { @@ -108,11 +80,6 @@ public extension SearchableActivityConvertable where Self: UIViewController { activity.isEligibleForSearch = true activity.isEligibleForHandoff = false - activity.isEligibleForPrediction = true - - if let wpActivityType = WPActivityType(rawValue: activityType) { - activity.suggestedInvocationPhrase = wpActivityType.suggestedInvocationPhrase - } // Set the UIViewController's userActivity property, which is defined in UIResponder. Doing this allows // UIKit to automagically manage this user activity (e.g. making it current when needed) diff --git a/WordPress/Classes/System/WordPressAppDelegate.swift b/WordPress/Classes/System/WordPressAppDelegate.swift index 3d39fde86e11..f29a2535ce24 100644 --- a/WordPress/Classes/System/WordPressAppDelegate.swift +++ b/WordPress/Classes/System/WordPressAppDelegate.swift @@ -109,6 +109,7 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { MemoryCache.shared.register() MediaImageService.migrateCacheIfNeeded() + purgeLegacySiriDonationsIfNeeded() PostCoordinator.shared.delegate = self // Start CrashLogging as soon as possible (in case a crash happens during startup) @@ -414,6 +415,19 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { AccountService(coreDataStack: ContextManager.shared).mergeDuplicatesIfNecessary() } + /// Deletes the user activities donated as Siri predictions by earlier app versions, + /// because the app no longer donates predictions and the system keeps the old + /// suggestions until they are explicitly deleted. + // TODO: Remove this cleanup after a few releases. + private func purgeLegacySiriDonationsIfNeeded() { + let didPurgeKey = "did-purge-legacy-siri-donations" + guard !UserDefaults.standard.bool(forKey: didPurgeKey) else { + return + } + UserDefaults.standard.set(true, forKey: didPurgeKey) + NSUserActivity.deleteAllSavedUserActivities {} + } + private func setupPingHub() { pingHubManager = PingHubManager() } From e8973a9da200b2785cb9d1c0403bd3089140a5e8 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Tue, 7 Jul 2026 15:59:28 +1200 Subject: [PATCH 3/3] Add a release note for the Siri prediction donation removal --- RELEASE-NOTES.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 123cf2afc20d..f262e032b1a1 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -6,6 +6,7 @@ * [*] Add App Shortcuts for creating a post and opening Notifications, Stats, and the Reader from Siri, Spotlight, and the Shortcuts app [#25754] * [*] Posts and Reader posts can now be found and opened from Siri and the Shortcuts app [#25755] * [*] Publish or schedule a post from Siri and the Shortcuts app, with a confirmation before anything goes live [#25756] +* [*] [internal] Stop donating screen activities as Siri predictions now that App Shortcuts cover them [#25757] 27.0