Brightcove proporciona soporte activo para el SDK de iOS más reciente en la última versión pública de las siguientes versiones de iOS:
Brightcove proporciona soporte pasivo para las siguientes versiones de iOS:
El Core SDK está traducido al árabe (ar), inglés (en), francés (fr), alemán (de), japonés (ja), coreano (ko), español (es), chino simplificado (zh-Hans) y tradicional. Chino (zh-Hant). Para obtener el beneficio de una localización, su aplicación también debe estar traducida al mismo idioma y configuración regional. Consulte la sección Localización personalizada para obtener información adicional.
Todos los componentes del SDK (los marcos principales y de complementos) se publican con el mismo número de versión. Al actualizar cualquier componente, actualice todos los componentes a la misma versión.
Para proyectos que utilizan Xcode 12 en Apple Silicon M1 y Universal Frameworks (.framework), se devuelve un error de compilación al compilar el proyecto para el simulador arm64.
*ld: building for iOS Simulator, but linking in dylib built for iOS, file for architecture arm64*
Para compilar para un simulador arm64, asegúrese de que arm64
se haya agregado a la configuración de compilación "Arquitecturas excluidas" para Any iOS Simulator SDK
en la pestaña "Configuración de compilación" del destino de su aplicación.
La versión 6.10.0 del SDK de Brightcove Player agrega subespecciones para el núcleo y cada complemento para admitir XCFrameworks. El valor predeterminado para cada subespección es /XCFramework
.
Nombre de especificación de módulo | Nombres de subespecciones |
---|---|
Brightcove-Player-Core | Brightcove-Player-Core/Marco Brightcove-Player-Core/XCFramework |
Brightcove-Player-DAI | Brightcove-Player-DAI/Framework Brightcove-Player-DAI/XCFramework |
Brightcove-Player-FreeWheel | Brightcove-Player-FreeWheel/Framework Brightcove-Player-FreeWheel/XCFramework |
Brightcove-Player-GoogleCast | Brightcove-Player-GoogleCast/Framework Brightcove-Player-GoogleCast/XCFramework |
Brightcove-Player-IMA | Brightcove-Player-IMA/Framework Brightcove-Player-IMA/XCFramework |
Brightcove-Player-Omniture | Brightcove-Player-Omniture/Framework Brightcove-Player-Omniture/XCFramework |
Brightcove-Player-Pulse | Brightcove-Player-Pulse/Framework Brightcove-Player-Pulse/XCFramework |
Brightcove-Player-SSAI | Brightcove-Player-SSAI/Framework Brightcove-Player-SSAI/XCFramework |
Brightcove-Player-OpenMeasurement | - |
La versión 6.12.0 de Brightcove Player SDK actualiza las especificaciones de pod Brightcove-Player-FreeWheel
y Brightcove-Player-Omniture
para instalar la versión dinámica de BrightcovePlayerSDK
.
Nombre de especificación de módulo | Tipo de marco | Dependencia |
---|---|---|
Brightcove-Player-Core | dinámica | - |
Brightcove-Player-DAI (disponible desde 6.12.7) | dinámica | Brightcove-Player-Core |
Brightcove-Player-FreeWheel | dinámica | Brightcove-Player-Core para iOS, Brightcove-Player-Core para tvOS |
Brightcove-Player-GoogleCast | estático | Brightcove-Player-Core |
Brightcove-Player-IMA | dinámica | Brightcove-Player-Core |
Brightcove-Player-Omniture | dinámica | Brightcove-Player-Core |
Brightcove-Player-Pulse | dinámica | Brightcove-Player-Core |
Brightcove-Player-SSAI | dinámica | Brightcove-Player-Core, Brightcove-Player-OpenMeasurement (solo para medición abierta) |
Brightcove-Player-OpenMeasurement (disponible desde 6.10.0) | dinámica | - |
La compatibilidad con vídeos protegidos por FairPlay está integrada en el marco central de BrightcovePlayerSDK . Consulte la guía de FairPlay para obtener detalles completos sobre el uso de FairPlay con el SDK de Brightcove Native Player.
La compatibilidad con subtítulos Sidecar está integrada en el marco central de BrightcovePlayerSDK . Para obtener detalles completos sobre el uso de subtítulos Sidecar con el SDK de Brightcove Native Player, consulte la guía de subtítulos Sidecar.
Desde la versión 6.0.0, el SDK de Brightcove Native Player le permite descargar vídeos HLS, incluidos aquellos protegidos con cifrado FairPlay, para reproducirlos más tarde, ya sea en línea o sin conexión. Consulte la guía del desarrollador de la aplicación para obtener todos los detalles:
Guía del desarrollador de aplicaciones iOS para la descarga y reproducción de vídeos sin conexión con FairPlay
El SDK de Brightcove Player proporciona paquetes de instalación para iOS y tvOS como bibliotecas dinámicas empaquetadas como Frameworks y XCFrameworks. La implementación es compatible con iOS 12.0 y superior.
Puede utilizar CocoaPods para agregar el SDK de Brightcove Player a su proyecto. Puede encontrar la última especificación de pod Brightcove-Player-Core
aquí. Podspec es compatible tanto con iOS como con tvOS.
Cuando utilice Brightcove CocoaPods en su proyecto, agregue source 'https://github.com/brightcove/BrightcoveSpecs.git'
al inicio de su Podfile.
nombre.
source ' https://github.com/CocoaPods/Specs '
source ' https://github.com/brightcove/BrightcoveSpecs.git '
platform :ios, ' 12.0 '
use_frameworks !
target ' MyVideoPlayer ' do
pod ' Brightcove-Player-Core '
end
Framework se puede instalar agregando la subespecificación /Framework
al pod.
source ' https://github.com/CocoaPods/Specs '
source ' https://github.com/brightcove/BrightcoveSpecs.git '
platform :ios, ' 12.0 '
use_frameworks !
target ' MyVideoPlayer ' do
pod ' Brightcove-Player-Core/Framework '
end
Al actualizar su instalación, es una buena idea actualizar la copia local de su repositorio BrightcoveSpecs para tener las últimas especificaciones de pod localmente, tal como actualizaría su repositorio maestro CococaPods. Normalmente, si ejecuta pod update
en la Terminal, esto sucederá automáticamente o, alternativamente, puede actualizar explícitamente con pod repo update
.
Para agregar manualmente el SDK de Brightcove Player a su proyecto:
BrightcovePlayerSDK.framework
o BrightcovePlayerSDK.xcframework
a su proyecto. Asegúrate de utilizar la versión correspondiente a tu objetivo, iOS o tvOS.BrightcovePlayerSDK.framework
/ BrightcovePlayerSDK.xcframework
bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
. Marque "Ejecutar script solo durante la instalación". Esto eliminará las arquitecturas innecesarias de la compilación, lo cual es importante para el envío a la App Store. Este paso ya no es necesario cuando se utiliza XCFramework.bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
. Marque "Ejecutar script solo durante la instalación". Esto eliminará las arquitecturas innecesarias de la compilación, lo cual es importante para el envío a la App Store.arm64
se haya agregado a su configuración de compilación "Arquitecturas excluidas" para Any iOS Simulator SDK
.Como referencia, aquí están todos los componentes del SDK y las URL correspondientes para ayudarle a localizar y descargar las últimas versiones:
Componente | URL |
---|---|
Brightcove-Player-Core | https://github.com/brightcove/brightcove-player-sdk-ios/tags |
Brightcove-Player-DAI | https://github.com/brightcove/brightcove-player-sdk-ios-dai/tags |
Brightcove-Player-FreeWheel | https://github.com/brightcove/brightcove-player-sdk-ios-fw/tags |
Brightcove-Player-GoogleCast | https://github.com/brightcove/brightcove-player-sdk-ios-googlecast/tags |
Brightcove-Player-IMA | https://github.com/brightcove/brightcove-player-sdk-ios-ima/tags |
Brightcove-Player-Omniture | https://github.com/brightcove/brightcove-player-sdk-ios-omniture/tags |
Brightcove-Player-Pulse | https://github.com/brightcove/brightcove-player-sdk-ios-pulse/tags |
Brightcove-Player-SSAI | https://github.com/brightcove/brightcove-player-sdk-ios-ssai/tags |
Para agregar el SDK de Brightcove Player a su proyecto con Swift Package Manager:
https://github.com/brightcove/brightcove-player-sdk-ios.git
Nota: Solo el XCFramework dinámico es compatible con Swift Package Manager.
El SDK de Brightcove Player para iOS se puede importar mediante:
import BrightcovePlayerSDK;
Reproducción de vídeo con Brightcove Player SDK para iOS:
// ** Customize these values with your own account information **
let kAccountId = " ... "
let kPolicyKey = " ... "
let kVideoId = " ... "
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = sdkManager . createPlaybackController ( )
self . playbackController = playbackController // store this to a strong property
view . addSubview ( playbackController . view )
let playbackService = BCOVPlaybackService ( withAccountId : kAccountId ,
policyKey : kPolicyKey )
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : kVideoId
]
playbackService . findVideo ( withConfiguration : configuration ,
queryParameters : nil ) { ( video : BCOVVideo ? ,
jsonResponse : Any ? ,
error : Error ? ) in
if let video {
self . playbackController ? . setVideos ( [ video ] )
self . playbackController ? . play ( )
}
}
Debe evitar que el controlador se libere automáticamente al final del método. Una forma común de hacer esto es almacenar una referencia al controlador en una variable de instancia segura.
Desde la versión 5.1.0, Brightcove PlayerUI está completamente integrado en el marco Core SDK. PlayerUI proporciona un conjunto completo de controles para reproducción y publicidad, listo para usar.
PlayerUI se configura rápidamente, muestra controles de anuncios para SSAI, Pulse y FreeWheel, y se puede personalizar creando sus propios diseños.
Siga las pautas a continuación para configurar los controles de PlayerUI.
Cree una propiedad en su UIViewController para realizar un seguimiento de BCOVPUIPlayerView. BCOVPUIPlayerView contendrá tanto la vista del controlador de reproducción como la vista de controles.
// PlayerUI's Player View
var playerView : BCOVPUIPlayerView ?
Cree BCOVPUIBasicControlView y luego BCOVPUIPlayerView. Aquí es donde asociamos el Controlador de reproducción (y por tanto todos los vídeos que reproduce) con los controles.
// Create and configure Control View.
let controlView = BCOVPUIBasicControlView . withVODLayout ( )
playerView = BCOVPUIPlayerView ( playbackController : self . playbackController , options : nil )
// Add BCOVPUIPlayerView to your video view.
if let playerView {
videoView . addSubview ( playerView )
}
Necesitará configurar el diseño para la vista del reproductor; puede hacerlo con Auto Layout o el enfoque anterior de Springs & Struts.
Configure la vista del reproductor para que coincida con el contenedor de video de su diseño ( videoView
) cuando cambie de tamaño.
playerView . frame = videoView . bounds
playerView . autoresizingMask = [ . flexibleHeight , . flexibleWidth ]
Establezca translatesAutoresizingMaskIntoConstraints
en BCOVPUIPlayerView en false
.
playerView . translatesAutoresizingMaskIntoConstraints = false
Luego agregue las restricciones para el diseño; configurar los anclajes superior, derecho, izquierdo e inferior de su BCOVPUIPlayerView para que sean iguales a los de videoView
NSLayoutConstraint . activate ( [
playerView . topAnchor . constraint ( equalTo : videoView . topAnchor ) ,
playerView . rightAnchor . constraint ( equalTo : videoView . rightAnchor ) ,
playerView . bottomAnchor . constraint ( equalTo : videoView . bottomAnchor ) ,
playerView . leftAnchor . constraint ( equalTo : videoView . leftAnchor )
] )
La clase BCOVPUIPlayerViewOptions
le permite personalizar algunos comportamientos de BCOVPlayerUI en la inicialización. Puedes personalizar lo siguiente:
jumpBackInterval
El tiempo en segundos que el jugador buscará hacia atrás cuando se presione el botón de salto hacia atrás.
hideControlsInterval
El tiempo en segundos después del último evento táctil, antes de que se oculten los controles.
hideControlsAnimationDuration
El tiempo en segundos que tardan los controles en animarse a oculto.
showControlsAnimationDuration
El tiempo en segundos que tardan los controles en animarse y volverse visibles.
learnMoreButtonBrowserStyle
Configuración que determina si al tocar el botón "Más información" en un anuncio se mostrará el enlace de clic en un navegador externo (configuración predeterminada) o en un navegador interno.
presentingViewController
La subclase UIViewController que se utilizará para presentar otros controladores de vista (como el controlador de vista de selección de subtítulos).
automaticControlTypeSelection
Si desea o no que BCOVPUIPlayerView
elija un tipo BCOVPUIBasicControlView
automáticamente según el tipo de medio. Cuando este valor se establece en true
se ignorará la propiedad BCOVPUIBasicControlView
pasada al inicializador BCOVPUIPlayerView
.
Secuencias de vídeo y audio
basicControlViewWithVODLayout
basicControlViewWithLiveLayout
basicControlViewWithLiveDVRLayout
Transmisiones de solo audio
basicControlViewWithAODLayout
basicControlViewWithLiveAudioLayout
basicControlViewWithLiveDVRAudioLayout
NOTA: automaticControlTypeSelection
elige diseños entre los proporcionados por BCOVPlayerUI y, por lo tanto, se sobrescribirán los controles y diseños personalizados; automaticControlTypeSelection
y la personalización de la interfaz de usuario del reproductor son incompatibles.
Las opciones se pueden configurar usando el siguiente método:
let manager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = manager . createPlaybackController ( )
let options = BCOVPUIPlayerViewOptions ( )
options . jumpBackInterval = 5
let playerView = BCOVPUIPlayerView ( playbackController : playbackController ,
options : options )
Se proporcionan tres diseños para admitir diferentes tipos de vídeo:
BCOVPUIControlLayout basicVODControlLayout
es un diseño básico para transmisiones de vídeo bajo demanda generales.
BCOVPUIControlLayout basicLiveControlLayout
es un diseño para vídeo en vivo.
BCOVPUIControlLayout basicLiveDVRControlLayout
es un diseño para transmisiones de video en vivo con controles DVR.
Por lo general, configura un nuevo diseño inmediatamente después de crear BCOVPUIPlayerView
, pero también puede configurar un nuevo diseño en cualquier momento. Por ejemplo, puedes configurar un nuevo diseño de VOD como este:
playerView ? . controlsView . layout = BCOVPUIControlLayout . basicVOD ( )
Además de los diseños predeterminados, puede crear sus propios diseños altamente personalizados creando una instancia de un nuevo BCOVPUIControlLayout
con su propio diseño. Sin embargo, tenga en cuenta que automaticControlTypeSelection
elige diseños entre los proporcionados por BCOVPlayerUI y, por lo tanto, se sobrescribirán los controles y diseños personalizados; automaticControlTypeSelection
y la personalización de la interfaz de usuario del reproductor son incompatibles.
Primero, cree los controles que irán en su diseño usando BCOVPUIBasicControlView layoutViewWithControlFromTag:width:elasticity:
. Cada control está empaquetado en un BCOVPUILayoutView
que determina el espaciado de los controles.
Puede establecer el width
de cada vista de diseño en el ancho predeterminado (que se basa en el tipo de control), o puede especificar su propio ancho.
Utilice el argumento elasticity
para determinar en qué medida la vista de diseño que contiene el control redimensiona su ancho para llenar la barra de control.
A continuación se muestran ejemplos de cómo crear una variedad de controles básicos.
// Create various standard layout views
// Standard play/pause button
let playbackLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonPlayback ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Standard jump back button
let jumpBackButtonLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonJumpBack ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Current time indicator
let currentTimeLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelCurrentTime ,
width : kBCOVPUILayoutUseDefaultValue
elasticity : 0.0 )
// Time separator - typically the '/' character
let timeSeparatorLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelTimeSeparator ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Video duration label
let durationLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelDuration ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Slider bar used for seeking through the video
// The elasticity is set to 1 so that it can resize to fill available space
let progressLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . sliderProgress ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 1.0 )
// Closed caption button
// This button is initially hidden ('removed'), and will be shown
// if closed captions or audio tracks are available.
let closedCaptionLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonClosedCaption ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
closedCaptionLayoutView ? . isRemoved = true
// The full-screen button
let screenModeLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonScreenMode ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// AirPlay button
// This button is initially hidden ('removed'), and will be shown
// if AirPlay devices are available.
let externalRouteLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewExternalRoute ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
externalRouteLayoutView ? . isRemoved = true
// Empty view - used as a spacer
let spacerLayoutView1 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 1.0 ,
elasticity : 1.0 )
// Empty view - used as a spacer
let spacerLayoutView2 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 1.0 ,
elasticity : 1.0 )
// Empty view - will have a custom UIImageView added as a subview
let logoLayoutView1 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 88.0 ,
elasticity : 1.0 )
// Empty view - will have a custom UIImageView added as a subview
let logoLayoutView2 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 36.0 ,
elasticity : 1.0 )
Tenga en cuenta que también puede crear una vista de diseño vacía, en la que puede colocar su propia vista (logotipo, control, nada, etc.). Este código muestra cómo colocar un logotipo UIImage
dentro de logoLayoutView1 que creamos anteriormente.
// Create logo image inside an image view for display in control bar.
let logoImage1 = UIImage ( named : " myLogo " )
let logoImageView1 = UIImageView ( image : logoImage1 )
logoImageView1 . autoresizingMask = [ . flexibleWidth , . flexibleHeight ]
logoImageView1 . contentMode = . scaleAspectFit
logoImageView1 . frame = logoLayoutView1 . frame
// Add image view to our empty layout view.
logoLayoutView1 . addSubview ( logoImageView1 )
Ahora que hay varios controles empaquetados en vistas de diseño, están ordenados en matrices, cada una de las cuales representa una única línea de controles, es decir, una barra de controles. Tenga en cuenta que puede tener diferentes diseños para orientación vertical y horizontal, por lo que normalmente configurará dos conjuntos diferentes de barras de control.
En el diseño estándar para orientación horizontal, los controles se organizan en una única matriz y luego esa matriz se almacena en otra matriz que representa el conjunto completo de controles.
let standardLayoutLine1 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
currentTimeLayoutView ,
timeSeparatorLayoutView ,
durationLayoutView ,
progressLayoutView ,
spacerLayoutView1 ,
logoLayoutView1 ,
spacerLayoutView2 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView
]
let standardLayoutLines = [ standardLayoutLine1 ]
En el diseño compacto para orientación vertical, se crean dos conjuntos de controles, uno para cada línea. Estas matrices están empaquetadas en otra matriz que representa el diseño compacto.
Tenga en cuenta que se utilizan exactamente los mismos objetos para la mayoría de los controles en cada diseño. Cuando haya terminado y cambie entre la orientación vertical y horizontal, el objeto se moverá a su nueva posición mediante una animación suave.
let compactLayoutLine1 = [
currentTimeLayoutView ,
progressLayoutView ,
durationLayoutView
]
let compactLayoutLine2 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
spacerLayoutView1 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView ,
logoLayoutView2
]
let compactLayoutLines = [
compactLayoutLine1 ,
compactLayoutLine2
]
Finalmente, ahora que hay dos configuraciones de diseño (una para ancho completo y otra para ancho compacto), puede crear un nuevo objeto BCOVPUIControlLayout
y configurarlo en la vista de control del reproductor.
let customLayout = BCOVPUIControlLayout . init ( standardControls : standardLayoutLines ,
compactControls : compactLayoutLines )
playerView ? . controlsView . layout = customLayout
Si tiene controles que necesita mostrar u ocultar con frecuencia, puede configurar la propiedad removed
en la vista de diseño de ese control. Cuando haya cambiado sus controles, llame setNeedsLayout
en el controlView de playerView:
logoLayoutView1 ? . isRemoved = true
playerView ? . controlsView . setNeedsLayout ( )
También puede personalizar varias propiedades generales BCOVPUIControlLayout
:
controlBarHeight
establece el tamaño de cada fila de controles.horizontalItemSpacing
establece el espacio entre cada BCOVPUILayoutView
en cada barra de control.compactLayoutMaximumWidth
determina qué conjunto de controles se utiliza. Si la vista de control es más pequeña que compactLayoutMaximumWidth
, se utilizará el conjunto de controles compactos; de lo contrario, se utilizarán los controles estándar. Para cambiar el conjunto de controles que se muestran, debe crear e instalar un nuevo BCOVPUIControlLayout
. Se pueden instalar nuevos controles en cualquier momento.
Para obtener más ejemplos de personalización de PlayerUI, puede consultar el código de muestra en la carpeta PlayerUI del repositorio BrightcoveOS GitHub:
https://github.com/BrightcoveOS/ios-player-samples
El SDK de Brightcove Native Player incluye controles integrados para la reproducción en tvOS en Apple TV. Para obtener detalles completos sobre el uso de la interfaz de usuario del reproductor de TV integrada con el SDK de Brightcove Native Player, consulte nuestra guía del reproductor de TV.
Habilite la funcionalidad AirPlay configurando la propiedad setAllowsExternalPlayback
en su BCOVPlaybackController
en true
. El botón AirPlay se mostrará en los controles de reproducción si se encuentran dispositivos AirPlay en su red.
Actualmente, IMA es el único complemento publicitario que admite AirPlay y solo cuando se utilizan anuncios pre-roll y/o post-roll. El uso de AirPlay con los complementos publicitarios Pulse, SSAI o FreeWheel puede provocar un comportamiento inesperado.
Si también desea admitir AirPlay 2 y permitir que se seleccionen varios dispositivos para la salida de audio, tendrá que hacer algunas cosas adicionales. Primero, deberá configurar AVAudioSession para poder configurar routeSharingPolicy
. Por ejemplo:
do {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , mode : . moviePlayback , policy : . longFormVideo )
} catch {
print ( " Error setting AVAudioSession category " )
}
También deberá configurar al menos un comando de reproducción a través de MPRemoteCommandCenter
. Como mínimo querrás configurar pauseCommand
y playCommand
. Por ejemplo:
let center = MPRemoteCommandCenter . shared ( )
center . pauseCommand . addTarget { _ in
playbackController . pause ( )