diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..13847b5b5 --- /dev/null +++ b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,31 @@ +{ + "images" : [ + { "filename" : "icon-20@1x.png", "idiom" : "ipad", "scale" : "1x", "size" : "20x20" }, + { "filename" : "icon-20@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "20x20" }, + { "filename" : "icon-20@2x.png", "idiom" : "iphone","scale" : "2x", "size" : "20x20" }, + { "filename" : "icon-20@3x.png", "idiom" : "iphone","scale" : "3x", "size" : "20x20" }, + + { "filename" : "icon-29@1x.png", "idiom" : "ipad", "scale" : "1x", "size" : "29x29" }, + { "filename" : "icon-29@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "29x29" }, + { "filename" : "icon-29@2x.png", "idiom" : "iphone","scale" : "2x", "size" : "29x29" }, + { "filename" : "icon-29@3x.png", "idiom" : "iphone","scale" : "3x", "size" : "29x29" }, + + { "filename" : "icon-40@1x.png", "idiom" : "ipad", "scale" : "1x", "size" : "40x40" }, + { "filename" : "icon-40@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "40x40" }, + { "filename" : "icon-40@2x.png", "idiom" : "iphone","scale" : "2x", "size" : "40x40" }, + { "filename" : "icon-40@3x.png", "idiom" : "iphone","scale" : "3x", "size" : "40x40" }, + + { "filename" : "icon-60@2x.png", "idiom" : "iphone","scale" : "2x", "size" : "60x60" }, + { "filename" : "icon-60@3x.png", "idiom" : "iphone","scale" : "3x", "size" : "60x60" }, + + { "filename" : "icon-76@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "76x76" }, + + { "filename" : "icon-83.5@2x.png", "idiom" : "ipad", "scale" : "2x", "size" : "83.5x83.5" }, + + { "filename" : "icon-1024.png", "idiom" : "ios-marketing", "scale" : "1x", "size" : "1024x1024" } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 000000000..a154564f9 Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-1024.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-20@1x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-20@1x.png new file mode 100644 index 000000000..b1a2c00ee Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-20@1x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png new file mode 100644 index 000000000..686f8aa85 Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png new file mode 100644 index 000000000..f2a017403 Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-29@1x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-29@1x.png new file mode 100644 index 000000000..9c9ed610d Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-29@1x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png new file mode 100644 index 000000000..db36d201b Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png new file mode 100644 index 000000000..504cc656e Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-40@1x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-40@1x.png new file mode 100644 index 000000000..686f8aa85 Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-40@1x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png new file mode 100644 index 000000000..ef63e555b Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png new file mode 100644 index 000000000..8d3745691 Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png new file mode 100644 index 000000000..8d3745691 Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png new file mode 100644 index 000000000..af26b4c57 Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png new file mode 100644 index 000000000..b1395c6d1 Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png new file mode 100644 index 000000000..cdf970b6c Binary files /dev/null and b/apps/ios/Sources/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png differ diff --git a/apps/ios/Sources/Assets.xcassets/Contents.json b/apps/ios/Sources/Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/apps/ios/Sources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/ios/Sources/Voice/VoiceWakeManager.swift b/apps/ios/Sources/Voice/VoiceWakeManager.swift index 2b46c5490..ed3966396 100644 --- a/apps/ios/Sources/Voice/VoiceWakeManager.swift +++ b/apps/ios/Sources/Voice/VoiceWakeManager.swift @@ -91,34 +91,36 @@ final class VoiceWakeManager: NSObject, ObservableObject { private var lastDispatched: String? private var onCommand: (@Sendable (String) async -> Void)? + private nonisolated(unsafe) var userDefaultsObserver: NSObjectProtocol? override init() { super.init() self.triggerWords = VoiceWakePreferences.loadTriggerWords() - NotificationCenter.default.addObserver( - self, - selector: #selector(self.handleUserDefaultsDidChange), - name: UserDefaults.didChangeNotification, - object: UserDefaults.standard) + self.userDefaultsObserver = NotificationCenter.default.addObserver( + forName: UserDefaults.didChangeNotification, + object: UserDefaults.standard, + queue: .main, + using: { [weak self] _ in + Task { @MainActor in + self?.handleUserDefaultsDidChange() + } + }) } deinit { - NotificationCenter.default.removeObserver( - self, - name: UserDefaults.didChangeNotification, - object: UserDefaults.standard) + if let userDefaultsObserver = self.userDefaultsObserver { + NotificationCenter.default.removeObserver(userDefaultsObserver) + } } var activeTriggerWords: [String] { VoiceWakePreferences.sanitizeTriggerWords(self.triggerWords) } - @objc private func handleUserDefaultsDidChange() { + private func handleUserDefaultsDidChange() { let updated = VoiceWakePreferences.loadTriggerWords() - Task { @MainActor in - if updated != self.triggerWords { - self.triggerWords = updated - } + if updated != self.triggerWords { + self.triggerWords = updated } } diff --git a/apps/ios/project.yml b/apps/ios/project.yml index 8281aac17..15e3f1d9e 100644 --- a/apps/ios/project.yml +++ b/apps/ios/project.yml @@ -15,6 +15,10 @@ targets: platform: iOS sources: - path: Sources + excludes: + - Assets.xcassets + resources: + - path: Sources/Assets.xcassets dependencies: - package: ClawdisKit - package: ClawdisKit