From 11ead0a939c7e75668cff02bb0e183d045025a34 Mon Sep 17 00:00:00 2001 From: Alexandre Madeira Date: Wed, 22 Nov 2023 13:30:59 -0300 Subject: [PATCH] Added notification settings support on macOS. --- CronicaWidget/Views/ItemContentList.swift | 11 +- README.md | 6 +- Shared/Manager/CronicaTelemetry.swift | 20 +- Shared/Store/SettingsStore.swift | 10 +- Shared/View/Settings/DeveloperView.swift | 292 +++++++++--------- .../Settings/NotificationsSettingsView.swift | 13 +- Shared/View/Settings/SettingsView.swift | 3 + Story.xcodeproj/project.pbxproj | 31 +- 8 files changed, 212 insertions(+), 174 deletions(-) diff --git a/CronicaWidget/Views/ItemContentList.swift b/CronicaWidget/Views/ItemContentList.swift index f13912e2..680ccd99 100644 --- a/CronicaWidget/Views/ItemContentList.swift +++ b/CronicaWidget/Views/ItemContentList.swift @@ -65,10 +65,13 @@ private struct PosterImage: View { .resizable() .aspectRatio(contentMode: .fill) #elseif os(macOS) - Image(nsImage: (NSImage(data: image) ?? NSImage(systemSymbolName: "popcorn.fill", accessibilityDescription: "")) ?? "") - .resizable() - .aspectRatio(contentMode: .fill) - + if let nsImage = NSImage(data: image) { + Image(nsImage: nsImage) + .resizable() + .aspectRatio(contentMode: .fill) + } else { + Image(systemName: "popcorn.fill") + } #endif } else { PlaceholderImage() diff --git a/README.md b/README.md index 085d36ae..b77c1652 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ You can also download the latest beta from contact@alexandremadeira.dev, I'll try to answer as quick as I can.
-I'm also availabe at iMessage, you can send a message at the same email address above.
-Follow me on Twitter: [_alexMadeira](https://twitter.com/_alexMadeira). +- If you any question, you can send me an email at contact@alexandremadeira.dev, I'll try to answer as quick as I can.
+- I'm also availabe at iMessage, you can send a message at the **same email address above**.
+- Follow Cronica on Twitter: [CronicaApp](https://twitter.com/CronicaApp). diff --git a/Shared/Manager/CronicaTelemetry.swift b/Shared/Manager/CronicaTelemetry.swift index 1f192219..4e6b633b 100644 --- a/Shared/Manager/CronicaTelemetry.swift +++ b/Shared/Manager/CronicaTelemetry.swift @@ -7,9 +7,10 @@ import Foundation import os -import TelemetryClient -#if os(macOS) || os(tvOS) +#if !os(iOS) import Aptabase +#else +import TelemetryClient #endif struct CronicaTelemetry { @@ -23,23 +24,26 @@ struct CronicaTelemetry { func setup() { #if !targetEnvironment(simulator) || !DEBUG - guard let key = Key.telemetryClientKey else { return } - let configuration = TelemetryManagerConfiguration(appID: key) - TelemetryManager.initialize(with: configuration) +#if !os(iOS) guard let aptabaseKey = Key.aptabaseClientKey else { return } Aptabase.shared.initialize(appKey: aptabaseKey) Aptabase.shared.trackEvent("app_started") +#else + guard let key = Key.telemetryClientKey else { return } + let configuration = TelemetryManagerConfiguration(appID: key) + TelemetryManager.initialize(with: configuration) +#endif #endif } - /// Send a signal using TelemetryDeck service. + /// Send a signal using TelemetryDeck service (on iOS/iPadOS) or in Aptabase (macOS, watchOS, tvOS). /// /// If it is running in Simulator or Debug, it will send a warning on logger. func handleMessage(_ message: String, for id: String) { #if targetEnvironment(simulator) || DEBUG logger.warning("\(message), for: \(id)") #else -#if os(tvOS) || os(macOS) +#if !os(iOS) Aptabase.shared.trackEvent(id, with: ["Message": message]) #else if TelemetryManager.isInitialized { @@ -49,7 +53,9 @@ struct CronicaTelemetry { #endif } +#if os(iOS) var isTelemetryDeckInitialized: String { return TelemetryManager.isInitialized.description } +#endif } diff --git a/Shared/Store/SettingsStore.swift b/Shared/Store/SettingsStore.swift index d6590e1c..7c41c240 100644 --- a/Shared/Store/SettingsStore.swift +++ b/Shared/Store/SettingsStore.swift @@ -31,9 +31,15 @@ class SettingsStore: ObservableObject { @AppStorage("primaryRightSwipe") var primaryRightSwipe: SwipeGestureOptions = .delete @AppStorage("secondaryRightSwipe") var secondaryRightSwipe: SwipeGestureOptions = .markArchive @AppStorage("allowFullSwipe") var allowFullSwipe = false +#if os(macOS) + @AppStorage("allowNotifications") var allowNotifications = false + @AppStorage("notifyMovies") var notifyMovieRelease = false + @AppStorage("notifyTVShows") var notifyNewEpisodes = false +#else @AppStorage("allowNotifications") var allowNotifications = true @AppStorage("notifyMovies") var notifyMovieRelease = true @AppStorage("notifyTVShows") var notifyNewEpisodes = true +#endif @AppStorage("userHasPurchasedTipJar") var hasPurchasedTipJar = false #if os(tvOS) @AppStorage("itemContentListDisplayType") var listsDisplayType: ItemContentListPreferredDisplayType = .card @@ -76,7 +82,7 @@ class SettingsStore: ObservableObject { @AppStorage("preferCoverOnUpNext") var preferCoverOnUpNext = false @AppStorage("markUpNextWatchedOnTap") var markWatchedOnTapUpNext = false @AppStorage("confirmationForMarkOnTapUpNext") var askForConfirmationUpNext = true - #if os(macOS) +#if os(macOS) @AppStorage("showMenuBarApp") var showMenuBarApp = true - #endif +#endif } diff --git a/Shared/View/Settings/DeveloperView.swift b/Shared/View/Settings/DeveloperView.swift index 84cfdd5d..0388a3ff 100644 --- a/Shared/View/Settings/DeveloperView.swift +++ b/Shared/View/Settings/DeveloperView.swift @@ -10,172 +10,174 @@ import CoreData /// This view provides quick information and utilities to the developer. struct DeveloperView: View { - @State private var item: ItemContent? - @State private var person: Person? - @State private var itemIdField = "" - @State private var itemMediaType: MediaType = .movie - @State private var isFetching = false - @State private var isFetchingAll = false - @State private var userAccessId = String() - @State private var userAccessToken = String() - @State private var v3SessionID = String() - private let persistence = PersistenceController.shared - private let service = NetworkService.shared - @State private var showOnboarding = false - @AppStorage("launchCount") var launchCount: Int = 0 - @AppStorage("askedForReview") var askedForReview = false - @State private var isUserSignedInWithTMDB = false - var body: some View { - Form { - Section("Network") { - TextField("ID", text: $itemIdField) + @State private var item: ItemContent? + @State private var person: Person? + @State private var itemIdField = "" + @State private var itemMediaType: MediaType = .movie + @State private var isFetching = false + @State private var isFetchingAll = false + @State private var userAccessId = String() + @State private var userAccessToken = String() + @State private var v3SessionID = String() + private let persistence = PersistenceController.shared + private let service = NetworkService.shared + @State private var showOnboarding = false + @AppStorage("launchCount") var launchCount: Int = 0 + @AppStorage("askedForReview") var askedForReview = false + @State private var isUserSignedInWithTMDB = false + var body: some View { + Form { + Section("Network") { + TextField("ID", text: $itemIdField) #if os(iOS) - .keyboardType(.numberPad) + .keyboardType(.numberPad) #endif - Picker("Media Type", selection: $itemMediaType) { - ForEach(MediaType.allCases) { media in - Text(media.title).tag(media) - } - } - Button { - Task { - if !itemIdField.isEmpty { - await MainActor.run { - withAnimation { isFetching = false } - } - if itemMediaType != .person { - let item = try? await service.fetchItem(id: Int(itemIdField)!, type: itemMediaType) - if let item { - self.item = item - } - } else { - let person = try? await service.fetchPerson(id: Int(itemIdField)!) - guard let person else { return } - self.person = person - } - } - await MainActor.run { - withAnimation { isFetching = false } - } - } - } label: { - if isFetching { - CenterHorizontalView { - ProgressView() - } - } else { - Text("Fetch") - } - } + Picker("Media Type", selection: $itemMediaType) { + ForEach(MediaType.allCases) { media in + Text(media.title).tag(media) + } + } + Button { + Task { + if !itemIdField.isEmpty { + await MainActor.run { + withAnimation { isFetching = false } + } + if itemMediaType != .person { + let item = try? await service.fetchItem(id: Int(itemIdField)!, type: itemMediaType) + if let item { + self.item = item + } + } else { + let person = try? await service.fetchPerson(id: Int(itemIdField)!) + guard let person else { return } + self.person = person + } + } + await MainActor.run { + withAnimation { isFetching = false } + } + } + } label: { + if isFetching { + CenterHorizontalView { + ProgressView() + } + } else { + Text("Fetch") + } + } #if os(macOS) .buttonStyle(.link) #endif - } - - Section("Presentation") { - Button("Show Onboarding") { - showOnboarding.toggle() - } - .sheet(isPresented: $showOnboarding) { - NavigationStack { - WelcomeView() - .interactiveDismissDisabled(false) - } + } + + Section("Presentation") { + Button("Show Onboarding") { + showOnboarding.toggle() + } + .sheet(isPresented: $showOnboarding) { + NavigationStack { + WelcomeView() + .interactiveDismissDisabled(false) + } #if os(macOS) - .frame(width: 500, height: 700, alignment: .center) + .frame(width: 500, height: 700, alignment: .center) #endif - } + } #if os(macOS) .buttonStyle(.link) #endif - } - - Section { - Text("User Region: \(Locale.userRegion)") - Text("User Lang: \(Locale.userLang)") - Text("Is TelemetryDeck Initialized: \(CronicaTelemetry.shared.isTelemetryDeckInitialized)") - Text("Last maintenance: \(BackgroundManager.shared.lastMaintenance?.convertDateToString() ?? "Nil")") - Text("Last watching refresh: \(BackgroundManager.shared.lastWatchingRefresh?.convertDateToString() ?? "Nil")") - Text("Last upcoming refresh: \(BackgroundManager.shared.lastUpcomingRefresh?.convertDateToString() ?? "Nil")") - Text("Asked for review: \(askedForReview.description)") - Text("Is User Signed In With TMDB: \(isUserSignedInWithTMDB.description)") - Button("Reset asked for review") { askedForReview = false } + } + + Section { + Text("User Region: \(Locale.userRegion)") + Text("User Lang: \(Locale.userLang)") +#if os(iOS) + Text("Is TelemetryDeck Initialized: \(CronicaTelemetry.shared.isTelemetryDeckInitialized)") +#endif + Text("Last maintenance: \(BackgroundManager.shared.lastMaintenance?.convertDateToString() ?? "Nil")") + Text("Last watching refresh: \(BackgroundManager.shared.lastWatchingRefresh?.convertDateToString() ?? "Nil")") + Text("Last upcoming refresh: \(BackgroundManager.shared.lastUpcomingRefresh?.convertDateToString() ?? "Nil")") + Text("Asked for review: \(askedForReview.description)") + Text("Is User Signed In With TMDB: \(isUserSignedInWithTMDB.description)") + Button("Reset asked for review") { askedForReview = false } Button("Force SignOut") { Task { await AccountManager.shared.logOut() } } - } - .onAppear { - let data = KeychainHelper.standard.read(service: "access-token", account: "cronicaTMDB-Sync") - let IdData = KeychainHelper.standard.read(service: "access-id", account: "cronicaTMDB-Sync") - let sessionID = KeychainHelper.standard.read(service: "session-id", account: "cronicaTMDB-Sync") - if data != nil && IdData != nil && sessionID != nil { - isUserSignedInWithTMDB = true - } - } - - } - .navigationTitle("Developer Options") - .sheet(item: $item) { item in - NavigationStack { - ItemContentDetails(title: item.itemTitle, id: item.id, type: item.itemContentMedia, handleToolbar: true) - .toolbar { + } + .onAppear { + let data = KeychainHelper.standard.read(service: "access-token", account: "cronicaTMDB-Sync") + let IdData = KeychainHelper.standard.read(service: "access-id", account: "cronicaTMDB-Sync") + let sessionID = KeychainHelper.standard.read(service: "session-id", account: "cronicaTMDB-Sync") + if data != nil && IdData != nil && sessionID != nil { + isUserSignedInWithTMDB = true + } + } + + } + .navigationTitle("Developer Options") + .sheet(item: $item) { item in + NavigationStack { + ItemContentDetails(title: item.itemTitle, id: item.id, type: item.itemContentMedia, handleToolbar: true) + .toolbar { #if os(iOS) - ToolbarItem(placement: .navigationBarLeading) { - HStack { - Button("Done") { - self.item = nil - } - Menu { - Button { - let watchlist = PersistenceController.shared.fetch(for: item.itemContentID) - if let watchlist { - CronicaTelemetry.shared.handleMessage("WatchlistItem: \(watchlist as Any)", - for: "DeveloperView.printObject") - } - CronicaTelemetry.shared.handleMessage("ItemContent: \(item as Any)", - for: "DeveloperView.printObject") - } label: { - Label("Send Object to Developer", systemImage: "hammer.circle.fill") - } - } label: { - Image(systemName: "hammer") - } - } - } + ToolbarItem(placement: .navigationBarLeading) { + HStack { + Button("Done") { + self.item = nil + } + Menu { + Button { + let watchlist = PersistenceController.shared.fetch(for: item.itemContentID) + if let watchlist { + CronicaTelemetry.shared.handleMessage("WatchlistItem: \(watchlist as Any)", + for: "DeveloperView.printObject") + } + CronicaTelemetry.shared.handleMessage("ItemContent: \(item as Any)", + for: "DeveloperView.printObject") + } label: { + Label("Send Object to Developer", systemImage: "hammer.circle.fill") + } + } label: { + Image(systemName: "hammer") + } + } + } #else - Button("Done") { self.item = nil } + Button("Done") { self.item = nil } #endif - } - .navigationDestination(for: ItemContent.self) { item in - ItemContentDetails(title: item.itemTitle, id: item.id, type: item.itemContentMedia) - } - .navigationDestination(for: Person.self) { item in + } + .navigationDestination(for: ItemContent.self) { item in + ItemContentDetails(title: item.itemTitle, id: item.id, type: item.itemContentMedia) + } + .navigationDestination(for: Person.self) { item in PersonDetailsView(name: item.name, id: item.id) - } - } - } - .sheet(item: $person) { item in - NavigationStack { + } + } + } + .sheet(item: $person) { item in + NavigationStack { PersonDetailsView(name: item.name, id: item.id) - .toolbar { - ToolbarItem { - Button("Done") { - self.person = nil - } - } - } - .navigationDestination(for: ItemContent.self) { item in - ItemContentDetails(title: item.itemTitle, id: item.id, type: item.itemContentMedia) - } - .navigationDestination(for: Person.self) { item in + .toolbar { + ToolbarItem { + Button("Done") { + self.person = nil + } + } + } + .navigationDestination(for: ItemContent.self) { item in + ItemContentDetails(title: item.itemTitle, id: item.id, type: item.itemContentMedia) + } + .navigationDestination(for: Person.self) { item in PersonDetailsView(name: item.name, id: item.id) - } - } - } + } + } + } #if os(macOS) - .formStyle(.grouped) + .formStyle(.grouped) #endif - } + } } #Preview { diff --git a/Shared/View/Settings/NotificationsSettingsView.swift b/Shared/View/Settings/NotificationsSettingsView.swift index 916facd5..ee34af81 100644 --- a/Shared/View/Settings/NotificationsSettingsView.swift +++ b/Shared/View/Settings/NotificationsSettingsView.swift @@ -15,13 +15,13 @@ struct NotificationsSettingsView: View { Section { Toggle("allowNotification", isOn: $settings.allowNotifications) Toggle(isOn: $settings.notifyMovieRelease) { - Text("movieNotificationTitle") - Text("movieNotificationSubtitle") + Text("movieNotificationTitle") + Text("movieNotificationSubtitle") } .disabled(!settings.allowNotifications) Toggle(isOn: $settings.notifyNewEpisodes) { - Text("episodeNotificationTitle") - Text("episodeNotificationSubtitle") + Text("episodeNotificationTitle") + Text("episodeNotificationSubtitle") } .disabled(!settings.allowNotifications) @@ -32,18 +32,17 @@ struct NotificationsSettingsView: View { settings.notifyNewEpisodes = false } } - +#if os(iOS) Button("openNotificationInSettings") { Task { -#if os(iOS) // Create the URL that deep links to your app's notification settings. if let url = URL(string: UIApplication.openNotificationSettingsURLString) { // Ask the system to open that URL. await UIApplication.shared.open(url) } -#endif } } +#endif } .navigationTitle(NSLocalizedString(navigationTitle, comment: "")) #if os(macOS) diff --git a/Shared/View/Settings/SettingsView.swift b/Shared/View/Settings/SettingsView.swift index 8f03ee31..580a9c2b 100644 --- a/Shared/View/Settings/SettingsView.swift +++ b/Shared/View/Settings/SettingsView.swift @@ -104,6 +104,9 @@ struct SettingsView: View { SyncSetting() .tabItem { Label("settingsSyncTitle", systemImage: "arrow.triangle.2.circlepath") } + NotificationsSettingsView() + .tabItem { Label("settingsNotificationTitle", systemImage: "bell") } + RegionContentSettings() .tabItem { Label("settingsRegionContentTitle", systemImage: "globe") } diff --git a/Story.xcodeproj/project.pbxproj b/Story.xcodeproj/project.pbxproj index 453852cb..8a928ed8 100644 --- a/Story.xcodeproj/project.pbxproj +++ b/Story.xcodeproj/project.pbxproj @@ -204,7 +204,7 @@ B87D1B252A65D78900EB6D14 /* UpNextViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B87D1B232A65CF6000EB6D14 /* UpNextViewModel.swift */; }; B87D1B272A65E63700EB6D14 /* UpNextListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B87D1B262A65E63700EB6D14 /* UpNextListView.swift */; }; B87D1B292A66128000EB6D14 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B87D1B282A66128000EB6D14 /* SettingsView.swift */; }; - B87F745E280605CE00E94126 /* TelemetryClient in Frameworks */ = {isa = PBXBuildFile; productRef = B87F745D280605CE00E94126 /* TelemetryClient */; }; + B87F745E280605CE00E94126 /* TelemetryClient in Frameworks */ = {isa = PBXBuildFile; platformFilter = ios; productRef = B87F745D280605CE00E94126 /* TelemetryClient */; }; B87F746328064D3800E94126 /* BackgroundManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B87F746228064D3800E94126 /* BackgroundManager.swift */; }; B87F74642806592E00E94126 /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8B271A327A59EF400F6463F /* CloudKit.framework */; }; B883A1DE2AEEA49E00793EE2 /* EditCustomListItemSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = B883A1DD2AEEA49E00793EE2 /* EditCustomListItemSelector.swift */; }; @@ -313,7 +313,7 @@ B8D7AEA928B95F5E0053CE5A /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8AD4431284AD42300778275 /* SwiftUI.framework */; }; B8D7AEAC28B95F5E0053CE5A /* CronicaWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D7AEAB28B95F5E0053CE5A /* CronicaWidget.swift */; }; B8D7AEAE28B95F5F0053CE5A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B8D7AEAD28B95F5F0053CE5A /* Assets.xcassets */; }; - B8D7AEB228B95F5F0053CE5A /* CronicaWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = B8D7AEA728B95F5D0053CE5A /* CronicaWidgetExtension.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + B8D7AEB228B95F5F0053CE5A /* CronicaWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = B8D7AEA728B95F5D0053CE5A /* CronicaWidgetExtension.appex */; platformFilters = (ios, macos, ); settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; B8D7AEBA28B95FB20053CE5A /* Key.swift in Sources */ = {isa = PBXBuildFile; fileRef = B86E587827A48E5A005DBF38 /* Key.swift */; }; B8D7AEBB28B95FC60053CE5A /* ItemContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D7AEB828B95F840053CE5A /* ItemContent.swift */; }; B8D7AEBC28B960420053CE5A /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B8CC954D27D1310B00B6757C /* Localizable.strings */; }; @@ -327,12 +327,14 @@ B8D7AEC928B961AD0053CE5A /* ReleaseDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D7AEC728B961A20053CE5A /* ReleaseDate.swift */; }; B8D7AECA28B961AE0053CE5A /* ReleaseDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D7AEC728B961A20053CE5A /* ReleaseDate.swift */; }; B8D7AECF28B962660053CE5A /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D7AECD28B962490053CE5A /* Person.swift */; }; - B8D7AEDC28B967180053CE5A /* TelemetryClient in Frameworks */ = {isa = PBXBuildFile; productRef = B8D7AEDB28B967180053CE5A /* TelemetryClient */; }; + B8D7AEDC28B967180053CE5A /* TelemetryClient in Frameworks */ = {isa = PBXBuildFile; platformFilter = ios; productRef = B8D7AEDB28B967180053CE5A /* TelemetryClient */; }; B8D7AEE328BA64DF0053CE5A /* DataPlaceholder.json in Resources */ = {isa = PBXBuildFile; fileRef = B8D7AEE228BA64DF0053CE5A /* DataPlaceholder.json */; }; B8D7AEE428BA64F40053CE5A /* Bundle-Decodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B82C268E279644E000259D98 /* Bundle-Decodable.swift */; }; B8D8AF8F27D4D0550042AEB6 /* AttributionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8AF8E27D4D0550042AEB6 /* AttributionView.swift */; }; B8D8AF9227D4DB720042AEB6 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D8AF9127D4DB720042AEB6 /* SearchViewModel.swift */; }; B8DA5CC62B0E432200678592 /* UpNextMenuBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8DA5CC52B0E432200678592 /* UpNextMenuBar.swift */; }; + B8DA5CC82B0E496600678592 /* Aptabase in Frameworks */ = {isa = PBXBuildFile; productRef = B8DA5CC72B0E496600678592 /* Aptabase */; }; + B8DA5CCA2B0E5DC800678592 /* Aptabase in Frameworks */ = {isa = PBXBuildFile; platformFilters = (macos, ); productRef = B8DA5CC92B0E5DC800678592 /* Aptabase */; }; B8DD56A1290DE2FD002CAAFD /* CenterHorizontalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8DD569F290DE2D7002CAAFD /* CenterHorizontalView.swift */; }; B8DD56A2290DE2FE002CAAFD /* CenterHorizontalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8DD569F290DE2D7002CAAFD /* CenterHorizontalView.swift */; }; B8E3ABF62955361C00CA0945 /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8E3ABF52955361C00CA0945 /* CloudKit.framework */; }; @@ -713,6 +715,7 @@ buildActionMask = 2147483647; files = ( B8E3ABF62955361C00CA0945 /* CloudKit.framework in Frameworks */, + B8DA5CC82B0E496600678592 /* Aptabase in Frameworks */, B84043DD289B360B00D5CEBF /* SDWebImageSwiftUI in Frameworks */, B8C0C67F28A92FF0009F4593 /* TelemetryClient in Frameworks */, ); @@ -735,6 +738,7 @@ buildActionMask = 2147483647; files = ( B8D7AEDC28B967180053CE5A /* TelemetryClient in Frameworks */, + B8DA5CCA2B0E5DC800678592 /* Aptabase in Frameworks */, B8D7AEA928B95F5E0053CE5A /* SwiftUI.framework in Frameworks */, B8D7AEA828B95F5E0053CE5A /* WidgetKit.framework in Frameworks */, ); @@ -1491,6 +1495,7 @@ packageProductDependencies = ( B84043DC289B360B00D5CEBF /* SDWebImageSwiftUI */, B8C0C67E28A92FF0009F4593 /* TelemetryClient */, + B8DA5CC72B0E496600678592 /* Aptabase */, ); productName = "CronicaWatch Watch App"; productReference = B806C4DE2899BE2800A5330E /* Cronica.app */; @@ -1538,6 +1543,7 @@ name = CronicaWidgetExtension; packageProductDependencies = ( B8D7AEDB28B967180053CE5A /* TelemetryClient */, + B8DA5CC92B0E5DC800678592 /* Aptabase */, ); productName = CronicaWidgetExtension; productReference = B8D7AEA728B95F5D0053CE5A /* CronicaWidgetExtension.appex */; @@ -2049,7 +2055,10 @@ }; B8D7AEB128B95F5F0053CE5A /* PBXTargetDependency */ = { isa = PBXTargetDependency; - platformFilter = ios; + platformFilters = ( + ios, + macos, + ); target = B8D7AEA628B95F5D0053CE5A /* CronicaWidgetExtension */; targetProxy = B8D7AEB028B95F5F0053CE5A /* PBXContainerItemProxy */; }; @@ -2447,7 +2456,7 @@ CODE_SIGN_ENTITLEMENTS = CronicaWidget/Configuration/CronicaWidgetExtension.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 260; DEVELOPMENT_TEAM = 2NF329R2JB; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = CronicaWidget/Configuration/Info.plist; @@ -2482,7 +2491,7 @@ CODE_SIGN_ENTITLEMENTS = CronicaWidget/Configuration/CronicaWidgetExtension.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 260; DEVELOPMENT_TEAM = 2NF329R2JB; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = CronicaWidget/Configuration/Info.plist; @@ -2671,6 +2680,16 @@ package = B87F745C280605CE00E94126 /* XCRemoteSwiftPackageReference "SwiftClient" */; productName = TelemetryClient; }; + B8DA5CC72B0E496600678592 /* Aptabase */ = { + isa = XCSwiftPackageProductDependency; + package = B8F367622AF5CA900027CAF9 /* XCRemoteSwiftPackageReference "aptabase-swift" */; + productName = Aptabase; + }; + B8DA5CC92B0E5DC800678592 /* Aptabase */ = { + isa = XCSwiftPackageProductDependency; + package = B8F367622AF5CA900027CAF9 /* XCRemoteSwiftPackageReference "aptabase-swift" */; + productName = Aptabase; + }; B8F367632AF5CAAA0027CAF9 /* Aptabase */ = { isa = XCSwiftPackageProductDependency; package = B8F367622AF5CA900027CAF9 /* XCRemoteSwiftPackageReference "aptabase-swift" */;