Rename iFeels to Feels across entire codebase

- Bundle IDs: com.tt.ifeel* → com.tt.feels*
- App Groups: group.com.tt.ifeel* → group.com.tt.feels*
- iCloud containers: iCloud.com.tt.ifeel* → iCloud.com.tt.feels*
- IAP product IDs: com.tt.ifeel.IAP.* → com.tt.feels.IAP.*
- URLs: ifeels.app → feels.app
- Logger subsystems and dispatch queues
- Product names and display names

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-01 11:57:44 -06:00
parent fa937793d9
commit e5656f47fd
27 changed files with 12693 additions and 12677 deletions

View File

@@ -92,7 +92,7 @@
"locale" : "en_US"
}
],
"productID" : "com.tt.ifeel.IAP.subscriptions.monthly",
"productID" : "com.tt.feels.IAP.subscriptions.monthly",
"recurringSubscriptionPeriod" : "P1M",
"referenceName" : "Monthly",
"subscriptionGroupID" : "2CFE4C4F",
@@ -120,7 +120,7 @@
"locale" : "en_US"
}
],
"productID" : "com.tt.ifeel.IAP.subscriptions.yearly",
"productID" : "com.tt.feels.IAP.subscriptions.yearly",
"recurringSubscriptionPeriod" : "P1Y",
"referenceName" : "Yearly",
"subscriptionGroupID" : "2CFE4C4F",

View File

@@ -4,7 +4,7 @@
<dict>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.tt.ifeelDebug</string>
<string>iCloud.com.tt.feelsDebug</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
@@ -12,7 +12,7 @@
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.tt.ifeelDebug</string>
<string>group.com.tt.feelsDebug</string>
</array>
<key>com.apple.developer.healthkit</key>
<true/>

View File

@@ -6,7 +6,7 @@
<string>development</string>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.tt.ifeelDebug</string>
<string>iCloud.com.tt.feelsDebug</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
@@ -14,7 +14,7 @@
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.tt.ifeelDebug</string>
<string>group.com.tt.feelsDebug</string>
</array>
<key>com.apple.developer.healthkit</key>
<true/>

View File

@@ -4,7 +4,7 @@
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.tt.ifeel</string>
<string>group.com.tt.feels</string>
</array>
</dict>
</plist>

View File

@@ -4,7 +4,7 @@
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.tt.ifeelDebug</string>
<string>group.com.tt.feelsDebug</string>
</array>
</dict>
</plist>

View File

@@ -4,13 +4,13 @@
<dict>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.tt.ifeel.dbUpdateMissing</string>
<string>com.tt.feels.dbUpdateMissing</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.tt.ifeel</string>
<string>com.tt.feels</string>
<key>CFBundleURLSchemes</key>
<array>
<string>feels</string>

View File

@@ -65,7 +65,7 @@
1C0DAB50279DB0FB003B1F21 /* Feels/Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Feels/Localizable.xcstrings; sourceTree = "<group>"; };
1CB4D09E28787B3C00902A56 /* Configuration.storekit */ = {isa = PBXFileReference; lastKnownFileType = text; path = Configuration.storekit; sourceTree = "<group>"; };
1CB4D09F28787D8A00902A56 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.5.sdk/System/Library/Frameworks/StoreKit.framework; sourceTree = DEVELOPER_DIR; };
1CD90AF5278C7DE0001C4FEA /* iFeels.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iFeels.app; sourceTree = BUILT_PRODUCTS_DIR; };
1CD90AF5278C7DE0001C4FEA /* Feels.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Feels.app; sourceTree = BUILT_PRODUCTS_DIR; };
1CD90AFB278C7DE0001C4FEA /* Feels.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Feels.app; sourceTree = BUILT_PRODUCTS_DIR; };
1CD90AFD278C7DE0001C4FEA /* macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS.entitlements; sourceTree = "<group>"; };
1CD90B02278C7DE0001C4FEA /* Tests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -220,7 +220,7 @@
isa = PBXGroup;
children = (
1E594AEAB5F046E3B3ED7C47 /* Feels Watch App.app */,
1CD90AF5278C7DE0001C4FEA /* iFeels.app */,
1CD90AF5278C7DE0001C4FEA /* Feels.app */,
1CD90AFB278C7DE0001C4FEA /* Feels.app */,
1CD90B02278C7DE0001C4FEA /* Tests iOS.xctest */,
1CD90B0E278C7DE0001C4FEA /* Tests macOS.xctest */,
@@ -291,7 +291,7 @@
1C9566432EF8F5F70032E68F /* Algorithms */,
);
productName = "Feels (iOS)";
productReference = 1CD90AF5278C7DE0001C4FEA /* iFeels.app */;
productReference = 1CD90AF5278C7DE0001C4FEA /* Feels.app */;
productType = "com.apple.product-type.application";
};
1CD90AFA278C7DE0001C4FEA /* Feels (macOS) */ = {
@@ -582,14 +582,14 @@
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = Feels;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.tt.ifeelDebug;
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.tt.feelsDebug;
INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = NO;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.2;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.ifeelDebug.watchkitapp;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.feelsDebug.watchkitapp;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
SKIP_INSTALL = YES;
@@ -748,8 +748,8 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.2;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.ifeelDebug;
PRODUCT_NAME = iFeels;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.feelsDebug;
PRODUCT_NAME = Feels;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
SWIFT_EMIT_LOC_STRINGS = YES;
@@ -783,8 +783,8 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.2;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.ifeelDebug;
PRODUCT_NAME = iFeels;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.feelsDebug;
PRODUCT_NAME = Feels;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
SWIFT_EMIT_LOC_STRINGS = YES;
@@ -817,7 +817,7 @@
);
MACOSX_DEPLOYMENT_TARGET = 12.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.ifeel;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.feels;
PRODUCT_NAME = Feels;
SDKROOT = macosx;
SWIFT_EMIT_LOC_STRINGS = YES;
@@ -848,7 +848,7 @@
);
MACOSX_DEPLOYMENT_TARGET = 12.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.ifeelDebug;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.feelsDebug;
PRODUCT_NAME = Feels;
SDKROOT = macosx;
SWIFT_EMIT_LOC_STRINGS = YES;
@@ -940,7 +940,7 @@
CURRENT_PROJECT_VERSION = 23;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "FeelsWidgetExtension-Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = iFeelsWidget;
INFOPLIST_KEY_CFBundleDisplayName = FeelsWidget;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
LD_RUNPATH_SEARCH_PATHS = (
@@ -949,7 +949,7 @@
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0.2;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.ifeelDebug.FeelsWidgetDebug;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.feelsDebug.FeelsWidgetDebug;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
@@ -972,7 +972,7 @@
CURRENT_PROJECT_VERSION = 23;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "FeelsWidgetExtension-Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = iFeelsWidget;
INFOPLIST_KEY_CFBundleDisplayName = FeelsWidget;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
LD_RUNPATH_SEARCH_PATHS = (
@@ -981,7 +981,7 @@
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0.2;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.ifeelDebug.FeelsWidget;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.feelsDebug.FeelsWidget;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
@@ -1006,14 +1006,14 @@
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = Feels;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.tt.ifeel;
INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.tt.feels;
INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = NO;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.2;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.ifeel.watchkitapp;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.feels.watchkitapp;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = watchos;
SKIP_INSTALL = YES;

View File

@@ -15,7 +15,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "iFeels.app"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
</BuildableReference>
@@ -55,7 +55,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "iFeels.app"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
</BuildableReference>
@@ -75,7 +75,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "iFeels.app"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
</BuildableReference>

View File

@@ -30,7 +30,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "iFeels.app"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
</BuildableReference>
@@ -72,7 +72,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "iFeels.app"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
</BuildableReference>
@@ -108,7 +108,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1CD90AF4278C7DE0001C4FEA"
BuildableName = "iFeels.app"
BuildableName = "Feels.app"
BlueprintName = "Feels (iOS)"
ReferencedContainer = "container:Feels.xcodeproj">
</BuildableReference>

View File

@@ -12,12 +12,12 @@
<key>Feels (macOS).xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
<integer>3</integer>
</dict>
<key>Feels Watch App.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
<integer>2</integer>
</dict>
<key>FeelsWidgetExtension.xcscheme_^#shared#^_</key>
<dict>

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@
<dict>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.tt.ifeelDebug</string>
<string>iCloud.com.tt.feelsDebug</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
@@ -12,7 +12,7 @@
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.tt.ifeelDebug</string>
<string>group.com.tt.feelsDebug</string>
</array>
</dict>
</plist>

View File

@@ -6,7 +6,7 @@
<string>development</string>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.tt.ifeelDebug</string>
<string>iCloud.com.tt.feelsDebug</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
@@ -14,7 +14,7 @@
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.tt.ifeelDebug</string>
<string>group.com.tt.feelsDebug</string>
</array>
</dict>
</plist>

View File

@@ -9,7 +9,7 @@ import Foundation
import BackgroundTasks
class BGTask {
static let updateDBMissingID = "com.tt.ifeel.dbUpdateMissing"
static let updateDBMissingID = "com.tt.feels.dbUpdateMissing"
@MainActor
class func runFillInMissingDatesTask(task: BGProcessingTask) {

View File

@@ -14,7 +14,7 @@ class HealthKitManager: ObservableObject {
static let shared = HealthKitManager()
private let healthStore = HKHealthStore()
private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.ifeel", category: "HealthKit")
private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.feels", category: "HealthKit")
@Published var isAuthorized = false
@Published var authorizationError: Error?

View File

@@ -45,8 +45,8 @@ class IAPManager: ObservableObject {
static let subscriptionGroupID = "2CFE4C4F"
private let productIdentifiers: Set<String> = [
"com.tt.ifeel.IAP.subscriptions.monthly",
"com.tt.ifeel.IAP.subscriptions.yearly"
"com.tt.feels.IAP.subscriptions.monthly",
"com.tt.feels.IAP.subscriptions.yearly"
]
private let trialDays = 30

View File

@@ -15,7 +15,7 @@ import os.log
final class MoodLogger {
static let shared = MoodLogger()
private static let logger = Logger(subsystem: "com.tt.ifeel", category: "MoodLogger")
private static let logger = Logger(subsystem: "com.tt.feels", category: "MoodLogger")
/// Key for tracking the last date side effects were applied
private static let lastSideEffectsDateKey = "lastSideEffectsAppliedDate"

View File

@@ -11,7 +11,7 @@ import os.log
@MainActor
final class DataController: ObservableObject {
private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.ifeel", category: "DataController")
private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.feels", category: "DataController")
static let shared = DataController()
private(set) var container: ModelContainer

View File

@@ -20,7 +20,7 @@ final class ExtensionDataProvider {
static let shared = ExtensionDataProvider()
private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.ifeel", category: "ExtensionDataProvider")
private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.feels", category: "ExtensionDataProvider")
private var _container: ModelContainer?

View File

@@ -25,7 +25,7 @@ enum SharedModelContainerError: LocalizedError {
}
enum SharedModelContainer {
private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.ifeel", category: "SharedModelContainer")
private static let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "com.tt.feels", category: "SharedModelContainer")
/// Creates a ModelContainer with the appropriate configuration for app group sharing
/// - Parameter useCloudKit: Whether to enable CloudKit sync (defaults to true)
@@ -107,9 +107,9 @@ enum SharedModelContainer {
/// CloudKit container identifier based on build configuration
static var cloudKitContainerID: String {
#if DEBUG
return "iCloud.com.tt.ifeelDebug"
return "iCloud.com.tt.feelsDebug"
#else
return "iCloud.com.tt.ifeel"
return "iCloud.com.tt.feels"
#endif
}

View File

@@ -10,8 +10,8 @@ import SwiftUI
import SwiftData
struct Constants {
static let groupShareId = "group.com.tt.ifeel"
static let groupShareIdDebug = "group.com.tt.ifeelDebug"
static let groupShareId = "group.com.tt.feels"
static let groupShareIdDebug = "group.com.tt.feelsDebug"
static var currentGroupShareId: String {
#if DEBUG

View File

@@ -29,6 +29,6 @@ enum AppLogger {
// MARK: - Private
private static var subsystem: String {
Bundle.main.bundleIdentifier ?? "com.tt.ifeel"
Bundle.main.bundleIdentifier ?? "com.tt.feels"
}
}

View File

@@ -13,7 +13,7 @@ final class ImageCache {
static let shared = ImageCache()
private let cache = NSCache<NSString, UIImage>()
private let queue = DispatchQueue(label: "com.tt.ifeel.imagecache", qos: .userInitiated)
private let queue = DispatchQueue(label: "com.tt.feels.imagecache", qos: .userInitiated)
private init() {
// Configure cache limits

View File

@@ -17,7 +17,7 @@ final class WatchConnectivityManager: NSObject, ObservableObject {
static let shared = WatchConnectivityManager()
private static let logger = Logger(subsystem: "com.tt.ifeel", category: "WatchConnectivity")
private static let logger = Logger(subsystem: "com.tt.feels", category: "WatchConnectivity")
private var session: WCSession?

View File

@@ -72,7 +72,7 @@ extension VoteMoodIntent: ForegroundContinuableIntent {}
#if WIDGET_EXTENSION
enum WidgetMoodSaver {
private static let logger = Logger(subsystem: "com.tt.ifeel.widget", category: "WidgetMoodSaver")
private static let logger = Logger(subsystem: "com.tt.feels.widget", category: "WidgetMoodSaver")
@MainActor
static func save(mood: Mood, date: Date) {

View File

@@ -683,7 +683,7 @@ struct SettingsContentView: View {
theme.currentTheme.secondaryBGColor
Button(action: {
EventLogger.log(event: "show_eula")
if let url = URL(string: "https://ifeels.app/eula.html") {
if let url = URL(string: "https://feels.app/eula.html") {
UIApplication.shared.open(url)
}
}, label: {
@@ -702,7 +702,7 @@ struct SettingsContentView: View {
theme.currentTheme.secondaryBGColor
Button(action: {
EventLogger.log(event: "show_privacy")
if let url = URL(string: "https://ifeels.app/privacy.html") {
if let url = URL(string: "https://feels.app/privacy.html") {
UIApplication.shared.open(url)
}
}, label: {
@@ -1367,7 +1367,7 @@ struct SettingsView: View {
theme.currentTheme.secondaryBGColor
Button(action: {
EventLogger.log(event: "show_eula")
openURL(URL(string: "https://ifeels.app/eula.html")!)
openURL(URL(string: "https://feels.app/eula.html")!)
}, label: {
Text(String(localized: "settings_view_show_eula"))
.foregroundColor(textColor)
@@ -1383,7 +1383,7 @@ struct SettingsView: View {
theme.currentTheme.secondaryBGColor
Button(action: {
EventLogger.log(event: "show_privacy")
openURL(URL(string: "https://ifeels.app/privacy.html")!)
openURL(URL(string: "https://feels.app/privacy.html")!)
}, label: {
Text(String(localized: "settings_view_show_privacy"))
.foregroundColor(textColor)