From cf790a21fb32aba73fae5d9cf6bd67930f0795fc Mon Sep 17 00:00:00 2001
From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com>
Date: Tue, 14 Apr 2026 15:06:46 -0600
Subject: [PATCH 1/4] Remove Twitter row from About screen
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The Twitter/X link opened a blank webview because X.com doesn't render
in embedded WKWebViews. Rather than switching to an external browser
link, remove the row entirely — the account is inactive.
---
.../About/AppAboutScreenConfiguration.swift | 211 ++++++++++++------
1 file changed, 148 insertions(+), 63 deletions(-)
diff --git a/WordPress/Classes/ViewRelated/Me/App Settings/About/AppAboutScreenConfiguration.swift b/WordPress/Classes/ViewRelated/Me/App Settings/About/AppAboutScreenConfiguration.swift
index e68140e1bffe..67b2b06eeda1 100644
--- a/WordPress/Classes/ViewRelated/Me/App Settings/About/AppAboutScreenConfiguration.swift
+++ b/WordPress/Classes/ViewRelated/Me/App Settings/About/AppAboutScreenConfiguration.swift
@@ -20,13 +20,17 @@ struct WebViewPresenter {
class AppAboutScreenConfiguration: AboutScreenConfiguration {
static var appInfo: AboutScreenAppInfo {
- AboutScreenAppInfo(name: (Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String) ?? "",
- version: Bundle.main.detailedVersionNumber() ?? "",
- icon: UIImage(named: AppIcon.currentOrDefaultIconName) ?? UIImage())
+ AboutScreenAppInfo(
+ name: (Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String) ?? "",
+ version: Bundle.main.detailedVersionNumber() ?? "",
+ icon: UIImage(named: AppIcon.currentOrDefaultIconName) ?? UIImage()
+ )
}
- static let fonts = AboutScreenFonts(appName: WPStyleGuide.serifFontForTextStyle(.largeTitle, fontWeight: .semibold),
- appVersion: WPStyleGuide.tableviewTextFont())
+ static let fonts = AboutScreenFonts(
+ appName: WPStyleGuide.serifFontForTextStyle(.largeTitle, fontWeight: .semibold),
+ appVersion: WPStyleGuide.tableviewTextFont()
+ )
let sharePresenter: ShareAppContentPresenter
let webViewPresenter = WebViewPresenter()
@@ -35,46 +39,79 @@ class AppAboutScreenConfiguration: AboutScreenConfiguration {
lazy var sections: [[AboutItem]] = {
[
[
- AboutItem(title: TextContent.rateUs, action: { [weak self] context in
- WPAnalytics.track(.appReviewsRatedApp)
- self?.tracker.buttonPressed(.rateUs)
- AppRatingUtility.shared.ratedCurrentVersion()
- UIApplication.shared.open(AppRatingUtility.shared.appReviewUrl)
- }),
- AboutItem(title: TextContent.share, action: { [weak self] context in
- self?.tracker.buttonPressed(.share)
- self?.sharePresenter.present(for: BuildSettings.current.shareAppName, in: context.viewController, source: .about, sourceView: context.sourceView)
- }),
- AboutItem(title: TextContent.twitter, subtitle: BuildSettings.current.about.twitterHandle, cellStyle: .value1, action: { [weak self] context in
- self?.tracker.buttonPressed(.twitter)
- self?.webViewPresenter.presentInNavigationControlller(url: Links.twitter, context: context)
- }),
- AboutItem(title: Strings.current.blogName, subtitle: productBlogDisplayURL, cellStyle: .value1, action: { [weak self] context in
- self?.tracker.buttonPressed(.blog)
- self?.webViewPresenter.presentInNavigationControlller(url: Links.blog, context: context)
- })
+ AboutItem(
+ title: TextContent.rateUs,
+ action: { [weak self] context in
+ WPAnalytics.track(.appReviewsRatedApp)
+ self?.tracker.buttonPressed(.rateUs)
+ AppRatingUtility.shared.ratedCurrentVersion()
+ UIApplication.shared.open(AppRatingUtility.shared.appReviewUrl)
+ }
+ ),
+ AboutItem(
+ title: TextContent.share,
+ action: { [weak self] context in
+ self?.tracker.buttonPressed(.share)
+ self?.sharePresenter
+ .present(
+ for: BuildSettings.current.shareAppName,
+ in: context.viewController,
+ source: .about,
+ sourceView: context.sourceView
+ )
+ }
+ ),
+ AboutItem(
+ title: Strings.current.blogName,
+ subtitle: productBlogDisplayURL,
+ cellStyle: .value1,
+ action: { [weak self] context in
+ self?.tracker.buttonPressed(.blog)
+ self?.webViewPresenter.presentInNavigationControlller(url: Links.blog, context: context)
+ }
+ )
],
[
- AboutItem(title: TextContent.legalAndMore, accessoryType: .disclosureIndicator, action: { [weak self] context in
- self?.tracker.buttonPressed(.legal)
- context.showSubmenu(title: TextContent.legalAndMore, configuration: LegalAndMoreSubmenuConfiguration())
- }),
+ AboutItem(
+ title: TextContent.legalAndMore,
+ accessoryType: .disclosureIndicator,
+ action: { [weak self] context in
+ self?.tracker.buttonPressed(.legal)
+ context.showSubmenu(
+ title: TextContent.legalAndMore,
+ configuration: LegalAndMoreSubmenuConfiguration()
+ )
+ }
+ )
],
- [.jetpack, .reader].contains(BuildSettings.current.brand) ?
- [
- AboutItem(title: TextContent.automatticFamily, accessoryType: .disclosureIndicator, hidesSeparator: true, action: { [weak self] context in
- self?.tracker.buttonPressed(.automatticFamily)
- self?.webViewPresenter.presentInNavigationControlller(url: Links.automattic, context: context)
- }),
- AboutItem(title: "", cellStyle: .appLogos, accessoryType: .none)
- ] : nil,
+ [.jetpack, .reader].contains(BuildSettings.current.brand)
+ ? [
+ AboutItem(
+ title: TextContent.automatticFamily,
+ accessoryType: .disclosureIndicator,
+ hidesSeparator: true,
+ action: { [weak self] context in
+ self?.tracker.buttonPressed(.automatticFamily)
+ self?.webViewPresenter
+ .presentInNavigationControlller(url: Links.automattic, context: context)
+ }
+ ),
+ AboutItem(title: "", cellStyle: .appLogos, accessoryType: .none)
+ ] : nil,
[
- AboutItem(title: Strings.current.workWithUs, subtitle: TextContent.workWithUsSubtitle, cellStyle: .subtitle, accessoryType: .disclosureIndicator, action: { [weak self] context in
- self?.tracker.buttonPressed(.workWithUs)
- self?.webViewPresenter.presentInNavigationControlller(url: Links.workWithUs, context: context)
- }),
+ AboutItem(
+ title: Strings.current.workWithUs,
+ subtitle: TextContent.workWithUsSubtitle,
+ cellStyle: .subtitle,
+ accessoryType: .disclosureIndicator,
+ action: { [weak self] context in
+ self?.tracker.buttonPressed(.workWithUs)
+ self?.webViewPresenter.presentInNavigationControlller(url: Links.workWithUs, context: context)
+ }
+ )
]
- ].compactMap { $0 }
+ ]
+ .compactMap { $0 }
}()
func dismissScreen(_ actionContext: AboutItemActionContext) {
@@ -99,16 +136,35 @@ class AppAboutScreenConfiguration: AboutScreenConfiguration {
}
private enum TextContent {
- static let rateUs = NSLocalizedString("Rate Us", comment: "Title for button allowing users to rate the app in the App Store")
- static let share = NSLocalizedString("Share with Friends", comment: "Title for button allowing users to share information about the app with friends, such as via Messages")
- static let twitter = NSLocalizedString("Twitter", comment: "Title of button that displays the app's Twitter profile")
- static let legalAndMore = NSLocalizedString("Legal and More", comment: "Title of button which shows a list of legal documentation such as privacy policy and acknowledgements")
- static let automatticFamily = NSLocalizedString("Automattic Family", comment: "Title of button that displays information about the other apps available from Automattic")
- static var workWithUsSubtitle = AppConfiguration.isWordPress ? nil : NSLocalizedString("Join From Anywhere", comment: "Subtitle for button displaying the Automattic Work With Us web page, indicating that Automattic employees can work from anywhere in the world")
+ static let rateUs = NSLocalizedString(
+ "Rate Us",
+ comment: "Title for button allowing users to rate the app in the App Store"
+ )
+ static let share = NSLocalizedString(
+ "Share with Friends",
+ comment:
+ "Title for button allowing users to share information about the app with friends, such as via Messages"
+ )
+ static let legalAndMore = NSLocalizedString(
+ "Legal and More",
+ comment:
+ "Title of button which shows a list of legal documentation such as privacy policy and acknowledgements"
+ )
+ static let automatticFamily = NSLocalizedString(
+ "Automattic Family",
+ comment: "Title of button that displays information about the other apps available from Automattic"
+ )
+ static var workWithUsSubtitle =
+ AppConfiguration.isWordPress
+ ? nil
+ : NSLocalizedString(
+ "Join From Anywhere",
+ comment:
+ "Subtitle for button displaying the Automattic Work With Us web page, indicating that Automattic employees can work from anywhere in the world"
+ )
}
private enum Links {
- static let twitter = BuildSettings.current.about.twitterURL
static let blog = BuildSettings.current.about.blogURL
static let workWithUs = URL(string: Strings.current.workWithUsURL)!
static let automattic = URL(string: "https://automattic.com")!
@@ -125,21 +181,32 @@ class LegalAndMoreSubmenuConfiguration: AboutScreenConfiguration {
linkItem(title: Titles.termsOfService, link: Links.termsOfService, button: .termsOfService),
linkItem(title: Titles.privacyPolicy, link: Links.privacyPolicy, button: .privacyPolicy),
linkItem(title: Titles.sourceCode, link: Links.sourceCode, button: .sourceCode),
- AboutItem(title: Titles.acknowledgements, accessoryType: .disclosureIndicator, action: { context in
- let rootView = AcknowledgementsListView(viewModel: AcknowledgementsListViewModel(dataProvider: AcknowledgementsService()))
- context.viewController.navigationController?.pushViewController(
- UIHostingController(rootView: rootView),
- animated: true
- )
- })
+ AboutItem(
+ title: Titles.acknowledgements,
+ accessoryType: .disclosureIndicator,
+ action: { context in
+ let rootView = AcknowledgementsListView(
+ viewModel: AcknowledgementsListViewModel(dataProvider: AcknowledgementsService())
+ )
+ context.viewController.navigationController?
+ .pushViewController(
+ UIHostingController(rootView: rootView),
+ animated: true
+ )
+ }
+ )
]
]
}()
private func linkItem(title: String, link: URL, button: AboutScreenTracker.Event.Button) -> AboutItem {
- AboutItem(title: title, accessoryType: .disclosureIndicator, action: { [weak self] context in
- self?.buttonPressed(link: link, context: context, button: button)
- })
+ AboutItem(
+ title: title,
+ accessoryType: .disclosureIndicator,
+ action: { [weak self] context in
+ self?.buttonPressed(link: link, context: context, button: button)
+ }
+ )
}
private func buttonPressed(link: URL, context: AboutItemActionContext, button: AboutScreenTracker.Event.Button) {
@@ -160,10 +227,22 @@ class LegalAndMoreSubmenuConfiguration: AboutScreenConfiguration {
}
private enum Titles {
- static let termsOfService = NSLocalizedString("Terms of Service", comment: "Title of button that displays the App's terms of service")
- static let privacyPolicy = NSLocalizedString("Privacy Policy", comment: "Title of button that displays the App's privacy policy")
- static let sourceCode = NSLocalizedString("Source Code", comment: "Title of button that displays the App's source code information")
- static let acknowledgements = NSLocalizedString("Acknowledgements", comment: "Title of button that displays the App's acknowledgements")
+ static let termsOfService = NSLocalizedString(
+ "Terms of Service",
+ comment: "Title of button that displays the App's terms of service"
+ )
+ static let privacyPolicy = NSLocalizedString(
+ "Privacy Policy",
+ comment: "Title of button that displays the App's privacy policy"
+ )
+ static let sourceCode = NSLocalizedString(
+ "Source Code",
+ comment: "Title of button that displays the App's source code information"
+ )
+ static let acknowledgements = NSLocalizedString(
+ "Acknowledgements",
+ comment: "Title of button that displays the App's acknowledgements"
+ )
}
private enum Links {
@@ -200,13 +279,19 @@ private struct Strings {
static let wordpress = Strings(
blogName: NSLocalizedString("News", comment: "Title of a button that displays the WordPress.org blog"),
- workWithUs: NSLocalizedString("Contribute", comment: "Title of button that displays the WordPress.org contributor page"),
+ workWithUs: NSLocalizedString(
+ "Contribute",
+ comment: "Title of button that displays the WordPress.org contributor page"
+ ),
workWithUsURL: "https://make.wordpress.org/mobile/handbook"
)
static let a8c = Strings(
blogName: NSLocalizedString("Blog", comment: "Title of a button that displays the WordPress.com blog"),
- workWithUs: NSLocalizedString("Work With Us", comment: "Title of button that displays the Automattic Work With Us web page"),
+ workWithUs: NSLocalizedString(
+ "Work With Us",
+ comment: "Title of button that displays the Automattic Work With Us web page"
+ ),
workWithUsURL: "https://automattic.com/work-with-us"
)
}
From cb49810b77e7329ae52f12abbeb3d9d272700776 Mon Sep 17 00:00:00 2001
From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com>
Date: Tue, 14 Apr 2026 15:28:19 -0600
Subject: [PATCH 2/4] Add release notes for Twitter row removal
---
RELEASE-NOTES.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 957782f5ae84..b94fb44e2a68 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -16,6 +16,7 @@
* [*] Reader: Fix an issues with Reader failing to clear cached comments if all the comments are deleted [#25482]
* [*] Reader: Fix an issue with the article view removing autoplay without showing controls [#25468]
* [*] Menus: Fix an issue with footer view in Menu Editing not resizing [#25481]
+* [*] About screen: Remove the non-functional Twitter/X link [#25496]
26.8
-----
From befe6c69d54c385323df63c6023d45e4fb35ca8c Mon Sep 17 00:00:00 2001
From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com>
Date: Tue, 14 Apr 2026 16:00:57 -0600
Subject: [PATCH 3/4] Credit issue reporter in release notes
---
RELEASE-NOTES.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index b94fb44e2a68..f417d7c573f9 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -16,7 +16,7 @@
* [*] Reader: Fix an issues with Reader failing to clear cached comments if all the comments are deleted [#25482]
* [*] Reader: Fix an issue with the article view removing autoplay without showing controls [#25468]
* [*] Menus: Fix an issue with footer view in Menu Editing not resizing [#25481]
-* [*] About screen: Remove the non-functional Twitter/X link [#25496]
+* [*] About screen: Remove the non-functional Twitter/X link - thanks @zynp-KC for reporting! [#25496]
26.8
-----
From f0687344db3a20ad8169447ede24ffad544fdda2 Mon Sep 17 00:00:00 2001
From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com>
Date: Tue, 21 Apr 2026 11:23:13 -0600
Subject: [PATCH 4/4] Remove dead Twitter wiring now that the About row is gone
Drops the unused `twitterHandle`/`twitterURL` on `BuildSettings.ProductAboutDetails`, their `WPProductTwitter*` Info.plist keys across all three brands, and the `AboutScreenTracker.Event.Button.twitter` analytics case.
---
Modules/Sources/BuildSettingsKit/BuildSettings+Live.swift | 2 --
Modules/Sources/BuildSettingsKit/BuildSettings+Preview.swift | 2 --
Modules/Sources/BuildSettingsKit/BuildSettings.swift | 2 --
Sources/Jetpack/Info.plist | 4 ----
Sources/Reader/Info.plist | 4 ----
Sources/WordPress/Info.plist | 4 ----
.../Me/App Settings/About/AboutScreenTracker.swift | 1 -
7 files changed, 19 deletions(-)
diff --git a/Modules/Sources/BuildSettingsKit/BuildSettings+Live.swift b/Modules/Sources/BuildSettingsKit/BuildSettings+Live.swift
index aa77a194a082..526e8f434070 100644
--- a/Modules/Sources/BuildSettingsKit/BuildSettings+Live.swift
+++ b/Modules/Sources/BuildSettingsKit/BuildSettings+Live.swift
@@ -16,8 +16,6 @@ extension BuildSettings {
appURLScheme = bundle.infoValue(forKey: "WPAppURLScheme")
jetpackAppURLScheme = bundle.infoValue(forKey: "WPJetpackAppURLScheme")
about = ProductAboutDetails(
- twitterHandle: bundle.infoValue(forKey: "WPProductTwitterHandle"),
- twitterURL: bundle.urlValue(forKey: "WPProductTwitterURL"),
blogURL: bundle.urlValue(forKey: "WPProductBlogURL")
)
zendeskSourcePlatform = bundle.infoValue(forKey: "WPZendeskSourcePlatform")
diff --git a/Modules/Sources/BuildSettingsKit/BuildSettings+Preview.swift b/Modules/Sources/BuildSettingsKit/BuildSettings+Preview.swift
index 38ff5e71d94a..7b0b72872d85 100644
--- a/Modules/Sources/BuildSettingsKit/BuildSettings+Preview.swift
+++ b/Modules/Sources/BuildSettingsKit/BuildSettings+Preview.swift
@@ -15,8 +15,6 @@ extension BuildSettings {
appURLScheme: "xcpreview",
jetpackAppURLScheme: "jetpack",
about: ProductAboutDetails(
- twitterHandle: "@wordpress",
- twitterURL: URL(string: "www.example.com")!,
blogURL: URL(string: "www.example.com")!
),
zendeskSourcePlatform: "zen",
diff --git a/Modules/Sources/BuildSettingsKit/BuildSettings.swift b/Modules/Sources/BuildSettingsKit/BuildSettings.swift
index abcd1ff14390..bca0495766ad 100644
--- a/Modules/Sources/BuildSettingsKit/BuildSettings.swift
+++ b/Modules/Sources/BuildSettingsKit/BuildSettings.swift
@@ -36,8 +36,6 @@ public struct BuildSettings: Sendable {
public var authKeychainServiceName: String
public struct ProductAboutDetails: Sendable {
- public var twitterHandle: String
- public var twitterURL: URL
public var blogURL: URL
}
diff --git a/Sources/Jetpack/Info.plist b/Sources/Jetpack/Info.plist
index 5f161d6e7013..5e59e5044a0c 100644
--- a/Sources/Jetpack/Info.plist
+++ b/Sources/Jetpack/Info.plist
@@ -671,10 +671,6 @@
6
WPProductBlogURL
jetpack.com/blog
- WPProductTwitterHandle
- @jetpack
- WPProductTwitterURL
- twitter.com/jetpack
WPPushNotificationAppID
${WP_PUSH_NOTIFICATION_APP_ID}
WPZendeskSourcePlatform
diff --git a/Sources/Reader/Info.plist b/Sources/Reader/Info.plist
index 2681b2ffa522..79f54d2c6dc6 100644
--- a/Sources/Reader/Info.plist
+++ b/Sources/Reader/Info.plist
@@ -26,10 +26,6 @@
6
WPProductBlogURL
jetpack.com/blog
- WPProductTwitterHandle
- @jetpack
- WPProductTwitterURL
- twitter.com/jetpack
WPPushNotificationAppID
${WP_PUSH_NOTIFICATION_APP_ID}
WPZendeskSourcePlatform
diff --git a/Sources/WordPress/Info.plist b/Sources/WordPress/Info.plist
index b4cd495d06d0..40582e9aa0af 100644
--- a/Sources/WordPress/Info.plist
+++ b/Sources/WordPress/Info.plist
@@ -596,10 +596,6 @@
2
WPProductBlogURL
wordpress.org/news/
- WPProductTwitterHandle
- @WordPressiOS
- WPProductTwitterURL
- twitter.com/WordPressiOS
WPPushNotificationAppID
${WP_PUSH_NOTIFICATION_APP_ID}
WPZendeskSourcePlatform
diff --git a/WordPress/Classes/ViewRelated/Me/App Settings/About/AboutScreenTracker.swift b/WordPress/Classes/ViewRelated/Me/App Settings/About/AboutScreenTracker.swift
index 7000b8be4ab1..89df5ceaa764 100644
--- a/WordPress/Classes/ViewRelated/Me/App Settings/About/AboutScreenTracker.swift
+++ b/WordPress/Classes/ViewRelated/Me/App Settings/About/AboutScreenTracker.swift
@@ -16,7 +16,6 @@ class AboutScreenTracker {
case dismiss
case rateUs = "rate_us"
case share
- case twitter
case blog
case legal
case automatticFamily = "automattic_family"