AppMarketingLinks.swift 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //
  2. // AppMarketingLinks.swift
  3. // App for Indeed
  4. //
  5. import Foundation
  6. /// Mac App Store URLs for Settings → Share App / More Apps.
  7. /// Override via build settings: `INFOPLIST_KEY_AppStoreAppID` and `INFOPLIST_KEY_AppStoreDeveloperID`.
  8. enum AppMarketingLinks {
  9. /// Official app name — never localized.
  10. static let displayName = "App for Indeed"
  11. /// Indeed® brand mark for alerts and host labels — always Latin “Indeed”.
  12. static let indeedBrandName = "Indeed"
  13. /// Sidebar / nav label for opening Indeed (localized via `"Indeed"` in `Localizable.strings`).
  14. static var localizedIndeedNavTitle: String { L("Indeed") }
  15. /// Numeric App Store app ID from App Store Connect (e.g. `1234567890`).
  16. static var macAppStoreURL: URL? {
  17. guard let appID = resolvedAppStoreAppID else { return nil }
  18. return URL(string: "https://apps.apple.com/app/id\(appID)")
  19. }
  20. /// Developer catalog on the App Store (other apps by the same publisher).
  21. static var developerAppsURL: URL? {
  22. guard let developerID = resolvedAppStoreDeveloperID else { return nil }
  23. return URL(string: "https://apps.apple.com/developer/-/id\(developerID)")
  24. }
  25. static var appDisplayName: String {
  26. displayName
  27. }
  28. static var shareText: String {
  29. let name = appDisplayName
  30. if let url = macAppStoreURL {
  31. return String(format: L("Check out %@ on the Mac App Store:\n%@"), name, url.absoluteString)
  32. }
  33. return String(format: L("Check out %@ on the Mac App Store."), name)
  34. }
  35. static var shareEmailSubject: String {
  36. String(format: L("Check out %@"), appDisplayName)
  37. }
  38. /// Payload for `NSSharingServicePicker` (Mail, Messages, AirDrop, Notes, Copy Link, etc.).
  39. static var shareItems: [Any] {
  40. var items: [Any] = [shareText as NSString]
  41. if let url = macAppStoreURL {
  42. items.append(url)
  43. }
  44. return items
  45. }
  46. static var isConfigured: Bool {
  47. macAppStoreURL != nil
  48. }
  49. private static var resolvedAppStoreAppID: String? {
  50. normalizedID(from: Bundle.main.object(forInfoDictionaryKey: "AppStoreAppID"))
  51. }
  52. private static var resolvedAppStoreDeveloperID: String? {
  53. normalizedID(from: Bundle.main.object(forInfoDictionaryKey: "AppStoreDeveloperID"))
  54. }
  55. private static func normalizedID(from value: Any?) -> String? {
  56. guard let raw = value as? String else { return nil }
  57. let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines)
  58. guard !trimmed.isEmpty else { return nil }
  59. return trimmed
  60. }
  61. }