Catalyst: ohne Netz, ohne Übersetzung, ohne Fenstergröße
Drei Fehler auf einmal, und alle drei meine. **Die App kam gar nicht ins Netz.** Ein Catalyst-Programm läuft in der Sandbox und braucht eine ausdrückliche Erlaubnis für ausgehende Verbindungen. Ohne sie gibt es keine Fehlermeldung — der Ladekreis dreht sich einfach für immer, und genau so sah es aus. **In der Seitenleiste standen Schlüssel statt Wörtern** — „sidebar.downloads" statt „Downloads". Ich hatte zwei Fassungen derselben Beschriftung gebaut, eine mit `LocalizedStringKey` und eine mit `String` für Titel, die vom Server kommen. Bei einem Literal darf Swift sich für beide entscheiden, und es entschied sich nicht überall gleich. Jetzt gibt es eine Fassung; wer einen fertigen Text hat, baut sein `Text` selbst. **Das Fenster öffnete wieder in Notizzettelgröße.** Meine Größenangabe hing an `os(macOS)` — unter Catalyst gilt aber `os(iOS)`, also griff sie nicht. Dort hängt die Größe ohnehin an der Szene, nicht am Fenster. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
f296d7ae1a
commit
39d9138911
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<!-- Catalyst-Programme laufen in der Sandbox. Ohne die Erlaubnis für
|
||||
ausgehende Verbindungen erreicht die App keinen Server — und zwar
|
||||
ohne Fehlermeldung: der Ladekreis dreht sich einfach für immer. -->
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
+31
-1
@@ -70,9 +70,18 @@ struct FlixyApp: App {
|
||||
// Eine Untergrenze, unter der die Oberfläche nicht mehr
|
||||
// aufgeht: schmaler als das hier klappt die Seitenleiste zu
|
||||
// und die Reihen zeigen anderthalb Kacheln.
|
||||
#if os(macOS)
|
||||
//
|
||||
// `os(macOS)` allein reichte nicht — unter Catalyst gilt
|
||||
// `os(iOS)`, und genau deshalb öffnete das Fenster wieder in
|
||||
// Notizzettelgröße.
|
||||
#if os(macOS) || targetEnvironment(macCatalyst)
|
||||
.frame(minWidth: 900, minHeight: 620)
|
||||
#endif
|
||||
#if targetEnvironment(macCatalyst)
|
||||
// Unter Catalyst gibt es `defaultSize` nicht; die Größe hängt
|
||||
// an der Szene.
|
||||
.task { Self.widenWindow() }
|
||||
#endif
|
||||
.environment(session)
|
||||
.environment(playback)
|
||||
.environment(playbackSettings)
|
||||
@@ -123,6 +132,27 @@ struct FlixyApp: App {
|
||||
}
|
||||
|
||||
#if os(iOS)
|
||||
#if targetEnvironment(macCatalyst)
|
||||
extension FlixyApp {
|
||||
/// Gibt dem Fenster eine vernünftige Mindestgröße.
|
||||
///
|
||||
/// Unter Catalyst öffnet macOS sonst ein Fenster von der Größe eines
|
||||
/// Notizzettels — und darin fällt der Aufmacher in sich zusammen, weil
|
||||
/// seine Abstände dehnbar sind.
|
||||
@MainActor
|
||||
static func widenWindow() {
|
||||
for scene in UIApplication.shared.connectedScenes {
|
||||
guard let windowScene = scene as? UIWindowScene else { continue }
|
||||
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 900, height: 620)
|
||||
windowScene.sizeRestrictions?.maximumSize = CGSize(
|
||||
width: CGFloat.greatestFiniteMagnitude,
|
||||
height: CGFloat.greatestFiniteMagnitude
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/// Der klassische App-Delegat, für das eine, was SwiftUI nicht abdeckt.
|
||||
@MainActor
|
||||
final class AppDelegate: NSObject, UIApplicationDelegate {
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
<key>NSAllowsLocalNetworking</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>NSLocalNetworkUsageDescription</key>
|
||||
<string>Flixy benötigt Zugriff auf das lokale Netzwerk, um deinen Medienserver zu finden und Filme direkt von ihm zu laden.</string>
|
||||
<key>UIBackgroundModes</key>
|
||||
<array>
|
||||
<string>audio</string>
|
||||
|
||||
+3716
-3715
File diff suppressed because it is too large
Load Diff
@@ -191,7 +191,7 @@ struct RootView: View {
|
||||
) {
|
||||
mediaStack { LibraryView(library: library) }
|
||||
} label: {
|
||||
tabLabel(library.title, symbol: symbol(for: library.kind))
|
||||
sidebarLabel(Text(library.title), symbol: symbol(for: library.kind))
|
||||
}
|
||||
.customizationID("flixy.tab.library.\(library.id)")
|
||||
}
|
||||
@@ -292,22 +292,19 @@ struct RootView: View {
|
||||
#endif
|
||||
|
||||
/// Die Beschriftung eines Eintrags.
|
||||
///
|
||||
/// **Ein** Aufruf, nicht zwei. Es gab hier eine zweite Fassung für Titel,
|
||||
/// die vom Server kommen — mit `String` statt `LocalizedStringKey`. Swift
|
||||
/// darf sich bei einem Literal für beide entscheiden, und es entschied sich
|
||||
/// nicht überall gleich: in der Seitenleiste stand plötzlich
|
||||
/// „sidebar.downloads" statt „Downloads". Wer einen fertigen Text hat,
|
||||
/// baut sein `Text` jetzt selbst.
|
||||
private func tabLabel(_ title: LocalizedStringKey, symbol: String) -> some View {
|
||||
let label = Label(title, systemImage: symbol)
|
||||
#if os(macOS)
|
||||
return label.frame(
|
||||
minWidth: Self.sidebarWidth.min - 40,
|
||||
maxWidth: Self.sidebarWidth.max - 40,
|
||||
alignment: .leading
|
||||
)
|
||||
#else
|
||||
return label
|
||||
#endif
|
||||
sidebarLabel(Text(title), symbol: symbol)
|
||||
}
|
||||
|
||||
/// Dieselbe Beschriftung, wenn der Titel erst vom Server kommt.
|
||||
private func tabLabel(_ title: String, symbol: String) -> some View {
|
||||
let label = Label(title, systemImage: symbol)
|
||||
private func sidebarLabel(_ title: Text, symbol: String) -> some View {
|
||||
let label = Label { title } icon: { Image(systemName: symbol) }
|
||||
#if os(macOS)
|
||||
return label.frame(
|
||||
minWidth: Self.sidebarWidth.min - 40,
|
||||
|
||||
@@ -201,6 +201,7 @@ targets:
|
||||
CODE_SIGN_IDENTITY: "-"
|
||||
DEVELOPMENT_TEAM: ""
|
||||
ENABLE_HARDENED_RUNTIME: NO
|
||||
CODE_SIGN_ENTITLEMENTS: Flixy/Flixy-macCatalyst.entitlements
|
||||
info:
|
||||
path: Flixy/Info-macOS.plist
|
||||
properties:
|
||||
@@ -222,6 +223,9 @@ targets:
|
||||
ITSAppUsesNonExemptEncryption: false
|
||||
NSAppTransportSecurity:
|
||||
NSAllowsLocalNetworking: true
|
||||
NSLocalNetworkUsageDescription: >-
|
||||
Flixy benötigt Zugriff auf das lokale Netzwerk, um deinen
|
||||
Medienserver zu finden und Filme direkt von ihm zu laden.
|
||||
|
||||
DownloadWidget:
|
||||
type: app-extension
|
||||
|
||||
Reference in New Issue
Block a user