Files
Flaro/project.yml
T
GuidoandClaude Opus 5 222ac1c968 Vier Fehler aus dem ersten echten Gebrauch
Kein Video lief jemals an
  AVPlayerEngine.load() wartete auf asset.load(.duration) und die
  Spurenliste, BEVOR es zurückkehrte — und erst danach rief das Modell
  play(). AVFoundation muss für die Dauer aber so viel von der Datei
  holen, bis es den Index findet, und der sitzt bei MP4 wie MKV oft am
  Ende. Über eine langsame Leitung sind das Minuten, in denen nur ein
  Ladekreis zu sehen war, obwohl der Player längst hätte anfangen können.
  Jetzt kehrt load() zurück, sobald das Item hängt; Dauer und Spuren
  kommen nach und melden sich über den Ereignisstrom.
  Dazu AVURLAssetPreferPreciseDurationAndTimingKey: false — sonst
  durchsucht AVFoundation bei manchen Formaten die ganze Datei.

  Zweiter Fund an derselben Stelle: VLCMedia(url:) ist nullable. Ging es
  schief, blieb media still nil, play() tat nichts und es gab keinen
  Fehler — nur einen Ladekreis ohne Ende. Wird jetzt gemeldet.

Kein Querformat im Player
  requestGeometryUpdate allein dreht nicht: das System dreht sofort
  zurück, solange die erlaubten Ausrichtungen es nicht hergeben. Die
  Erlaubnis kommt nur über den App-Delegaten, deshalb OrientationLock
  als Brücke. Player dreht ins Querformat, beim Verlassen zurück. iPad
  bleibt frei — dort ist Querformat beim Blättern der Normalfall.

Uhrzeit über dem Film
  Die Statusleiste war nur ausgeblendet, solange die Bedienelemente weg
  waren. Jetzt immer.

Sehr langer Start
  Zwei Ursachen. Erstens legte der Initialisierer der App die
  Hintergrund-URLSession an — die spricht über XPC mit nsurlsessiond und
  verzögerte den allerersten Bildaufbau. Jetzt erst bei Bedarf, und wer
  keine Downloads hat, braucht sie nie. Zweitens fragte jeder Start erst
  plex.tv nach der Serverliste und suchte die Verbindung neu. Die zuletzt
  funktionierende wird jetzt gemerkt (Server-Token im Schlüsselbund) und
  mit kurzer Zeitgrenze zuerst probiert; die vollständige Suche greift
  nur noch, wenn sie nicht mehr antwortet — etwa wenn man von zuhause
  weggeht.

Dazu ein Hinweis im Player, wenn die Verbindung über die gedrosselte
Plex-Vermittlung läuft. Sonst sucht man den Fehler in der App.

132 Tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 20:43:26 +02:00

137 lines
4.8 KiB
YAML

name: Flixy
options:
bundleIdPrefix: com.scarriffleservices
deploymentTarget:
iOS: "26.0"
createIntermediateGroups: true
groupSortPosition: top
developmentLanguage: en
settings:
base:
DEVELOPMENT_TEAM: PP34X97WS3
SWIFT_VERSION: "6.0"
MARKETING_VERSION: "0.1.0"
CURRENT_PROJECT_VERSION: "1"
SWIFT_STRICT_CONCURRENCY: complete
packages:
FlixyKit:
path: Packages/FlixyKit
# Eigenes Package, weil das VLCKit-Binärpaket 920 MB wiegt und sonst bei
# jedem `swift test` in FlixyKit mitgezogen würde.
FlixyVLC:
path: Packages/FlixyVLC
targets:
Flixy:
type: application
platform: iOS
sources:
- path: Flixy
dependencies:
- target: DownloadWidget
- package: FlixyKit
product: PlexKit
- package: FlixyKit
product: FlixyDesign
- package: FlixyKit
product: FlixyPlayback
- package: FlixyKit
product: FlixyDownloads
- package: FlixyVLC
product: FlixyVLC
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flixy
PRODUCT_NAME: Flixy
# iPhone und iPad aus demselben Target.
TARGETED_DEVICE_FAMILY: "1,2"
CODE_SIGN_STYLE: Automatic
info:
path: Flixy/Info.plist
properties:
CFBundleDisplayName: Flixy
UILaunchScreen:
UIColorName: LaunchBackground
# Der harte Schalter für „nur dunkel". Eine Ansicht mit
# .preferredColorScheme(.dark) allein reicht nicht: Systemdialoge,
# Statusleiste und Tastatur richten sich danach nicht.
UIUserInterfaceStyle: Dark
# Alle drei bleiben eingetragen: die Info.plist sagt, was die App
# grundsätzlich kann. Was davon gerade gilt, entscheidet zur Laufzeit
# OrientationLock über den App-Delegaten — Hochformat beim Blättern,
# Querformat im Player.
UISupportedInterfaceOrientations:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
UISupportedInterfaceOrientations~ipad:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
# Ohne diesen Modus hält iOS die Wiedergabe an, sobald die App in den
# Hintergrund geht — und Bild-in-Bild gäbe es gar nicht.
UIBackgroundModes:
- audio
# Das Schema, über das Plex nach der Anmeldung zurückschickt. Ohne
# diesen Eintrag kennt iOS es nicht, und ASWebAuthenticationSession
# käme nie zurück — das Anmeldefenster bliebe offen stehen.
CFBundleURLTypes:
- CFBundleURLName: com.scarriffleservices.flixy.auth
CFBundleURLSchemes:
- com.scarriffleservices.flixy
# Ohne diesen Schlüssel lehnt ActivityKit jede Anfrage ab — und
# zwar wortlos, was die Suche nach dem Grund unangenehm macht.
NSSupportsLiveActivities: true
NSAppTransportSecurity:
# Plex-Server im Heimnetz laufen überwiegend auf blankem HTTP an
# Port 32400. Diese Ausnahme erlaubt genau das, ohne die
# Transportsicherheit für das offene Netz abzuschalten.
NSAllowsLocalNetworking: true
# Seit iOS 14 verlangt jeder Zugriff auf Adressen im eigenen Netz eine
# Freigabe. Fehlt der Text, verweigert das System sie kommentarlos und
# die Serversuche findet dauerhaft nichts.
NSLocalNetworkUsageDescription: >-
Flixy benötigt Zugriff auf das lokale Netzwerk, um deinen
Plex-Server zu finden und Medien direkt von ihm zu laden.
# Die Live Activity für Downloads. Eine eigene Erweiterung, weil iOS die
# Darstellung im Sperrbildschirm in einem getrennten Prozess zeichnet — die
# App selbst läuft zu dem Zeitpunkt meist gar nicht.
DownloadWidget:
type: app-extension
platform: iOS
sources:
- path: DownloadWidget
dependencies:
- package: FlixyKit
product: FlixyDownloads
- package: FlixyKit
product: FlixyDesign
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flixy.downloadwidget
PRODUCT_NAME: DownloadWidget
CODE_SIGN_STYLE: Automatic
SKIP_INSTALL: YES
# Von XcodeGen erzeugt statt von Hand geschrieben. Eine eigene Datei ohne
# CFBundleIdentifier führt zu einer Erweiterung ganz ohne Kennung — und
# der Fehler lautet dann „not prefixed with the parent app's bundle
# identifier", was auf eine falsche Fährte führt.
info:
path: DownloadWidget/Info.plist
properties:
CFBundleDisplayName: Flixy Downloads
NSExtension:
NSExtensionPointIdentifier: com.apple.widgetkit-extension