import Foundation /// Was ein Link aus dem Regal bedeutet. /// /// **Ein reiner Typ, ohne Ansicht und ohne Netz.** Ein Tippfehler im Schema /// lässt nichts abstürzen: ein Druck auf ein Plakat täte einfach nichts, ohne /// Fehler und ohne Hinweis. /// /// Geprüft ist er trotzdem nicht — das Fernseh-Ziel hat kein Testziel, und /// ihn dafür nach MediaKit zu schieben hiesse, ein Schema dieser App in ein /// Paket zu legen, das keine App kennt. Wer ihn anfasst, prüft ihn am Gerät: /// `xcrun simctl openurl … flixy://play/`. enum TVDeepLink: Equatable { /// Abspielen, was dahintersteckt. case play(id: String) /// Die Detailseite zeigen. case detail(id: String) /// Muss mit `CFBundleURLSchemes` in der Info.plist übereinstimmen. static let scheme = "flixy" init?(_ url: URL) { guard url.scheme == Self.scheme else { return nil } // **`host` und nicht `pathComponents[0]`.** Bei `flixy://play/42` // steht „play" im Rechnernamen, nicht im Pfad — der lautet schlicht // „/42". Wer hier den Pfad zerlegt, bekommt die Kennung als Aktion // und wundert sich. let kennung = url.pathComponents.dropFirst().joined(separator: "/") guard !kennung.isEmpty else { return nil } switch url.host() { case "play": self = .play(id: kennung) case "item": self = .detail(id: kennung) default: return nil } } }