HLS Catalog with FPS and DRMtoday: Using AVFoundation to play and persist HTTP Live Streams with FairPlay Streaming Content Protection
This sample demonstrates how to use the AVFoundation framework to play HTTP Live Streams hosted on remote servers as well as how to persist the HLS streams on disk for offline playback.
Sample is prepared by Apple and extended to make it compatible with DRMtoday.
To learn more about FairPlay Streaming, see the FairPlay Streaming Programming Guide which is part of the "FPS Server SDK" package. The latest version of this package can be found at https://developer.apple.com/streaming/fps.
Build and run the sample on an actual device running iOS 11.0 or later using Xcode. The APIs demonstrated in this sample do not work on the iOS Simulator.
This sample provides a list of HLS Streams that you can playback by tapping on the UITableViewCell corresponding to the stream. If you wish to manage the download of an HLS stream such as initiating an AVAggregateAssetDownloadTask
, canceling an already running AVAggregateAssetDownloadTask
or deleteting an already downloaded HLS stream from disk, you can accomplish this by tapping on the accessory button on the UITableViewCell
corresponding to the stream you wish to manage.
When the sample creates and initializes an AVAggregateAssetDownloadTask
for the download of an HLS stream, only the default selections for each of the media selection groups will be used (these are indicated in the HLS playlist EXT-X-MEDIA
tags by a DEFAULT attribute of YES).
If you wish to add your own HLS streams to test with using this sample, you can do this by adding an entry into the Streams.plist that is part of the Xcode Project. There is five important keys you need to provide values for:
name: What the display name of the HLS stream should be in the sample.
playlist_url: The URL of the HLS stream's master playlist.
is_protected: Whether or not the stream is protected using FPS.
minimum_download_bitrate: Minimal bitrate of the quality that will be downloaded
content_key_id_list: An array of content key identifiers to use for loading content keys for content using FPS. The values are strings in the form of the URIs used in the X-EXT-KEY tag for loading content keys. The exact format is described in DRMtoday documentation. For example: "skd://drmtoday?keyId=6fbf6d37cf3840c09c99ad8da1dff10b"
Additional DRMtoday specific values:
environment: DRMtoday environment (test, staging or production).
merchant: DRMtoday merchant name (for building Merchant Metadata object as defined in DRMtoday documentation)
_user_id: DRMtoday userId (for building Merchant Metadata object as defined in DRMtoday documentation)
session_id: DRMtoday sessionId (for building Merchant Metadata object as defined in DRMtoday documentation)
asset_id: DRMtoday assetId
variant_id: DRMtoday variantId of the asset
Please note that providing assetId and variantId will result in overridding content key idenfifiers from SKD URI. Additionally, requesting DRM license by assetId will work only for single key content but fail for multi-key content. To use these properties, lines 126-127 of DRMtoday.swift need to be uncommented. Please use those two properties with caution and for debugging purposes only.
If any of the streams you add are not hosted securely, you will need to add an Application Transport Security (ATS) exception in the Info.plist. More information on ATS and the relevant plist keys can be found in the following article:
Information Property List Key Reference - NSAppTransportSecurity: https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33
Saving HLS streams for offline playback is only supported for VOD streams. If you try to save a live HLS stream, the system will throw an exception.
AssetPersistenceManager.swift:
AssetPersistenceManager
is the main class in this sample that demonstrates how to manage downloading HLS streams. It includes APIs for starting and canceling downloads, deleting existing assets off the users device, and monitoring the download progress.
AssetPlaybackManager.swift:
AssetPlaybackManager
is the class that manages the playback of Assets in this sample using Key-value observing on various AVFoundation classes.
AssetListManager.swift:
- The
AssetListManager
class is responsible for providing a list of assets to present in theAssetListTableViewController
.
StreamListManager.swift:
- The
StreamListManager
class manages loading reading the contents of theStreams.plist
file in the application bundle.
ContentKeyManager.swift:
- The
ContentKeyManager
class configures the instance ofAVContentKeySession
to use for requesting content keys securely for playback or offline use.
ContentKeyLoader.swfit:
ContentKeyDelegate
is a class that implements theAVContentKeySessionDelegate
protocol to respond to content key requests using FairPlay Streaming.
ContentKeyDelegate+Persistable.swift:
- This extension on
ContentKeyDelegate
implements theAVContentKeySessionDelegate
protocol methods related to persistable content keys.
The following resources available on the Apple Developer website contain helpful information that you may find useful
- General information regarding HLS on supported Apple devices and platforms:
- For information regarding topics specific to FairPlay Streaming as well as the latest version of the FairPlay Streaming Server SDK, please see:
- Information regarding authoring HLS content for devices and platforms:
- Information regarding error handling on the server side and with AVFoundation on supported Apple devices and platforms:
Xcode 9.0 or later; iOS 11.0 SDK or later
iOS 11.0 or later.
Copyright (C) 2017-2018 Apple Inc. All rights reserved.