diff --git a/LaunchNext.xcodeproj/project.pbxproj b/LaunchNext.xcodeproj/project.pbxproj index 10a3dd8..30c50e1 100644 --- a/LaunchNext.xcodeproj/project.pbxproj +++ b/LaunchNext.xcodeproj/project.pbxproj @@ -269,7 +269,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 26.0; + MACOSX_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -330,7 +330,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 26.0; + MACOSX_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; diff --git a/LaunchNext/Extensions.swift b/LaunchNext/Extensions.swift index ba8d850..6f55791 100644 --- a/LaunchNext/Extensions.swift +++ b/LaunchNext/Extensions.swift @@ -15,23 +15,59 @@ extension Font { } } +// MARK: - Glass Effect Style + +enum LiquidGlassStyle { + case regular + case clear + case identity +} + // MARK: - View Extensions for Glass Effect extension View { @ViewBuilder - func liquidGlass(in shape: S, isEnabled: Bool = true) -> some View { - if #available(macOS 26.0, iOS 18.0, *) { - self.glassEffect(.regular, in: shape) + func liquidGlass(_ style: LiquidGlassStyle = .regular, in shape: S, isEnabled: Bool = true) -> some View { + if #available(macOS 26.0, iOS 26.0, *) { + switch style { + case .regular: + self.glassEffect(.regular, in: shape) + case .clear: + self.glassEffect(.clear, in: shape) + case .identity: + self.glassEffect(.identity, in: shape) + } } else { - self.background(.ultraThinMaterial, in: shape) + switch style { + case .regular: + self.background(.regularMaterial, in: shape) + case .clear: + self.background(.ultraThinMaterial, in: shape) + case .identity: + self + } } } @ViewBuilder - func liquidGlass(isEnabled: Bool = true) -> some View { - if #available(macOS 26.0, iOS 18.0, *) { - self.glassEffect(.regular) + func liquidGlass(_ style: LiquidGlassStyle = .regular, isEnabled: Bool = true) -> some View { + if #available(macOS 26.0, iOS 26.0, *) { + switch style { + case .regular: + self.glassEffect(.regular) + case .clear: + self.glassEffect(.clear) + case .identity: + self.glassEffect(.identity) + } } else { - self.background(.ultraThinMaterial) + switch style { + case .regular: + self.background(.regularMaterial) + case .clear: + self.background(.ultraThinMaterial) + case .identity: + self + } } } } diff --git a/LaunchNext/SettingsView.swift b/LaunchNext/SettingsView.swift index 7ef6e54..5d1dc3b 100644 --- a/LaunchNext/SettingsView.swift +++ b/LaunchNext/SettingsView.swift @@ -199,6 +199,7 @@ struct SettingsView: View { .background(.ultraThinMaterial) Button { + appStore.stopAccessibilityPolling() appStore.isSetting = false } label: { Image(systemName: "xmark") @@ -499,7 +500,7 @@ private enum SettingsSection: String, CaseIterable, Identifiable { ScrollView(showsIndicators: false) { scrollContent(for: section) } - .scrollDisabled(section == .about || section == .general) + .scrollDisabled(section == .about) .frame(maxWidth: .infinity, maxHeight: .infinity) .scrollBounceBehavior(.basedOnSize) } @@ -2207,7 +2208,7 @@ private enum SettingsSection: String, CaseIterable, Identifiable { .padding(.vertical, 10) label - .glassEffect(.clear, in: Capsule()) + .liquidGlass(.clear, in: Capsule()) .clipShape(Capsule()) .shadow(color: Color.black.opacity(shadowOpacity), radius: shadowRadius, x: 0, y: shadowOffsetY) .scaleEffect(scale) @@ -2360,7 +2361,7 @@ private enum SettingsSection: String, CaseIterable, Identifiable { .frame(maxWidth: .infinity) } .buttonStyle(.plain) - .glassEffect(.regular, in: RoundedRectangle(cornerRadius: 20, style: .continuous)) + .liquidGlass(in: RoundedRectangle(cornerRadius: 20, style: .continuous)) } // MARK: - Inline Games @@ -2753,6 +2754,72 @@ private enum SettingsSection: String, CaseIterable, Identifiable { .frame(maxWidth: .infinity, alignment: .leading) } + Divider() + + HStack(alignment: .center, spacing: 24) { + VStack(alignment: .leading, spacing: 4) { + HStack { + Text(appStore.localized(.kioskModeTitle)) + .font(.subheadline.weight(.semibold)) + Spacer() + Toggle("", isOn: $appStore.kioskMode) + .labelsHidden() + .toggleStyle(.switch) + } + Text(appStore.localized(.kioskModeDescription)) + .font(.footnote) + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + + VStack(alignment: .leading, spacing: 4) { + HStack { + Text(appStore.localized(.autoFullscreenTitle)) + .font(.subheadline.weight(.semibold)) + Spacer() + Toggle("", isOn: $appStore.autoFullscreen) + .labelsHidden() + .toggleStyle(.switch) + .onAppear { + appStore.startAccessibilityPolling() + } + .onDisappear { + appStore.stopAccessibilityPolling() + } + .onChange(of: appStore.autoFullscreen) { newValue in + if newValue && !appStore.isAccessibilityTrusted() { + appStore.autoFullscreen = false + appStore.promptAccessibilityPermission() + } + } + } + Text(appStore.localized(.autoFullscreenDescription)) + .font(.footnote) + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + Divider() + + HStack(alignment: .center, spacing: 24) { + VStack(alignment: .leading, spacing: 4) { + HStack { + Text(appStore.localized(.showInDockTitle)) + .font(.subheadline.weight(.semibold)) + Spacer() + Toggle("", isOn: $appStore.showInDock) + .labelsHidden() + .toggleStyle(.switch) + } + Text(appStore.localized(.showInDockDescription)) + .font(.footnote) + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity, alignment: .leading) + + Spacer().frame(maxWidth: .infinity) + } } .padding(12) .frame(maxWidth: .infinity, alignment: .leading) @@ -3661,6 +3728,32 @@ private enum SettingsSection: String, CaseIterable, Identifiable { .pickerStyle(.segmented) .labelsHidden() } + + if #available(macOS 26.0, iOS 26.0, *) { + let useGlass = appStore.launchpadBackgroundStyle == .glass + let shape = RoundedRectangle(cornerRadius: 14, style: .continuous) + + ZStack { + Image("AboutBackground") + .resizable() + .interpolation(.high) + .aspectRatio(contentMode: .fill) + + HStack(spacing: 16) { + glassPreviewCard(label: "Regular", icon: "app.fill", style: .regular, useGlass: useGlass, shape: shape) + glassPreviewCard(label: "Clear", icon: "app.fill", style: .clear, useGlass: useGlass, shape: shape) + glassPreviewCard(label: "Identity", icon: "app.fill", style: .identity, useGlass: useGlass, shape: shape) + } + .padding(20) + } + .frame(height: 140) + .clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: 16, style: .continuous) + .stroke(Color.white.opacity(0.18), lineWidth: 1.4) + ) + .allowsHitTesting(false) + } } } @@ -4017,6 +4110,39 @@ private enum SettingsSection: String, CaseIterable, Identifiable { .padding(.bottom, 20) } + @ViewBuilder + private func glassPreviewCard(label: String, icon: String, style: LiquidGlassStyle, useGlass: Bool, shape: some Shape) -> some View { + let content = VStack(spacing: 8) { + Image(systemName: icon) + .font(.title) + Text(label) + .font(.subheadline.weight(.medium)) + } + .foregroundStyle(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, 18) + + if useGlass, #available(macOS 26.0, iOS 26.0, *) { + switch style { + case .regular: + content.glassEffect(.regular, in: shape) + case .clear: + content.glassEffect(.clear, in: shape) + case .identity: + content.glassEffect(.identity, in: shape) + } + } else { + switch style { + case .regular: + content.background(.regularMaterial, in: shape) + case .clear: + content.background(.ultraThinMaterial, in: shape) + case .identity: + content + } + } + } + // MARK: - Export / Import Application Support Data private func supportDirectoryURL() throws -> URL { let fm = FileManager.default @@ -4181,6 +4307,9 @@ private enum SettingsSection: String, CaseIterable, Identifiable { keys.insert("isStartOnLogin") keys.insert(AppStore.showQuickRefreshButtonKey) keys.insert(AppStore.lockLayoutKey) + keys.insert("kioskMode") + keys.insert("autoFullscreen") + keys.insert("showInDock") keys.insert(AppStore.uninstallToolAppPathKey) } if appearanceCheckbox.state == .on { diff --git a/README.md b/README.md index 6706c6c..8c61373 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Reads directly from the system Launchpad database: ## Installation ### Requirements -- macOS 26 (Tahoe) or later +- macOS 15 (Sequoia) or later - Apple Silicon or Intel processor - Xcode 26 (for building from source) @@ -69,12 +69,17 @@ Reads directly from the system Launchpad database: cd LaunchNext ``` -2. **Open in Xcode** +2. **Build the updater** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Open in Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Build and run** +4. **Build and run** - Select your target device - Press `⌘+R` to build and run - Or `⌘+B` to build only @@ -132,7 +137,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Common Issues **Q: App won't start?** -A: Ensure macOS 26.0+ and check system permissions. +A: Ensure macOS 15.0+ and check system permissions. ## Contributing diff --git a/i18n/README.cs.md b/i18n/README.cs.md index a3ded5e..22ad38b 100644 --- a/i18n/README.cs.md +++ b/i18n/README.cs.md @@ -57,7 +57,7 @@ Data aplikace jsou bezpečně uložena v: ## Instalace ### Požadavky -- macOS 26 (Tahoe) nebo novější +- macOS 15 (Sequoia) nebo novější - Procesor Apple Silicon nebo Intel - Xcode 26 (pro sestavení ze zdrojového kódu) @@ -69,12 +69,17 @@ Data aplikace jsou bezpečně uložena v: cd LaunchNext ``` -2. **Otevřít v Xcode** +2. **Sestavit aktualizátor** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Otevřít v Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Sestavit a spustit** +4. **Sestavit a spustit** - Vyberte vaše cílové zařízení - Stiskněte `⌘+R` pro sestavení a spuštění - Nebo `⌘+B` pouze pro sestavení @@ -132,7 +137,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Běžné problémy **Q: Aplikace se nespustí?** -A: Ujistěte se, že máte macOS 26.0+ a zkontrolujte systémová oprávnění. +A: Ujistěte se, že máte macOS 15.0+ a zkontrolujte systémová oprávnění. ## Přispívání diff --git a/i18n/README.de.md b/i18n/README.de.md index 9b37756..32154a0 100644 --- a/i18n/README.de.md +++ b/i18n/README.de.md @@ -100,7 +100,7 @@ Liest direkt aus der System-Launchpad-Datenbank: ## Installation ### Anforderungen -- macOS 26 (Tahoe) oder später +- macOS 15 (Sequoia) oder später - Apple Silicon oder Intel-Prozessor - Xcode 26 (für Build aus Quellcode) @@ -112,12 +112,17 @@ Liest direkt aus der System-Launchpad-Datenbank: cd LaunchNext/LaunchNext ``` -2. **In Xcode öffnen** +2. **Updater bauen** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **In Xcode öffnen** ```bash open LaunchNext.xcodeproj ``` -3. **Bauen und ausführen** +4. **Bauen und ausführen** - Wählen Sie Ihr Zielgerät - Drücken Sie `⌘+R` zum Bauen und Ausführen - Oder `⌘+B` nur zum Bauen @@ -170,7 +175,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Häufige Probleme **F: App startet nicht?** -A: Stellen Sie macOS 26.0+ sicher und prüfen Sie Systemberechtigungen. +A: Stellen Sie macOS 15.0+ sicher und prüfen Sie Systemberechtigungen. **F: Import-Button fehlt?** A: Überprüfen Sie, dass SettingsView.swift die Import-Funktionalität enthält. diff --git a/i18n/README.es.md b/i18n/README.es.md index ad34e1e..acd2ecc 100644 --- a/i18n/README.es.md +++ b/i18n/README.es.md @@ -100,7 +100,7 @@ Lee directamente desde la base de datos del sistema Launchpad: ## Instalación ### Requisitos -- macOS 26 (Tahoe) o posterior +- macOS 15 (Sequoia) o posterior - Procesador Apple Silicon o Intel - Xcode 26 (para compilar desde fuente) @@ -112,12 +112,17 @@ Lee directamente desde la base de datos del sistema Launchpad: cd LaunchNext/LaunchNext ``` -2. **Abrir en Xcode** +2. **Compilar el actualizador** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Abrir en Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Compilar y ejecutar** +4. **Compilar y ejecutar** - Seleccionar tu dispositivo objetivo - Presionar `⌘+R` para compilar y ejecutar - O `⌘+B` para solo compilar @@ -163,7 +168,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Problemas comunes **P: ¿La aplicación no inicia?** -R: Asegúrate de tener macOS 26+ y verifica los permisos del sistema. +R: Asegúrate de tener macOS 15+ y verifica los permisos del sistema. **P: ¿Falta el botón de importación?** R: Verifica que SettingsView.swift incluya la funcionalidad de importación. diff --git a/i18n/README.fr.md b/i18n/README.fr.md index ea376a8..4efdb61 100644 --- a/i18n/README.fr.md +++ b/i18n/README.fr.md @@ -100,7 +100,7 @@ Lit directement depuis la base de données système Launchpad : ## Installation ### Configuration requise -- macOS 26 (Tahoe) ou version ultérieure +- macOS 15 (Sequoia) ou version ultérieure - Processeur Apple Silicon ou Intel - Xcode 26 (pour compiler depuis les sources) @@ -112,12 +112,17 @@ Lit directement depuis la base de données système Launchpad : cd LaunchNext/LaunchNext ``` -2. **Ouvrir dans Xcode** +2. **Compiler le metteur à jour** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Ouvrir dans Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Compiler et exécuter** +4. **Compiler et exécuter** - Sélectionner votre périphérique cible - Appuyer sur `⌘+R` pour compiler et exécuter - Ou `⌘+B` pour compiler seulement @@ -163,7 +168,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Problèmes courants **Q: L'application ne démarre pas ?** -R: Assurez-vous d'avoir macOS 26+ et vérifiez les permissions système. +R: Assurez-vous d'avoir macOS 15+ et vérifiez les permissions système. **Q: Le bouton d'import est manquant ?** R: Vérifiez que SettingsView.swift inclut la fonctionnalité d'import. diff --git a/i18n/README.hi.md b/i18n/README.hi.md index d2f0393..73abb2a 100644 --- a/i18n/README.hi.md +++ b/i18n/README.hi.md @@ -102,7 +102,7 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app ## स्थापना ### आवश्यकताएं -- macOS 26 (Tahoe) या बाद का संस्करण +- macOS 15 (Sequoia) या बाद का संस्करण - Apple Silicon या Intel प्रोसेसर - Xcode 26 (स्रोत से बिल्ड करने के लिए) @@ -114,12 +114,17 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app cd LaunchNext/LaunchNext ``` -2. **Xcode में खोलें** +2. **अपडेटर बिल्ड करें** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Xcode में खोलें** ```bash open LaunchNext.xcodeproj ``` -3. **बिल्ड और रन करें** +4. **बिल्ड और रन करें** - अपना लक्ष्य डिवाइस चुनें - बिल्ड और रन करने के लिए `⌘+R` दबाएं - या केवल बिल्ड करने के लिए `⌘+B` @@ -227,7 +232,7 @@ LaunchNext/ ### सामान्य समस्याएं **प्र: ऐप शुरू नहीं हो रहा?** -उ: macOS 26.0+ सुनिश्चित करें और सिस्टम अनुमतियों की जांच करें। +उ: macOS 15.0+ सुनिश्चित करें और सिस्टम अनुमतियों की जांच करें। **प्र: आयात बटन गायब है?** उ: सत्यापित करें कि SettingsView.swift में आयात कार्यक्षमता शामिल है। diff --git a/i18n/README.it.md b/i18n/README.it.md index 75d81ee..d28eec6 100644 --- a/i18n/README.it.md +++ b/i18n/README.it.md @@ -57,7 +57,7 @@ Legge direttamente dal database Launchpad di sistema: ## Installazione ### Requisiti -- macOS 26 (Tahoe) o successivo +- macOS 15 (Sequoia) o successivo - Processore Apple Silicon o Intel - Xcode 26 (per compilare dal codice sorgente) @@ -69,12 +69,17 @@ Legge direttamente dal database Launchpad di sistema: cd LaunchNext ``` -2. **Apri in Xcode** +2. **Compila l'aggiornatore** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Apri in Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Compila ed esegui** +4. **Compila ed esegui** - Seleziona il tuo dispositivo target - Premi `⌘+R` per compilare ed eseguire - O `⌘+B` per solo compilare @@ -132,7 +137,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Problemi Comuni **D: L'app non si avvia?** -R: Assicurati di avere macOS 26.0+ e controlla i permessi di sistema. +R: Assicurati di avere macOS 15.0+ e controlla i permessi di sistema. ## Contribuire diff --git a/i18n/README.ja.md b/i18n/README.ja.md index a3f8a1f..8af0c1f 100644 --- a/i18n/README.ja.md +++ b/i18n/README.ja.md @@ -100,7 +100,7 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app ## インストール ### システム要件 -- macOS 26 (Tahoe) 以降 +- macOS 15 (Sequoia) 以降 - Apple Silicon または Intel プロセッサ - Xcode 26(ソースからビルドする場合) @@ -112,12 +112,17 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app cd LaunchNext/LaunchNext ``` -2. **Xcode で開く** +2. **アップデーターをビルド** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Xcode で開く** ```bash open LaunchNext.xcodeproj ``` -3. **ビルドして実行** +4. **ビルドして実行** - ターゲットデバイスを選択 - `⌘+R` でビルドして実行 - または `⌘+B` でビルドのみ @@ -163,7 +168,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### よくある問題 **Q: アプリが起動しませんか?** -A: macOS 26+ であることを確認し、システム権限をチェックしてください。 +A: macOS 15+ であることを確認し、システム権限をチェックしてください。 **Q: インポートボタンが見つかりませんか?** A: SettingsView.swift にインポート機能が含まれていることを確認してください。 diff --git a/i18n/README.ko.md b/i18n/README.ko.md index 70fd7d9..fed6e2f 100644 --- a/i18n/README.ko.md +++ b/i18n/README.ko.md @@ -104,7 +104,7 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app ## 설치 ### 요구사항 -- macOS 26 (Tahoe) 이상 +- macOS 15 (Sequoia) 이상 - Apple Silicon 또는 Intel 프로세서 - Xcode 26 (소스에서 빌드하는 경우) @@ -116,12 +116,17 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app cd LaunchNext/LaunchNext ``` -2. **Xcode에서 열기** +2. **업데이터 빌드** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Xcode에서 열기** ```bash open LaunchNext.xcodeproj ``` -3. **빌드 및 실행** +4. **빌드 및 실행** - 타겟 디바이스 선택 - `⌘+R`로 빌드 및 실행 - 또는 `⌘+B`로 빌드만 실행 @@ -229,7 +234,7 @@ LaunchNext/ ### 일반적인 문제 **Q: 앱이 시작되지 않나요?** -A: macOS 26.0+ 확인 및 시스템 권한을 확인해주세요 +A: macOS 15.0+ 확인 및 시스템 권한을 확인해주세요 **Q: 가져오기 버튼이 없나요?** A: SettingsView.swift에 가져오기 기능이 포함되어 있는지 확인해주세요 diff --git a/i18n/README.ru.md b/i18n/README.ru.md index d36251d..769cd01 100644 --- a/i18n/README.ru.md +++ b/i18n/README.ru.md @@ -100,7 +100,7 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app ## Установка ### Требования -- macOS 26 (Tahoe) или новее +- macOS 15 (Sequoia) или новее - Процессор Apple Silicon или Intel - Xcode 26 (для сборки из исходного кода) @@ -112,12 +112,17 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app cd LaunchNext/LaunchNext ``` -2. **Открыть в Xcode** +2. **Собрать обновлятор** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Открыть в Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Собрать и запустить** +4. **Собрать и запустить** - Выберите целевое устройство - Нажмите `⌘+R` для сборки и запуска - Или `⌘+B` только для сборки @@ -170,7 +175,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### Общие проблемы **В: Приложение не запускается?** -О: Убедитесь в macOS 26.0+ и проверьте системные разрешения. +О: Убедитесь в macOS 15.0+ и проверьте системные разрешения. **В: Кнопка импорта отсутствует?** О: Убедитесь, что SettingsView.swift включает функциональность импорта. diff --git a/i18n/README.vi.md b/i18n/README.vi.md index 2c0ce54..0a73903 100644 --- a/i18n/README.vi.md +++ b/i18n/README.vi.md @@ -102,7 +102,7 @@ Dữ liệu ứng dụng được lưu trữ an toàn tại: ## Cài đặt ### Yêu cầu -- macOS 26 (Tahoe) trở lên +- macOS 15 (Sequoia) trở lên - Bộ xử lý Apple Silicon hoặc Intel - Xcode 26 (để xây dựng từ mã nguồn) @@ -114,12 +114,17 @@ Dữ liệu ứng dụng được lưu trữ an toàn tại: cd LaunchNext/LaunchNext ``` -2. **Mở trong Xcode** +2. **Xây dựng trình cập nhật** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **Mở trong Xcode** ```bash open LaunchNext.xcodeproj ``` -3. **Xây dựng và chạy** +4. **Xây dựng và chạy** - Chọn thiết bị đích - Nhấn `⌘+R` để xây dựng và chạy - Hoặc `⌘+B` chỉ để xây dựng @@ -227,7 +232,7 @@ LaunchNext/ ### Vấn đề thường gặp **Q: Ứng dụng không khởi động?** -A: Đảm bảo macOS 26.0+ và kiểm tra quyền hệ thống. +A: Đảm bảo macOS 15.0+ và kiểm tra quyền hệ thống. **Q: Thiếu nút nhập?** A: Xác minh SettingsView.swift bao gồm chức năng nhập. diff --git a/i18n/README.zh.md b/i18n/README.zh.md index 985ac4e..89cf1a1 100644 --- a/i18n/README.zh.md +++ b/i18n/README.zh.md @@ -100,7 +100,7 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app ## 安装 ### 系统要求 -- macOS 26 (Tahoe) 或更高版本 +- macOS 15 (Sequoia) 或更高版本 - Apple Silicon 或 Intel 处理器 - Xcode 26(从源码构建) @@ -112,12 +112,17 @@ sudo xattr -r -d com.apple.quarantine /Applications/LaunchNext.app cd LaunchNext/LaunchNext ``` -2. **在 Xcode 中打开** +2. **构建更新器** + ```bash + swift build --package-path UpdaterScripts/SwiftUpdater --configuration release --arch arm64 --arch x86_64 --product SwiftUpdater + ``` + +3. **在 Xcode 中打开** ```bash open LaunchNext.xcodeproj ``` -3. **构建和运行** +4. **构建和运行** - 选择目标设备 - 按 `⌘+R` 构建并运行 - 或按 `⌘+B` 仅构建 @@ -163,7 +168,7 @@ xcodebuild -project LaunchNext.xcodeproj -scheme LaunchNext -configuration Relea ### 常见问题 **问:应用无法启动?** -答:确保 macOS 26.0+ 并检查系统权限。 +答:确保 macOS 15.0+ 并检查系统权限。 **问:导入按钮缺失?** 答:验证 SettingsView.swift 包含导入功能。