Просмотр исходного кода

Unify app branding as App for Indeed across bundle metadata and UI.

Set explicit CFBundle display/name keys and route sidebar, loading, and share labels through AppMarketingLinks.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 недель назад: 3
Родитель
Сommit
3c31e5926b

+ 6 - 2
App for Indeed.xcodeproj/project.pbxproj

@@ -257,6 +257,8 @@
257
 				GENERATE_INFOPLIST_FILE = YES;
257
 				GENERATE_INFOPLIST_FILE = YES;
258
 				INFOPLIST_KEY_AppStoreAppID = "$(APP_STORE_APP_ID)";
258
 				INFOPLIST_KEY_AppStoreAppID = "$(APP_STORE_APP_ID)";
259
 				INFOPLIST_KEY_AppStoreDeveloperID = "$(APP_STORE_DEVELOPER_ID)";
259
 				INFOPLIST_KEY_AppStoreDeveloperID = "$(APP_STORE_DEVELOPER_ID)";
260
+				INFOPLIST_KEY_CFBundleDisplayName = "App for Indeed";
261
+				INFOPLIST_KEY_CFBundleName = "App for Indeed";
260
 				INFOPLIST_KEY_NSHumanReadableCopyright = "";
262
 				INFOPLIST_KEY_NSHumanReadableCopyright = "";
261
 				INFOPLIST_KEY_NSMainStoryboardFile = Main;
263
 				INFOPLIST_KEY_NSMainStoryboardFile = Main;
262
 				INFOPLIST_KEY_NSPrincipalClass = NSApplication;
264
 				INFOPLIST_KEY_NSPrincipalClass = NSApplication;
@@ -268,7 +270,7 @@
268
 				MARKETING_VERSION = 1.0;
270
 				MARKETING_VERSION = 1.0;
269
 				OPENAI_API_KEY = "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";
271
 				OPENAI_API_KEY = "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";
270
 				PRODUCT_BUNDLE_IDENTIFIER = "MQL-DEV.App-for-Indeed";
272
 				PRODUCT_BUNDLE_IDENTIFIER = "MQL-DEV.App-for-Indeed";
271
-				PRODUCT_NAME = "$(TARGET_NAME)";
273
+				PRODUCT_NAME = "App for Indeed";
272
 				REGISTER_APP_GROUPS = YES;
274
 				REGISTER_APP_GROUPS = YES;
273
 				STRING_CATALOG_GENERATE_SYMBOLS = YES;
275
 				STRING_CATALOG_GENERATE_SYMBOLS = YES;
274
 				SWIFT_APPROACHABLE_CONCURRENCY = YES;
276
 				SWIFT_APPROACHABLE_CONCURRENCY = YES;
@@ -293,6 +295,8 @@
293
 				GENERATE_INFOPLIST_FILE = YES;
295
 				GENERATE_INFOPLIST_FILE = YES;
294
 				INFOPLIST_KEY_AppStoreAppID = "$(APP_STORE_APP_ID)";
296
 				INFOPLIST_KEY_AppStoreAppID = "$(APP_STORE_APP_ID)";
295
 				INFOPLIST_KEY_AppStoreDeveloperID = "$(APP_STORE_DEVELOPER_ID)";
297
 				INFOPLIST_KEY_AppStoreDeveloperID = "$(APP_STORE_DEVELOPER_ID)";
298
+				INFOPLIST_KEY_CFBundleDisplayName = "App for Indeed";
299
+				INFOPLIST_KEY_CFBundleName = "App for Indeed";
296
 				INFOPLIST_KEY_NSHumanReadableCopyright = "";
300
 				INFOPLIST_KEY_NSHumanReadableCopyright = "";
297
 				INFOPLIST_KEY_NSMainStoryboardFile = Main;
301
 				INFOPLIST_KEY_NSMainStoryboardFile = Main;
298
 				INFOPLIST_KEY_NSPrincipalClass = NSApplication;
302
 				INFOPLIST_KEY_NSPrincipalClass = NSApplication;
@@ -304,7 +308,7 @@
304
 				MARKETING_VERSION = 1.0;
308
 				MARKETING_VERSION = 1.0;
305
 				OPENAI_API_KEY = "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";
309
 				OPENAI_API_KEY = "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";
306
 				PRODUCT_BUNDLE_IDENTIFIER = "MQL-DEV.App-for-Indeed";
310
 				PRODUCT_BUNDLE_IDENTIFIER = "MQL-DEV.App-for-Indeed";
307
-				PRODUCT_NAME = "$(TARGET_NAME)";
311
+				PRODUCT_NAME = "App for Indeed";
308
 				REGISTER_APP_GROUPS = YES;
312
 				REGISTER_APP_GROUPS = YES;
309
 				STRING_CATALOG_GENERATE_SYMBOLS = YES;
313
 				STRING_CATALOG_GENERATE_SYMBOLS = YES;
310
 				SWIFT_APPROACHABLE_CONCURRENCY = YES;
314
 				SWIFT_APPROACHABLE_CONCURRENCY = YES;

+ 1 - 1
App for Indeed/AppDelegate.swift

@@ -15,7 +15,7 @@ enum AppWindowConfiguration {
15
     static func apply(to window: NSWindow) {
15
     static func apply(to window: NSWindow) {
16
         window.minSize = minimumContentSize
16
         window.minSize = minimumContentSize
17
         window.isRestorable = false
17
         window.isRestorable = false
18
-        window.title = "App for Indeed"
18
+        window.title = AppMarketingLinks.appDisplayName
19
         window.styleMask.insert(.fullSizeContentView)
19
         window.styleMask.insert(.fullSizeContentView)
20
         window.titlebarAppearsTransparent = true
20
         window.titlebarAppearsTransparent = true
21
         window.titleVisibility = .hidden
21
         window.titleVisibility = .hidden

+ 4 - 1
App for Indeed/AppMarketingLinks.swift

@@ -8,6 +8,9 @@ import Foundation
8
 /// Mac App Store URLs for Settings → Share App / More Apps.
8
 /// Mac App Store URLs for Settings → Share App / More Apps.
9
 /// Override via build settings: `INFOPLIST_KEY_AppStoreAppID` and `INFOPLIST_KEY_AppStoreDeveloperID`.
9
 /// Override via build settings: `INFOPLIST_KEY_AppStoreAppID` and `INFOPLIST_KEY_AppStoreDeveloperID`.
10
 enum AppMarketingLinks {
10
 enum AppMarketingLinks {
11
+    /// Canonical app name; keep in sync with `INFOPLIST_KEY_CFBundleDisplayName` in the Xcode target.
12
+    static let displayName = "App for Indeed"
13
+
11
     /// Numeric App Store app ID from App Store Connect (e.g. `1234567890`).
14
     /// Numeric App Store app ID from App Store Connect (e.g. `1234567890`).
12
     static var macAppStoreURL: URL? {
15
     static var macAppStoreURL: URL? {
13
         guard let appID = resolvedAppStoreAppID else { return nil }
16
         guard let appID = resolvedAppStoreAppID else { return nil }
@@ -29,7 +32,7 @@ enum AppMarketingLinks {
29
            !name.isEmpty {
32
            !name.isEmpty {
30
             return name
33
             return name
31
         }
34
         }
32
-        return "App for Indeed"
35
+        return displayName
33
     }
36
     }
34
 
37
 
35
     static var shareText: String {
38
     static var shareText: String {

+ 1 - 1
App for Indeed/ProSubscriptions.storekit

@@ -31,7 +31,7 @@
31
       "localizations" : [
31
       "localizations" : [
32
 
32
 
33
       ],
33
       ],
34
-      "name" : "Indeed AI Pro",
34
+      "name" : "App for Indeed Pro",
35
       "subscriptions" : [
35
       "subscriptions" : [
36
         {
36
         {
37
           "adHocOffers" : [
37
           "adHocOffers" : [

+ 1 - 1
App for Indeed/Services/AppLaunchCoordinator.swift

@@ -14,7 +14,7 @@ enum AppLaunchCoordinator {
14
 
14
 
15
     /// Subscription refresh and product catalog load before the dashboard appears.
15
     /// Subscription refresh and product catalog load before the dashboard appears.
16
     static func performStartup(update: StatusUpdate) async {
16
     static func performStartup(update: StatusUpdate) async {
17
-        update("Starting App for Indeed…", 0.12)
17
+        update("Starting \(AppMarketingLinks.displayName)…", 0.12)
18
         try? await Task.sleep(nanoseconds: 180_000_000)
18
         try? await Task.sleep(nanoseconds: 180_000_000)
19
 
19
 
20
         update("Checking your Pro subscription…", 0.38)
20
         update("Checking your Pro subscription…", 0.38)

+ 3 - 4
App for Indeed/Views/DashboardView.swift

@@ -2143,7 +2143,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
2143
 
2143
 
2144
     private func installAssistantBubble(text: String, jobs: [JobListing]?, into host: NSView) {
2144
     private func installAssistantBubble(text: String, jobs: [JobListing]?, into host: NSView) {
2145
         let avatar = makeAssistantAvatarView()
2145
         let avatar = makeAssistantAvatarView()
2146
-        let nameLabel = NSTextField(labelWithString: "AI Job Finder")
2146
+        let nameLabel = NSTextField(labelWithString: AppMarketingLinks.appDisplayName)
2147
         nameLabel.font = .systemFont(ofSize: 11, weight: .semibold)
2147
         nameLabel.font = .systemFont(ofSize: 11, weight: .semibold)
2148
         nameLabel.textColor = Theme.secondaryText
2148
         nameLabel.textColor = Theme.secondaryText
2149
         nameLabel.alignment = .left
2149
         nameLabel.alignment = .left
@@ -2240,7 +2240,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
2240
         let icon = NSImageView()
2240
         let icon = NSImageView()
2241
         icon.translatesAutoresizingMaskIntoConstraints = false
2241
         icon.translatesAutoresizingMaskIntoConstraints = false
2242
         icon.symbolConfiguration = NSImage.SymbolConfiguration(pointSize: 15, weight: .semibold)
2242
         icon.symbolConfiguration = NSImage.SymbolConfiguration(pointSize: 15, weight: .semibold)
2243
-        icon.image = NSImage(systemSymbolName: "sparkles", accessibilityDescription: "AI Job Finder")
2243
+        icon.image = NSImage(systemSymbolName: "sparkles", accessibilityDescription: AppMarketingLinks.appDisplayName)
2244
         icon.contentTintColor = Theme.brandBlue
2244
         icon.contentTintColor = Theme.brandBlue
2245
 
2245
 
2246
         view.addSubview(icon)
2246
         view.addSubview(icon)
@@ -2362,12 +2362,11 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
2362
             $0.removeFromSuperview()
2362
             $0.removeFromSuperview()
2363
         }
2363
         }
2364
 
2364
 
2365
-        let brand = NSTextField(labelWithString: "Indeed AI\nJob Finder")
2365
+        let brand = NSTextField(labelWithString: AppMarketingLinks.appDisplayName)
2366
         brand.font = .systemFont(ofSize: 18, weight: .bold)
2366
         brand.font = .systemFont(ofSize: 18, weight: .bold)
2367
         brand.textColor = Theme.brandBlue
2367
         brand.textColor = Theme.brandBlue
2368
         brand.alignment = .left
2368
         brand.alignment = .left
2369
         brand.maximumNumberOfLines = 2
2369
         brand.maximumNumberOfLines = 2
2370
-        // Tight multiline height in the sidebar stack (zero width makes intrinsic height unreliable).
2371
         brand.preferredMaxLayoutWidth = 194
2370
         brand.preferredMaxLayoutWidth = 194
2372
         sidebar.addArrangedSubview(brand)
2371
         sidebar.addArrangedSubview(brand)
2373
         sidebar.setCustomSpacing(10, after: brand)
2372
         sidebar.setCustomSpacing(10, after: brand)

+ 4 - 4
App for Indeed/Views/LoadingView.swift

@@ -27,13 +27,13 @@ final class LoadingView: NSView {
27
     private let iconView = NSImageView()
27
     private let iconView = NSImageView()
28
     private let aiBadgeHost = NSView()
28
     private let aiBadgeHost = NSView()
29
     private let aiBadgeLabel = NSTextField(labelWithString: "AI-POWERED")
29
     private let aiBadgeLabel = NSTextField(labelWithString: "AI-POWERED")
30
-    private let titleLabel = NSTextField(labelWithString: "App for Indeed")
30
+    private let titleLabel = NSTextField(labelWithString: AppMarketingLinks.displayName)
31
     private let subtitleLabel = NSTextField(labelWithString: "Find your perfect job with the power of AI.")
31
     private let subtitleLabel = NSTextField(labelWithString: "Find your perfect job with the power of AI.")
32
     private let statusLabel = NSTextField(labelWithString: "Starting up…")
32
     private let statusLabel = NSTextField(labelWithString: "Starting up…")
33
     private let progressBar = LoadingProgressBarView()
33
     private let progressBar = LoadingProgressBarView()
34
     private let thinkingIndicator = ChatThinkingIndicatorView(
34
     private let thinkingIndicator = ChatThinkingIndicatorView(
35
         compact: false,
35
         compact: false,
36
-        accessibilityLabel: "Loading App for Indeed"
36
+        accessibilityLabel: "Loading \(AppMarketingLinks.displayName)"
37
     )
37
     )
38
 
38
 
39
     override init(frame frameRect: NSRect) {
39
     override init(frame frameRect: NSRect) {
@@ -66,7 +66,7 @@ final class LoadingView: NSView {
66
     func setStatus(_ message: String, progress: CGFloat) {
66
     func setStatus(_ message: String, progress: CGFloat) {
67
         statusLabel.stringValue = message
67
         statusLabel.stringValue = message
68
         progressBar.setProgress(progress, animated: true)
68
         progressBar.setProgress(progress, animated: true)
69
-        setAccessibilityLabel("Loading App for Indeed. \(message)")
69
+        setAccessibilityLabel("Loading \(AppMarketingLinks.displayName). \(message)")
70
     }
70
     }
71
 
71
 
72
     func startAnimating() {
72
     func startAnimating() {
@@ -221,7 +221,7 @@ final class LoadingView: NSView {
221
         installPageGradient()
221
         installPageGradient()
222
         setAccessibilityElement(true)
222
         setAccessibilityElement(true)
223
         setAccessibilityRole(.group)
223
         setAccessibilityRole(.group)
224
-        setAccessibilityLabel("Loading App for Indeed")
224
+        setAccessibilityLabel("Loading \(AppMarketingLinks.displayName)")
225
     }
225
     }
226
 
226
 
227
     private func installPageGradient() {
227
     private func installPageGradient() {