Commit 716fa334 by Demid Merzlyakov

IOS-200: shared user defaults for the widget and the app + migrate old user…

IOS-200: shared user defaults for the widget and the app + migrate old user defaults to the new ones.
parent dc481cce
...@@ -41,6 +41,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -41,6 +41,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
ThemeManager.refreshAppearance() ThemeManager.refreshAppearance()
UserDefaults.migrateUserDefaultsToAppGroupsIfNeeded()
if let launchOptions = launchOptions { if let launchOptions = launchOptions {
log.debug("Launch options: \(launchOptions)") log.debug("Launch options: \(launchOptions)")
......
...@@ -51,7 +51,7 @@ class CCPAHelper { ...@@ -51,7 +51,7 @@ class CCPAHelper {
locationPermissionsUndeterminedOnLaunch && !hadLocationsOnLaunch locationPermissionsUndeterminedOnLaunch && !hadLocationsOnLaunch
} }
@UserDefaultsOptionalValue("CCPAHelper.canCollectData") @UserDefaultsOptionalValue("CCPAHelper.canCollectData", userDefaults: UserDefaults.appDefaults)
public var canCollectData: Bool? public var canCollectData: Bool?
private var locationPermissionsUndeterminedOnLaunch: Bool = false private var locationPermissionsUndeterminedOnLaunch: Bool = false
...@@ -70,7 +70,7 @@ class CCPAHelper { ...@@ -70,7 +70,7 @@ class CCPAHelper {
private static let statusUpdateDelayAfterRegistration: TimeInterval = 5 private static let statusUpdateDelayAfterRegistration: TimeInterval = 5
private static let defaultMinimumTimeSinceLastSuccessfulUpdate: TimeInterval = 3600 * 24 * 7 // a week private static let defaultMinimumTimeSinceLastSuccessfulUpdate: TimeInterval = 3600 * 24 * 7 // a week
@UserDefaultsValue("CCPAHelper.shownPrivacyNoticeBefore", defaultValue: false) @UserDefaultsValue("CCPAHelper.shownPrivacyNoticeBefore", defaultValue: false, userDefaults: UserDefaults.appDefaults)
public var shownPrivacyNoticeBefore: Bool { public var shownPrivacyNoticeBefore: Bool {
didSet { didSet {
if shownPrivacyNoticeBefore { if shownPrivacyNoticeBefore {
...@@ -79,7 +79,7 @@ class CCPAHelper { ...@@ -79,7 +79,7 @@ class CCPAHelper {
} }
} }
@UserDefaultsValue("CCPAHelper.policyHasBeenUpdated", defaultValue: false) @UserDefaultsValue("CCPAHelper.policyHasBeenUpdated", defaultValue: false, userDefaults: UserDefaults.appDefaults)
public private(set) var policyHasBeenUpdated: Bool { public private(set) var policyHasBeenUpdated: Bool {
didSet { didSet {
if policyHasBeenUpdated { if policyHasBeenUpdated {
...@@ -88,18 +88,18 @@ class CCPAHelper { ...@@ -88,18 +88,18 @@ class CCPAHelper {
} }
} }
@UserDefaultsOptionalValue("CCPAHelper.lastSeenPrivacyPolicyVersion") @UserDefaultsOptionalValue("CCPAHelper.lastSeenPrivacyPolicyVersion", userDefaults: UserDefaults.appDefaults)
public var lastSeenPrivacyPolicyVersion: Int? public var lastSeenPrivacyPolicyVersion: Int?
private let log = Logger(componentName: "CCPAHelper") private let log = Logger(componentName: "CCPAHelper")
@UserDefaultsValue("CCPAHelper.isRegistered", defaultValue: false) @UserDefaultsValue("CCPAHelper.isRegistered", defaultValue: false, userDefaults: UserDefaults.appDefaults)
private var isRegistered: Bool private var isRegistered: Bool
@UserDefaultsOptionalValue("CCPAHelper.privacyString") @UserDefaultsOptionalValue("CCPAHelper.privacyString", userDefaults: UserDefaults.appDefaults)
private var privacyString: String? private var privacyString: String?
@UserDefaultsOptionalValue("CCPAHelper.lastUpdateCallData") @UserDefaultsOptionalValue("CCPAHelper.lastUpdateCallData", userDefaults: UserDefaults.appDefaults)
private var lastSuccessfullUpdateDate: Date? private var lastSuccessfullUpdateDate: Date?
private var minimumTimeSinceLastSuccessfulUpdate: TimeInterval { private var minimumTimeSinceLastSuccessfulUpdate: TimeInterval {
......
...@@ -77,6 +77,7 @@ ...@@ -77,6 +77,7 @@
CDFE458D26566BD50021A29F /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDFE458C26566BD50021A29F /* Storage.swift */; }; CDFE458D26566BD50021A29F /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDFE458C26566BD50021A29F /* Storage.swift */; };
CDFE459426566D7B0021A29F /* HealthSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDFE459326566D7B0021A29F /* HealthSource.swift */; }; CDFE459426566D7B0021A29F /* HealthSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDFE459326566D7B0021A29F /* HealthSource.swift */; };
CDFE459626566D860021A29F /* FIPSSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDFE459526566D860021A29F /* FIPSSource.swift */; }; CDFE459626566D860021A29F /* FIPSSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDFE459526566D860021A29F /* FIPSSource.swift */; };
CE3A112726CD3CDE00D925C7 /* UserDefaults+OneWeather.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3A112626CD3CDE00D925C7 /* UserDefaults+OneWeather.swift */; };
CEFE851826948C15003C67D3 /* SmartTextProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFE851726948C15003C67D3 /* SmartTextProvider.swift */; }; CEFE851826948C15003C67D3 /* SmartTextProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFE851726948C15003C67D3 /* SmartTextProvider.swift */; };
CEFE851C2694986D003C67D3 /* SmartText.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFE851B2694986D003C67D3 /* SmartText.swift */; }; CEFE851C2694986D003C67D3 /* SmartText.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFE851B2694986D003C67D3 /* SmartText.swift */; };
CEFE85202694C4BC003C67D3 /* DefaultSmartText.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFE851F2694C4BC003C67D3 /* DefaultSmartText.swift */; }; CEFE85202694C4BC003C67D3 /* DefaultSmartText.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFE851F2694C4BC003C67D3 /* DefaultSmartText.swift */; };
...@@ -176,6 +177,7 @@ ...@@ -176,6 +177,7 @@
CDFE458C26566BD50021A29F /* Storage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = "<group>"; }; CDFE458C26566BD50021A29F /* Storage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Storage.swift; sourceTree = "<group>"; };
CDFE459326566D7B0021A29F /* HealthSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HealthSource.swift; sourceTree = "<group>"; }; CDFE459326566D7B0021A29F /* HealthSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HealthSource.swift; sourceTree = "<group>"; };
CDFE459526566D860021A29F /* FIPSSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FIPSSource.swift; sourceTree = "<group>"; }; CDFE459526566D860021A29F /* FIPSSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FIPSSource.swift; sourceTree = "<group>"; };
CE3A112626CD3CDE00D925C7 /* UserDefaults+OneWeather.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+OneWeather.swift"; sourceTree = "<group>"; };
CEFE851726948C15003C67D3 /* SmartTextProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartTextProvider.swift; sourceTree = "<group>"; }; CEFE851726948C15003C67D3 /* SmartTextProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartTextProvider.swift; sourceTree = "<group>"; };
CEFE851B2694986D003C67D3 /* SmartText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartText.swift; sourceTree = "<group>"; }; CEFE851B2694986D003C67D3 /* SmartText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartText.swift; sourceTree = "<group>"; };
CEFE851D2694C477003C67D3 /* SmartTextMacro.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartTextMacro.swift; sourceTree = "<group>"; }; CEFE851D2694C477003C67D3 /* SmartTextMacro.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartTextMacro.swift; sourceTree = "<group>"; };
...@@ -378,6 +380,7 @@ ...@@ -378,6 +380,7 @@
CD615FB22655293100B717DB /* CLAuthorizationStatus+Localized.swift */, CD615FB22655293100B717DB /* CLAuthorizationStatus+Localized.swift */,
CD615FB32655293100B717DB /* UIApplication+Settings.swift */, CD615FB32655293100B717DB /* UIApplication+Settings.swift */,
CD71B9C5265E629D00803DBB /* String+NewLine.swift */, CD71B9C5265E629D00803DBB /* String+NewLine.swift */,
CE3A112626CD3CDE00D925C7 /* UserDefaults+OneWeather.swift */,
); );
path = Extensions; path = Extensions;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -673,6 +676,7 @@ ...@@ -673,6 +676,7 @@
CD427D19266F5DCE00B4350A /* ShortsSource.swift in Sources */, CD427D19266F5DCE00B4350A /* ShortsSource.swift in Sources */,
CD2D55D8265533F4007B70F4 /* UserDefaultsWrapper.swift in Sources */, CD2D55D8265533F4007B70F4 /* UserDefaultsWrapper.swift in Sources */,
CDD2F8F62665117400B48322 /* NWSAlertsManager.swift in Sources */, CDD2F8F62665117400B48322 /* NWSAlertsManager.swift in Sources */,
CE3A112726CD3CDE00D925C7 /* UserDefaults+OneWeather.swift in Sources */,
CD11AFE726651BF900EC4BA0 /* LegacyWdtLocation.swift in Sources */, CD11AFE726651BF900EC4BA0 /* LegacyWdtLocation.swift in Sources */,
CD11AFE326651B6300EC4BA0 /* LegacyMigrationManager.swift in Sources */, CD11AFE326651B6300EC4BA0 /* LegacyMigrationManager.swift in Sources */,
CD2D55DD2655377F007B70F4 /* NWSAlertExtendedInfo.swift in Sources */, CD2D55DD2655377F007B70F4 /* NWSAlertExtendedInfo.swift in Sources */,
......
//
// UserDefaults+OneWeather.swift
// OneWeatherCore
//
// Created by Demid Merzlyakov on 18.08.2021.
//
import Foundation
import OneWeatherAnalytics
extension UserDefaults {
private static let appGroup = "group.com.onelouder.oneweather"
public static var appDefaults: UserDefaults {
if let appGroupDefaults = UserDefaults(suiteName: UserDefaults.appGroup) {
return appGroupDefaults
}
// At least it won't crash, but hopefully we'll never end up here.
assertionFailure("Failed to create a shared user defaults.")
return UserDefaults.standard
}
public static func migrateUserDefaultsToAppGroupsIfNeeded() {
// User Defaults - Old
let userDefaults = UserDefaults.standard
// App Groups Default - New
let groupDefaults = UserDefaults.appDefaults
// Key to track if we migrated
let didMigrateToAppGroups = "DidMigrateToAppGroup_\(UserDefaults.appGroup)"
let log = Logger(componentName: "UserDefaults")
if !groupDefaults.bool(forKey: didMigrateToAppGroups) {
for key in userDefaults.dictionaryRepresentation().keys {
groupDefaults.set(userDefaults.dictionaryRepresentation()[key], forKey: key)
}
groupDefaults.set(true, forKey: didMigrateToAppGroups)
groupDefaults.synchronize()
log.info("Successfully migrated defaults")
} else {
log.info("No need to migrate defaults")
}
}
}
...@@ -34,7 +34,7 @@ public class Settings { ...@@ -34,7 +34,7 @@ public class Settings {
public let delegate = MulticastDelegate<SettingsDelegate>() public let delegate = MulticastDelegate<SettingsDelegate>()
private init() {} private init() {}
@UserDefaultsBasicValue(key: "app_theme") @UserDefaultsBasicValue(key: "app_theme", userDefaults: UserDefaults.appDefaults)
private var _appTheme = AppTheme.system.rawValue private var _appTheme = AppTheme.system.rawValue
public var appTheme:AppTheme { public var appTheme:AppTheme {
...@@ -61,44 +61,44 @@ public class Settings { ...@@ -61,44 +61,44 @@ public class Settings {
} }
} }
@UserDefaultsUnitValue(key: "temperature_type") @UserDefaultsUnitValue(key: "temperature_type", userDefaults: UserDefaults.appDefaults)
public var temperatureType = DefaultSettingsFactory().getSettings().temperatureType public var temperatureType = DefaultSettingsFactory().getSettings().temperatureType
@UserDefaultsUnitValue(key: "wind_speed_type") @UserDefaultsUnitValue(key: "wind_speed_type", userDefaults: UserDefaults.appDefaults)
public var windSpeedType = DefaultSettingsFactory().getSettings().windSpeedType public var windSpeedType = DefaultSettingsFactory().getSettings().windSpeedType
@UserDefaultsUnitValue(key: "pressure_type") @UserDefaultsUnitValue(key: "pressure_type", userDefaults: UserDefaults.appDefaults)
public var pressureType = DefaultSettingsFactory().getSettings().pressureType public var pressureType = DefaultSettingsFactory().getSettings().pressureType
@UserDefaultsUnitValue(key: "distance_type") @UserDefaultsUnitValue(key: "distance_type", userDefaults: UserDefaults.appDefaults)
public var distanceType = DefaultSettingsFactory().getSettings().distanceType public var distanceType = DefaultSettingsFactory().getSettings().distanceType
public var locale:Locale { public var locale:Locale {
return Locale(identifier: Localize.currentLanguage()) return Locale(identifier: Localize.currentLanguage())
} }
@UserDefaultsBasicValue(key: "pinnedLayers") @UserDefaultsBasicValue(key: "pinnedLayers", userDefaults: UserDefaults.appDefaults)
public var pinnedLayerIds: [String] = DefaultSettingsFactory().getSettings().pinnedLayerIds public var pinnedLayerIds: [String] = DefaultSettingsFactory().getSettings().pinnedLayerIds
@UserDefaultsBasicValue(key: "selectedLayer") @UserDefaultsBasicValue(key: "selectedLayer", userDefaults: UserDefaults.appDefaults)
public var selectedLayerId: String = DefaultSettingsFactory().getSettings().selectedLayerId public var selectedLayerId: String = DefaultSettingsFactory().getSettings().selectedLayerId
@UserDefaultsOptionalValue("userQualifiedDate") @UserDefaultsOptionalValue("userQualifiedDate", userDefaults: UserDefaults.appDefaults)
public var userQualifiedDate: Date? public var userQualifiedDate: Date?
@UserDefaultsOptionalValue("firstOpenDate") @UserDefaultsOptionalValue("firstOpenDate", userDefaults: UserDefaults.appDefaults)
public var firstOpenDate: Date? public var firstOpenDate: Date?
@UserDefaultsOptionalValue("d3RetentionDate") @UserDefaultsOptionalValue("d3RetentionDate", userDefaults: UserDefaults.appDefaults)
public var d3RetentionDate: Date? public var d3RetentionDate: Date?
@UserDefaultsBasicValue(key: "locationDidAdded") @UserDefaultsBasicValue(key: "locationDidAdded", userDefaults: UserDefaults.appDefaults)
public var locationDidAdded: Bool = false public var locationDidAdded: Bool = false
@UserDefaultsOptionalValue("widgetPromotionTriggerCount") @UserDefaultsOptionalValue("widgetPromotionTriggerCount", userDefaults: UserDefaults.appDefaults)
public var widgetPromotionTriggerCount: Int? public var widgetPromotionTriggerCount: Int?
@UserDefaultsBasicValue(key: "shorts_showed_swipeUp_count") @UserDefaultsBasicValue(key: "shorts_showed_swipeUp_count", userDefaults: UserDefaults.appDefaults)
public var shortsSwipeUpNudgeShowedCount = 0 public var shortsSwipeUpNudgeShowedCount = 0
#warning("Not implemented!") #warning("Not implemented!")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment