Das Regal hatte seine eigene Transportsicherheit

Die Plakate blieben weg, und der Grund stand nicht im Code, sondern
daneben: eine App-Erweiterung hat ihre **eigene** Info.plist, und damit
ihre eigene Transportsicherheit. Die Ausnahme fürs lokale Netz, die in
der Info.plist der App seit jeher steht, gilt dort nicht.

Ein Jellyfin im Heimnetz antwortet auf blankem HTTP. Jede Bildanfrage der
Erweiterung lief damit gegen ATS — lautlos, ohne Fehler, ohne Eintrag.
Das Regal blieb leer und sah aus wie „geht halt nicht".

Dazu die richtige Plakatgrösse: 666×1000 statt 404×606, Apples Mass für
die doppelte Auflösung. Für beide Stufen dasselbe Bild — ein Apple TV
zeichnet das Regal ohnehin doppelt aufgelöst, und zwei Adressen abzulegen
hiesse, dem Server zwei Grössen desselben Plakats abzuverlangen, damit
eine davon nie gebraucht wird.

Nicht nachgewiesen: dass es jetzt zeichnet. Das Regal erscheint nur,
wenn die App in der **obersten** Reihe des Menüs steht und fokussiert
ist, und den Fokus kann ich im Simulator nicht bewegen — tvOS nimmt keine
Touch-Eingaben, und an die Simulator-App komme ich aus dieser Umgebung
nicht heran.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-29 21:16:04 +02:00
co-authored by Claude Opus 5
parent 6373566d1c
commit a1576921fd
5 changed files with 40 additions and 2 deletions
@@ -0,0 +1,15 @@
{
"originHash" : "8b778ccd4dce9d26be9db57d4587b19c4a4366fcdaf8b6017e1df36fa1eddb4f",
"pins" : [
{
"identity" : "vlckit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/videolan/vlckit.git",
"state" : {
"revision" : "6cbc4e7b248aa51ec0906697abb30ecae47194b7",
"version" : "4.0.0-a24"
}
}
],
"version" : 3
}
+7 -2
View File
@@ -14,8 +14,13 @@ enum TopShelfWriter {
static let group = "group.com.scarriffleservices.flixy" static let group = "group.com.scarriffleservices.flixy"
/// Die Kante, in der das Regal Plakate zeigt. /// Die Kante, in der das Regal Plakate zeigt.
private static let posterWidth = 404 ///
private static let posterHeight = 606 /// **Apples Mass für die doppelte Auflösung**, und für beide Stufen
/// dasselbe Bild. Ein Apple TV zeichnet das Regal ohnehin doppelt
/// aufgelöst; zwei Adressen abzulegen hiesse, dem Server zwei Grössen
/// desselben Plakats abzuverlangen, damit eine davon nie gebraucht wird.
private static let posterWidth = 666
private static let posterHeight = 1000
static func update( static func update(
rows: [MediaRowGroup], rows: [MediaRowGroup],
+5
View File
@@ -18,6 +18,11 @@
<string>1.0</string> <string>1.0</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1</string> <string>1</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
<key>NSExtension</key> <key>NSExtension</key>
<dict> <dict>
<key>NSExtensionPointIdentifier</key> <key>NSExtensionPointIdentifier</key>
@@ -17,6 +17,10 @@
"comment" : "Name of the accent color option \"Indigo\".", "comment" : "Name of the accent color option \"Indigo\".",
"isCommentAutoGenerated" : true "isCommentAutoGenerated" : true
}, },
"Lilac" : {
"comment" : "Name of the accent color option.",
"isCommentAutoGenerated" : true
},
"Lime" : { "Lime" : {
"comment" : "Name of the accent color \"Lime\".", "comment" : "Name of the accent color \"Lime\".",
"isCommentAutoGenerated" : true "isCommentAutoGenerated" : true
+9
View File
@@ -286,6 +286,15 @@ targets:
path: FlixyTopShelf/Info.plist path: FlixyTopShelf/Info.plist
properties: properties:
CFBundleDisplayName: Flixy CFBundleDisplayName: Flixy
# **Die Erweiterung hat ihre eigene Info.plist.**
#
# Und damit ihre eigene Transportsicherheit: die Ausnahme in der
# Info.plist der App gilt hier nicht. Ohne sie blockt das System jedes
# Plakat weg, das über blankes HTTP vom Jellyfin im Heimnetz kommt —
# lautlos, und das Regal bleibt leer. Genau so sieht „geht halt nicht"
# aus.
NSAppTransportSecurity:
NSAllowsLocalNetworking: true
NSExtension: NSExtension:
NSExtensionPointIdentifier: com.apple.tv-top-shelf NSExtensionPointIdentifier: com.apple.tv-top-shelf
NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).TopShelfProvider NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).TopShelfProvider