SRGSSR / srgletterbox-apple

The official SRG SSR media playback experience
https://srgssr.github.io/marketing/letterbox/
MIT License
14 stars 7 forks source link

iOS 17 / tvOS 17 compatibility #305

Closed defagos closed 1 year ago

defagos commented 1 year ago

As a developer integrating Letterbox I want to be sure that no new issues arise because of iOS 17 or tvOS 17.

Acceptance criteria

Tasks

defagos commented 1 year ago

Here are issues found so far with beta 6.

defagos commented 1 year ago

We could fix the timeline animation glitch by ensuring that the cell frame never changes (we do not let the timeline cell dimension to be customized anyway).

This also fixes animation glitches on the 1st cell on iOS 16.

defagos commented 1 year ago

The slider issue is easy to reproduce with a Letterbox demo nightly built with the iOS 16 SDK but less with a debug version built with the iOS 17 SDK.

However the issue can be reproduced in Play, built with the iOS 17 SDK. Here is the relevant layout constraint issue:

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x283a61450 SRGLiveLabel:0x11bf66ee0.trailing == SRGControlWrapperView:0x11bf50400.trailing - 11   (active)>",
    "<NSLayoutConstraint:0x283a61220 H:|-(11)-[SRGLiveLabel:0x11bf66ee0]   (active, names: '|':SRGControlWrapperView:0x11bf50400 )>",
    "<NSLayoutConstraint:0x283a49ae0 UIStackView:0x11bf68fd0.leading == UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide'.leading   (active)>",
    "<NSLayoutConstraint:0x283a49b80 UIStackView:0x11bf68fd0.trailing == UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide'.trailing   (active)>",
    "<NSLayoutConstraint:0x283a16fd0 '_UITemporaryLayoutWidth' UIView:0x11bfddf40.width == 0   (active)>",
    "<NSLayoutConstraint:0x283a16bc0 'UISV-canvas-connection' UIStackView:0x11bf68fd0.leading == SRGAirPlayButton:0x11bf06930.leading   (active)>",
    "<NSLayoutConstraint:0x283a16b70 'UISV-canvas-connection' H:[SRGFullScreenButton:0x11bfc5e40]-(0)-|   (active, names: '|':UIStackView:0x11bf68fd0 )>",
    "<NSLayoutConstraint:0x283a16a30 'UISV-spacing' H:[SRGAirPlayButton:0x11bf06930]-(0)-[SRGPictureInPictureButton:0x11bfd8790]   (active)>",
    "<NSLayoutConstraint:0x283a168f0 'UISV-spacing' H:[SRGPictureInPictureButton:0x11bfd8790]-(0)-[SRGControlWrapperView:0x10687c440]   (active)>",
    "<NSLayoutConstraint:0x283a16800 'UISV-spacing' H:[SRGControlWrapperView:0x10687c440]-(0)-[SRGControlWrapperView:0x106849970]   (active)>",
    "<NSLayoutConstraint:0x283a16760 'UISV-spacing' H:[SRGControlWrapperView:0x106849970]-(0)-[SRGControlWrapperView:0x11bf50400]   (active)>",
    "<NSLayoutConstraint:0x283a16120 'UISV-spacing' H:[SRGControlWrapperView:0x11bf50400]-(0)-[SRGFullScreenButton:0x11bfc5e40]   (active)>",
    "<NSLayoutConstraint:0x283a49ea0 'UIViewSafeAreaLayoutGuide-left' H:|-(0)-[UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide'](LTR)   (active, names: '|':UIView:0x11bfddf40 )>",
    "<NSLayoutConstraint:0x283a49f40 'UIViewSafeAreaLayoutGuide-right' H:[UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide']-(0)-|(LTR)   (active, names: '|':UIView:0x11bfddf40 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x283a61450 SRGLiveLabel:0x11bf66ee0.trailing == SRGControlWrapperView:0x11bf50400.trailing - 11   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x283a4a6c0 H:|-(11)-[UILabel:0x11bfd6290]   (active, names: '|':SRGControlWrapperView:0x106849970 )>",
    "<NSLayoutConstraint:0x283a611d0 UILabel:0x11bfd6290.trailing == SRGControlWrapperView:0x106849970.trailing - 11   (active)>",
    "<NSLayoutConstraint:0x283a49ae0 UIStackView:0x11bf68fd0.leading == UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide'.leading   (active)>",
    "<NSLayoutConstraint:0x283a49b80 UIStackView:0x11bf68fd0.trailing == UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide'.trailing   (active)>",
    "<NSLayoutConstraint:0x283a16fd0 '_UITemporaryLayoutWidth' UIView:0x11bfddf40.width == 0   (active)>",
    "<NSLayoutConstraint:0x283a16bc0 'UISV-canvas-connection' UIStackView:0x11bf68fd0.leading == SRGAirPlayButton:0x11bf06930.leading   (active)>",
    "<NSLayoutConstraint:0x283a16b70 'UISV-canvas-connection' H:[SRGFullScreenButton:0x11bfc5e40]-(0)-|   (active, names: '|':UIStackView:0x11bf68fd0 )>",
    "<NSLayoutConstraint:0x283a16a30 'UISV-spacing' H:[SRGAirPlayButton:0x11bf06930]-(0)-[SRGPictureInPictureButton:0x11bfd8790]   (active)>",
    "<NSLayoutConstraint:0x283a168f0 'UISV-spacing' H:[SRGPictureInPictureButton:0x11bfd8790]-(0)-[SRGControlWrapperView:0x10687c440]   (active)>",
    "<NSLayoutConstraint:0x283a16800 'UISV-spacing' H:[SRGControlWrapperView:0x10687c440]-(0)-[SRGControlWrapperView:0x106849970]   (active)>",
    "<NSLayoutConstraint:0x283a16760 'UISV-spacing' H:[SRGControlWrapperView:0x106849970]-(0)-[SRGControlWrapperView:0x11bf50400]   (active)>",
    "<NSLayoutConstraint:0x283a16120 'UISV-spacing' H:[SRGControlWrapperView:0x11bf50400]-(0)-[SRGFullScreenButton:0x11bfc5e40]   (active)>",
    "<NSLayoutConstraint:0x283a49ea0 'UIViewSafeAreaLayoutGuide-left' H:|-(0)-[UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide'](LTR)   (active, names: '|':UIView:0x11bfddf40 )>",
    "<NSLayoutConstraint:0x283a49f40 'UIViewSafeAreaLayoutGuide-right' H:[UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide']-(0)-|(LTR)   (active, names: '|':UIView:0x11bfddf40 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x283a611d0 UILabel:0x11bfd6290.trailing == SRGControlWrapperView:0x106849970.trailing - 11   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x283a4aa30 H:|-(11)-[SRGLetterboxTimeSlider:0x11bf09110]   (active, names: '|':SRGControlWrapperView:0x10687c440 )>",
    "<NSLayoutConstraint:0x283a49ae0 UIStackView:0x11bf68fd0.leading == UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide'.leading   (active)>",
    "<NSLayoutConstraint:0x283a49b80 UIStackView:0x11bf68fd0.trailing == UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide'.trailing   (active)>",
    "<NSLayoutConstraint:0x283a4b430 SRGLetterboxTimeSlider:0x11bf09110.trailing == SRGControlWrapperView:0x10687c440.trailing - 11   (active)>",
    "<NSLayoutConstraint:0x283a16fd0 '_UITemporaryLayoutWidth' UIView:0x11bfddf40.width == 0   (active)>",
    "<NSLayoutConstraint:0x283a16bc0 'UISV-canvas-connection' UIStackView:0x11bf68fd0.leading == SRGAirPlayButton:0x11bf06930.leading   (active)>",
    "<NSLayoutConstraint:0x283a16b70 'UISV-canvas-connection' H:[SRGFullScreenButton:0x11bfc5e40]-(0)-|   (active, names: '|':UIStackView:0x11bf68fd0 )>",
    "<NSLayoutConstraint:0x283a16a30 'UISV-spacing' H:[SRGAirPlayButton:0x11bf06930]-(0)-[SRGPictureInPictureButton:0x11bfd8790]   (active)>",
    "<NSLayoutConstraint:0x283a168f0 'UISV-spacing' H:[SRGPictureInPictureButton:0x11bfd8790]-(0)-[SRGControlWrapperView:0x10687c440]   (active)>",
    "<NSLayoutConstraint:0x283a16800 'UISV-spacing' H:[SRGControlWrapperView:0x10687c440]-(0)-[SRGControlWrapperView:0x106849970]   (active)>",
    "<NSLayoutConstraint:0x283a16760 'UISV-spacing' H:[SRGControlWrapperView:0x106849970]-(0)-[SRGControlWrapperView:0x11bf50400]   (active)>",
    "<NSLayoutConstraint:0x283a16120 'UISV-spacing' H:[SRGControlWrapperView:0x11bf50400]-(0)-[SRGFullScreenButton:0x11bfc5e40]   (active)>",
    "<NSLayoutConstraint:0x283a49ea0 'UIViewSafeAreaLayoutGuide-left' H:|-(0)-[UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide'](LTR)   (active, names: '|':UIView:0x11bfddf40 )>",
    "<NSLayoutConstraint:0x283a49f40 'UIViewSafeAreaLayoutGuide-right' H:[UILayoutGuide:0x28206fe20'UIViewSafeAreaLayoutGuide']-(0)-|(LTR)   (active, names: '|':UIView:0x11bfddf40 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x283a4b430 SRGLetterboxTimeSlider:0x11bf09110.trailing == SRGControlWrapperView:0x10687c440.trailing - 11   (active)>

The DVR layout does not seem affected and the live-only layout is simply broken.

defagos commented 1 year ago

The layout issue is related to bottom controls

The issue occurs when opening from the mini player with background video playback enabled. In this case a new view controller (initially with frame 0) is hooked to an already playing player.

When opening a video for the first time the result is different since the slider is not displayed initially. There is also no issue when resuming from PiP since the view controller is not created from scratch but rather restored.