Skip to content

Commit d926a9f

Browse files
Merge pull request #197 from writefreely/move-defaults-to-app-group
Move user defaults to App Group
2 parents 6693a83 + 7db1117 commit d926a9f

File tree

11 files changed

+90
-18
lines changed

11 files changed

+90
-18
lines changed

Shared/Account/AccountModel.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ extension AccountError: LocalizedError {
5454
}
5555

5656
struct AccountModel {
57-
@AppStorage("isLoggedIn") var isLoggedIn: Bool = false
58-
private let defaults = UserDefaults.standard
57+
@AppStorage(WFDefaults.isLoggedIn, store: UserDefaults.shared) var isLoggedIn: Bool = false
58+
private let defaults = UserDefaults.shared
5959
let usernameStringKey = "usernameStringKey"
6060
let serverStringKey = "serverStringKey"
6161

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import Foundation
2+
3+
enum WFDefaults {
4+
static let isLoggedIn = "isLoggedIn"
5+
static let showAllPostsFlag = "showAllPostsFlag"
6+
static let selectedCollectionURL = "selectedCollectionURL"
7+
static let lastDraftURL = "lastDraftURL"
8+
#if os(macOS)
9+
static let automaticallyChecksForUpdates = "automaticallyChecksForUpdates"
10+
static let subscribeToBetaUpdates = "subscribeToBetaUpdates"
11+
#endif
12+
}
13+
14+
extension UserDefaults {
15+
16+
private enum DefaultsError: Error {
17+
case couldNotMigrateStandardDefaults
18+
19+
var description: String {
20+
switch self {
21+
case .couldNotMigrateStandardDefaults:
22+
return "Could not migrate user defaults to group container."
23+
}
24+
}
25+
}
26+
27+
private static let appGroupName: String = "group.com.abunchtell.writefreely"
28+
private static let didMigrateDefaultsToAppGroup: String = "didMigrateDefaultsToAppGroup"
29+
private static let didRemoveStandardDefaults: String = "didRemoveStandardDefaults"
30+
31+
static var shared: UserDefaults {
32+
if let groupDefaults = UserDefaults(suiteName: UserDefaults.appGroupName),
33+
groupDefaults.bool(forKey: UserDefaults.didMigrateDefaultsToAppGroup) {
34+
return groupDefaults
35+
} else {
36+
do {
37+
let groupDefaults = try UserDefaults.standard.migrateDefaultsToAppGroup()
38+
return groupDefaults
39+
} catch {
40+
return UserDefaults.standard
41+
}
42+
}
43+
}
44+
45+
private func migrateDefaultsToAppGroup() throws -> UserDefaults {
46+
let userDefaults = UserDefaults.standard
47+
let groupDefaults = UserDefaults(suiteName: UserDefaults.appGroupName)
48+
49+
if let groupDefaults = groupDefaults {
50+
if groupDefaults.bool(forKey: UserDefaults.didMigrateDefaultsToAppGroup) {
51+
return groupDefaults
52+
}
53+
54+
for (key, value) in userDefaults.dictionaryRepresentation() {
55+
groupDefaults.set(value, forKey: key)
56+
}
57+
groupDefaults.set(true, forKey: UserDefaults.didMigrateDefaultsToAppGroup)
58+
return groupDefaults
59+
} else {
60+
throw DefaultsError.couldNotMigrateStandardDefaults
61+
}
62+
}
63+
64+
}

Shared/Models/WriteFreelyModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ final class WriteFreelyModel: ObservableObject {
3636
// swiftlint:enable line_length
3737

3838
internal var client: WFClient?
39-
private let defaults = UserDefaults.standard
39+
private let defaults = UserDefaults.shared
4040
private let monitor = NWPathMonitor()
4141
private let queue = DispatchQueue(label: "NetworkMonitor")
4242
internal var postToUpdate: WFAPost?

Shared/PostEditor/PostEditorModel.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ enum PostAppearance: String {
88
}
99

1010
struct PostEditorModel {
11-
@AppStorage("showAllPostsFlag") var showAllPostsFlag: Bool = false
12-
@AppStorage("selectedCollectionURL") var selectedCollectionURL: URL?
13-
@AppStorage("lastDraftURL") var lastDraftURL: URL?
11+
@AppStorage(WFDefaults.showAllPostsFlag, store: UserDefaults.shared) var showAllPostsFlag: Bool = false
12+
@AppStorage(WFDefaults.selectedCollectionURL, store: UserDefaults.shared) var selectedCollectionURL: URL?
13+
@AppStorage(WFDefaults.lastDraftURL, store: UserDefaults.shared) var lastDraftURL: URL?
1414

1515
func saveLastDraft(_ post: WFAPost) {
1616
self.lastDraftURL = post.status != PostStatus.published.rawValue ? post.objectID.uriRepresentation() : nil

Shared/Preferences/PreferencesModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import SwiftUI
22

33
class PreferencesModel: ObservableObject {
4-
private let defaults = UserDefaults.standard
4+
private let defaults = UserDefaults.shared
55
let colorSchemeIntegerKey = "colorSchemeIntegerKey"
66
let defaultFontIntegerKey = "defaultFontIntegerKey"
77

Shared/WriteFreely_MultiPlatformApp.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ struct CheckForDebugModifier {
1010
#if os(macOS)
1111
if NSEvent.modifierFlags.contains(.shift) {
1212
// Clear the launch-to-last-draft values to load a new draft.
13-
UserDefaults.standard.setValue(false, forKey: "showAllPostsFlag")
14-
UserDefaults.standard.setValue(nil, forKey: "selectedCollectionURL")
15-
UserDefaults.standard.setValue(nil, forKey: "lastDraftURL")
13+
UserDefaults.shared.setValue(false, forKey: WFDefaults.showAllPostsFlag)
14+
UserDefaults.shared.setValue(nil, forKey: WFDefaults.selectedCollectionURL)
15+
UserDefaults.shared.setValue(nil, forKey: WFDefaults.lastDraftURL)
1616
} else {
1717
// No-op
1818
}

WriteFreely-MultiPlatform.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
1714DD6B260BAC2C000C0DFF /* WriteFreely in Frameworks */ = {isa = PBXBuildFile; productRef = 1714DD6A260BAC2C000C0DFF /* WriteFreely */; };
2525
171BFDFA24D4AF8300888236 /* CollectionListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BFDF924D4AF8300888236 /* CollectionListView.swift */; };
2626
171BFDFB24D4AF8300888236 /* CollectionListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BFDF924D4AF8300888236 /* CollectionListView.swift */; };
27+
171DC677272C7D0B002B9B8A /* UserDefaults+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171DC676272C7D0B002B9B8A /* UserDefaults+Extensions.swift */; };
28+
171DC678272C7D0B002B9B8A /* UserDefaults+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171DC676272C7D0B002B9B8A /* UserDefaults+Extensions.swift */; };
2729
172C492E2593981900E20ADF /* MacUpdatesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 172C492D2593981900E20ADF /* MacUpdatesView.swift */; };
2830
173E19D1254318F600440F0F /* RemoteChangePromptView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 173E19D0254318F600440F0F /* RemoteChangePromptView.swift */; };
2931
173E19E3254329CC00440F0F /* PostTextEditingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 173E19E2254329CC00440F0F /* PostTextEditingView.swift */; };
@@ -135,6 +137,7 @@
135137
17120DAB24E1B99F002B9F6C /* AccountLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountLoginView.swift; sourceTree = "<group>"; };
136138
17120DB124E1E19C002B9F6C /* SettingsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsHeaderView.swift; sourceTree = "<group>"; };
137139
171BFDF924D4AF8300888236 /* CollectionListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionListView.swift; sourceTree = "<group>"; };
140+
171DC676272C7D0B002B9B8A /* UserDefaults+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+Extensions.swift"; sourceTree = "<group>"; };
138141
172C492D2593981900E20ADF /* MacUpdatesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacUpdatesView.swift; sourceTree = "<group>"; };
139142
173E19D0254318F600440F0F /* RemoteChangePromptView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteChangePromptView.swift; sourceTree = "<group>"; };
140143
173E19E2254329CC00440F0F /* PostTextEditingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostTextEditingView.swift; sourceTree = "<group>"; };
@@ -277,6 +280,7 @@
277280
17B37C5525C8679800FE75E9 /* WriteFreelyModel+API.swift */,
278281
17B37C5C25C8698900FE75E9 /* WriteFreelyModel+APIHandlers.swift */,
279282
17B37C4A25C8661300FE75E9 /* WriteFreelyModel+Keychain.swift */,
283+
171DC676272C7D0B002B9B8A /* UserDefaults+Extensions.swift */,
280284
);
281285
path = Extensions;
282286
sourceTree = "<group>";
@@ -757,6 +761,7 @@
757761
171BFDFA24D4AF8300888236 /* CollectionListView.swift in Sources */,
758762
1756DBB324FECDBB00207AB8 /* PostEditorStatusToolbarView.swift in Sources */,
759763
17120DB224E1E19C002B9F6C /* SettingsHeaderView.swift in Sources */,
764+
171DC677272C7D0B002B9B8A /* UserDefaults+Extensions.swift in Sources */,
760765
1756DBB724FED3A400207AB8 /* LocalStorageModel.xcdatamodeld in Sources */,
761766
17B996DA2502D23E0017B536 /* WFAPost+CoreDataProperties.swift in Sources */,
762767
1756AE7724CB2EDD00FD7257 /* PostEditorView.swift in Sources */,
@@ -785,6 +790,7 @@
785790
isa = PBXSourcesBuildPhase;
786791
buildActionMask = 2147483647;
787792
files = (
793+
171DC678272C7D0B002B9B8A /* UserDefaults+Extensions.swift in Sources */,
788794
17DF32AD24C87D3500BCE2E3 /* ContentView.swift in Sources */,
789795
1756DBBB24FED45500207AB8 /* LocalStorageManager.swift in Sources */,
790796
17A4FEED25927E730037E96B /* AppDelegate.swift in Sources */,

WriteFreely-MultiPlatform.xcodeproj/xcuserdata/angelo.xcuserdatad/xcschemes/xcschememanagement.plist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
<key>WriteFreely-MultiPlatform (iOS).xcscheme_^#shared#^_</key>
88
<dict>
99
<key>orderHint</key>
10-
<integer>0</integer>
10+
<integer>1</integer>
1111
</dict>
1212
<key>WriteFreely-MultiPlatform (macOS).xcscheme_^#shared#^_</key>
1313
<dict>
1414
<key>orderHint</key>
15-
<integer>1</integer>
15+
<integer>0</integer>
1616
</dict>
1717
</dict>
1818
</dict>

macOS/AppDelegate.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ class AppDelegate: NSObject, NSApplicationDelegate {
66
func applicationWillFinishLaunching(_ notification: Notification) {
77
// Check UserDefaults for values; if the key doesn't exist (e.g., if MacUpdatesView hasn't ever been shown),
88
// bool(forKey:) returns false, so set SUUpdater.shared() appropriately.
9-
let automaticallyChecksForUpdates = UserDefaults.standard.bool(forKey: "automaticallyChecksForUpdates")
10-
let subscribeToBetaUpdates = UserDefaults.standard.bool(forKey: "subscribeToBetaUpdates")
9+
let automaticallyChecksForUpdates = UserDefaults.shared.bool(forKey: WFDefaults.automaticallyChecksForUpdates)
10+
let subscribeToBetaUpdates = UserDefaults.shared.bool(forKey: WFDefaults.subscribeToBetaUpdates)
1111

1212
// Set Sparkle properties.
1313
SUUpdater.shared()?.automaticallyChecksForUpdates = automaticallyChecksForUpdates

macOS/PostEditor/PostEditorView.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ struct PostEditorView: View {
6161

6262
struct PostEditorView_EmptyPostPreviews: PreviewProvider {
6363
static var previews: some View {
64-
let context = LocalStorageManager.standard.persistentContainer.viewContext
64+
let context = LocalStorageManager.standard.container.viewContext
6565
let testPost = WFAPost(context: context)
6666
testPost.createdDate = Date()
6767
testPost.appearance = "norm"
@@ -76,7 +76,7 @@ struct PostEditorView_EmptyPostPreviews: PreviewProvider {
7676

7777
struct PostEditorView_ExistingPostPreviews: PreviewProvider {
7878
static var previews: some View {
79-
let context = LocalStorageManager.standard.persistentContainer.viewContext
79+
let context = LocalStorageManager.standard.container.viewContext
8080
let testPost = WFAPost(context: context)
8181
testPost.title = "Test Post Title"
8282
testPost.body = "Here's some cool sample body text."

0 commit comments

Comments
 (0)