為你的 Apple TV 應用程式添加保護

在本主題中,您將學習如何將 FairPlay 內容保護新增至您的 Apple TV 應用程式,這些應用程式使用適用於 TVOS 的布萊特灣原生 SDK。

概覽

適用於tvOS的Native SDK使用帶有FairPlay Streaming的HLS支持數字版權管理(DRM)保護。如果您的帳戶啟用了DRM功能並配置為動態投放,則您的視頻在提取後會自動打包為DRM。

由於對受FairPlay保護的視頻的支持已集成到Brightcove Native SDK的核心框架中,因此您無需加載應用程序證書。有關詳細信息,請參閱使用 Native Player SDK 的內容安全 (DRM)文檔。

程式碼範例

要將FairPlay內容保護添加到您的Apple TV應用程序,請按照下列步驟操作:

  1. 開始於基本的蘋果電視示例應用程序。
  2. 將FairPlay許可代碼添加到您的應用中。這可以在基本公平競賽樣本。

你的代碼視圖控制器.swift文件應與此類似:

//
//  ViewController.swift
//  Fairplay-Video-Playback
//
//  Copyright © 2019 Brightcove. All rights reserved.
//

import UIKit
import BrightcovePlayerSDK

// This example is for content using Dynamic Delivery. Because of this, you do NOT need to specify your FairPlay Application ID or the FairPlay Publisher ID.
fileprivate struct playbackConfig {
    static let policyKey = "your policy key"
    static let accountID = "your account ID"
    static let videoID = "your video ID"
}

class ViewController: UIViewController {
    @IBOutlet weak var videoContainerView: UIView!

    var playbackController: BCOVPlaybackController = BCOVPlayerSDKManager.shared().createPlaybackController()
    var fairPlayAuthProxy: BCOVFPSBrightcoveAuthProxy?

    lazy var playerView: BCOVTVPlayerView? = {
        // Set ourself as the presenting view controller
        // so that tab bar panels can present other view controllers
        let options = BCOVTVPlayerViewOptions()
        options.presentingViewController = self

        // Create and add to the video container view
        guard let _playerView = BCOVTVPlayerView(options: options) else {
            return nil
        }

        // Link the playback controller to the Player View
        _playerView.playbackController = playbackController

        videoContainerView.addSubview(_playerView)

        _playerView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            _playerView.topAnchor.constraint(equalTo: videoContainerView.topAnchor),
            _playerView.rightAnchor.constraint(equalTo: videoContainerView.rightAnchor),
            _playerView.leftAnchor.constraint(equalTo: videoContainerView.leftAnchor),
            _playerView.bottomAnchor.constraint(equalTo: videoContainerView.bottomAnchor)
            ])

        return _playerView
    }()

    lazy var playbackService: BCOVPlaybackService = {
        return BCOVPlaybackService(accountId: playbackConfig.accountID, policyKey: playbackConfig.policyKey)
    }()

    required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // With Dynamic Delivery, you don't need to load
        // an application certificate. The FairPlay session will load an
        // application certificate for you if needed.
        // You can just load and play your FairPlay videos.

        // With Dynamic Delivery, you can pass nil for the publisherId and applicationId
        self.fairPlayAuthProxy = BCOVFPSBrightcoveAuthProxy(publisherId: nil,
                                                            applicationId: nil)

        let sdkManager = BCOVPlayerSDKManager.sharedManager()

        // Create chain of session providers
        let psp = sdkManager?.createBasicSessionProvider(with:nil)
        let fps = sdkManager?.createFairPlaySessionProvider(withApplicationCertificate:nil,
                                                            authorizationProxy:self.fairPlayAuthProxy!,
                                                            upstreamSessionProvider:psp)

        createSampleTabBarItemView()

        // Create the playback controller
        playbackController = (sdkManager?.createPlaybackController(with:fps, viewStrategy:nil))!
        // Configure the playback controller
        playbackController.isAutoAdvance = false
        playbackController.isAutoPlay = true
        playbackController.delegate = self

        // Link the playback controller to the Player View
        playerView?.playbackController = playbackController

        requestContentFromPlaybackService()
    }

    private func createSampleTabBarItemView() {

        guard let playerView = playerView, var topTabBarItemViews = playerView.settingsView.topTabBarItemViews else {
            return
        }

        let sampleTabBarItemView = SampleTabBarItemView(size: CGSize.init(width: 620, height: 200), playerView: playerView)

        // Insert our new tab bar item view at the end of the top tab bar
        topTabBarItemViews.append(sampleTabBarItemView)
        playerView.settingsView.topTabBarItemViews = topTabBarItemViews
    }

    private func requestContentFromPlaybackService() {
        playbackService.findVideo(withVideoID: playbackConfig.videoID, parameters: nil) { [weak self] (video: BCOVVideo?, jsonResponse: [AnyHashable: Any]?, error: Error?) -> Void in

            if let _video = video {
                //  since "isAutoPlay" is true, setVideos will begin playing the content
                self?.playbackController.setVideos([_video] as NSArray)
            } else {
                print("ViewController Debug - Error retrieving video: \(error?.localizedDescription ?? "unknown error")")
            }

        }
    }
}

// MARK: - UIFocusEnvironment overrides
extension ViewController {

    // Focus Environment override for tvOS 9
    override var preferredFocusedView: UIView? {
        return playerView
    }

    // Focus Environment override for tvOS 10+
    override var preferredFocusEnvironments: [UIFocusEnvironment] {
        return (playerView != nil ? [ playerView! ] : [])
    }

}

// MARK: - BCOVPlaybackControllerDelegate
extension ViewController: BCOVPlaybackControllerDelegate {

    func playbackController(_ controller: BCOVPlaybackController!, didAdvanceTo session: BCOVPlaybackSession!) {
        NSLog("ViewController Debug - Advanced to new session.")
    }

    func playbackController(_ controller: BCOVPlaybackController!, playbackSession session: BCOVPlaybackSession!, didReceive lifecycleEvent: BCOVPlaybackSessionLifecycleEvent!) {
        NSLog("Event: %@", lifecycleEvent.eventType)
    }

}