TV App and Universal Search Feeds Guide

Getting Started with Feeds for Your Content

Depending on your app, provide a different set of feeds for each type of content.

Video-on-demand (VOD) Content

Apple supports VOD Movies and Episodic TV Shows content within the Apple TV App. Catch-up content made available quickly after broadcast, and this content that can be recorded via DVR in your service, are also considered VOD content to include with the Apple TV App. To integrate this content with our TV App and Universal Search, provide us data feeds about your VOD content.

The feeds required for VOD content are:

  • Catalog Feed: Provide one catalog feed for all your movie and TV VOD content.

  • Availability Feed: Provide one VOD availability feed per country for your VOD content. For example, if you have your VOD content available in three countries, you will need to provide three availability feeds.

Refer to the specifications to understand what metadata is required and optional for your VOD Movies and TV Shows.

Linear Live Sports Content

Live Sports refers to any linear channels that serve sports content.

Note: Live Sports are supported in the TV App for the United States and Canada. Within the US, we support georestrictions via Nielsen DMAs for live sports content, remember to include this information for these channels. In Canada, only national channels are supported for Live Sports integration.

Include primaryLocale information. When specifying the isLive parameter for this content, the value is true for the original air of a game and false for the reair of a game.

The feeds required for Live Sports content are:

  • Catalog Feed: Provide one catalog feed for all your Live Sports content.

  • Availability Feed: Provide one linear availability feed for your linear Live Sports content, per linear channel.

Event-Based Stream (EBS) Content

Event-Based Stream (EBS) refers to any sports content not served through a linear channel but through a stream that exists for the duration of the content.

The feeds required for Event-Based Stream content are:

  • Catalog Feed: Provide one catalog feed for all your EBS content, separate from the VOD catalog feed described above.

  • Availability Feed: Provide one availability feed for your EBS content.

To get started integrating TV App and Universal Search with your content:

  1. Check Eligibility for TV App and Universal Search. This will let you know if this integration is possible for your content. If you are eligible, make sure you Understand the Integration Process for your Data Feed.

  2. Next, Enable the APIs for TV App and Universal Search.

  3. Complete feed development and validation.

  4. Complete app development and validation. Implement APIs for TV App and Universal Search. This includes: Subscription Registration, Now Playing Info, NSUserActivity, and Deep Links.

  5. Submit a TestFlight build for end-to-end integration testing by yourself and Apple. Validate Your App with TestFlight builds.

Getting Started Guide for Apple TV App Partners

With the Apple TV app, viewers can browse movies, TV shows, live sporting events, and handpicked recommendations from a variety of video services without switching from one app to the next. Third-party apps can integrate with the Apple TV app on iOS, iPadOS, and tvOS devices — so viewers can watch wherever they go.

You will need Xcode 8 or later, iOS 10.0 or later, tvOS 10.0 or later, and macOS 10.11 or later to complete this integration. Visit Apple Developer for the latest iOS, tvOS, macOS and Xcode downloads.

This document introduces specifications and requirements for Apple TV App and Universal Search, both for how to prepare and deliver your content’s metadata, and have your apps support the product features of the Apple TV app.

Getting Started with Integrating your Content

This document introduces specifications and requirements for Apple TV App and Universal Search, including how to prepare and deliver metadata.

Set Up XML Feeds

  1. Build catalog XML feed and host on https endpoint. Reference the following resources for requirements:

  2. Build availability XML feed and host on https endpoint. Reference the following resources for requirements:

  3. Install the Media Feed Validator tool to self-validate your feeds and remove all errors. Contact your Apple Technical Representative for access.

Set Up iOS and tvOS Apps

  1. Implement APIs for TV App and Universal Search. Refer to Apple TV App Guidelines for User Interactions for best practices

  2. Generate a TestFlight Public Link with the APIs above implemented.

  3. When the above steps are completed, complete the Test Deliverables form. Contact your Apple Technical Representative for access. Apple will start testing your integration and come back to you with results.

Apple TV App Integration Elements

Apple TV App Integration Elements
  1. Feeds: The Apple TV app only supports integration of video on demand (VOD) movies, VOD episodic TV shows, and live sports from third-party applications. Catch-up movies and episodic TV shows available on demand quickly after broadcast, and Cloud DVR movies and episodic TV shows available in your app are also considered VOD content. Live sporting events played as event-based streams (EBS) and/or on 24/7 linear channels, are only supported in the United States Canada. To integrate your app, provide metadata feeds describing all of your application’s supported content types. Apple cannot support a partial integration; your entire supported content catalog must be included in your metadata feeds.

  2. Subscription registration: The subscriptions API allows iOS and tvOS to know that a user is authenticated in your app, and their level of entitlement for the content they are able to play. Declaration of additional subscription tiers and packages are supported.

  3. Deep Linking: Universal links or custom-scheme deep links allow the Apple TV app to take customers directly to your content, and play it back within your app. If playback requires login or sign-up, ensure the content plays after login or sign-up. Find more information in Apple TV App Guidelines for User Interactions".

  4. Now Playing Info: Allows iOS and tvOS to know what content is currently playing, and to track playback progress to populate content in the Up Next queue of the Apple TV app. It is also responsible for populating the Now Playing sections of the lock screen and Control Center on iOS, and the HUD (Heads-Up Display) on tvOS.

Frequently Asked Questions

I want to configure my provisioning profile but the Apple TV App and Universal Search Guides say I need my developer account to be registered as a Universal Search partner. Has this been done?

  • Yes, we used the Team ID associated with the iOS and tvOS apps you declared in your survey to enable this. If you need additional Team IDs registered (e.g., if you or your development vendor uses a different Team ID), please share them with your Apple contact.

  • You can find your Team ID in the Membership section of your Apple Developer account

What content types should be included in my catalog and availability feeds?

  • movie

  • tv_show

  • tv_season

  • tv_episode

  • sporting_event (US and Canada only)

What content types should not be included in my catalog and availability feeds?

  • Extra (including bonus, preview, user-generated, trailer, recaps or promotional content)

  • Any content type with isAdultOnlyContent=true in the <item> metadata

  • Any content type representing weather reports, news reports/bulletins, and other temporary content

Should Transactional Video on Demand (TVOD) or Pay-Per-View content be included in my catalog and availability feeds?

  • No, TVOD or PPV content that your users can buy or rent within your applications must be excluded. Only Subscription Video on Demand (SVOD), Advertising Video on Demand (AVOD), and Live Sporting Events (in United States and Canada) are supported

Can I test the end-to-end integration?

  • Once your feeds have been validated and approved by Apple for production ingestion, and you have a TestFlight with all the required APIs, Apple will enable Test Mode which will allow you to preview and validate the integration from a customer perspective.

  • If your TestFlight has a different App Bundle ID than your production app, share the Bundle ID with your Apple contact ahead of this step.

If integrating both VOD Movies and TV Shows, and Live Sports, should the catalog feed contain all content types?

  • It is an encouraged best practice for you to create 2 separate Catalog Feeds in this scenario: 1 for your VOD Movies and TV Shows, and another for your Live Sports that are available across linear channels and/or in an event-based stream (EBS) fashion

Developer Tasks

Check Eligibility for TV App and Universal Search

The Apple TV app lets you browse content from a variety of video services without switching from one app to the next. It provides movies, shows, and handpicked recommendations. The app is on iOS and tvOS devices— so you can watch wherever you go.

You will need Xcode 8 or later, iOS 10.0 or later, tvOS 10.0 or later, and macOS 10.11 or later to complete this integration. Visit Apple Developer for the latest iOS, tvOS, macOS and Xcode downloads.

Eligibility Requirements

To integrate with Apple TV app and Universal Search, you must:

  • Have your app available on both tvOS and iOS.

  • Offer long form, stand-alone content (such as movies) and/or episodic content (such as TV shows).

    Note: We support linear channels for sports content and event-based streams in the United States and Canada.

  • Be able to provide rich metadata for all long form, stand-alone and/or episodic content available in your app.

  • Be able to provide artwork to our specifications for content in your application that is not available from any other provider in a given country.

  • Be prepared to submit builds to Apple’s various testing teams via TestFlight.

Tools that will help you develop and validate your feeds, can be found in the Search and Discovery Services.

Understand the Integration Process for your Data Feed

Content flows through Universal Search from resources to the user. To set this up, you will create a data feed and an app.

After registering a brand with Apple, you will integrate the data about the media content and validate the feed. Then you provide natural language processing information Siri will use for Universal Search. You go into test mode in conjunction with your app, which has been integrated and validated separately.

When test mode is complete, you submit the app to the App Store. It will be launched when everything conforms to the requirements.

All referenced tools can be found in the Search and Discovery Services.

Steps in integrating your app and data about your content into Universal Search.

Note: See Apple TV App Guidelines for User Interactions for help with designing your TV Provider-supported app.

All client app integration steps must be completed on both iOS and tvOS.

Brand Registration

A search brand is a set of VOD services that can be grouped under a single marketing entity. A VOD service identifies a catalog of Video On-Demand content that can be made available to customers who are authorized within your service. If availability varies between countries, multiple VOD services should be used.

  1. Provide a brand name.

  2. Provide the client app’s Apple ID.

  3. Provide a list of participating territories.

  4. Prepare a list of the top 25 TV shows and movies available in the app.

Data Integration

  1. Adopt the UMC Catalog Data Interface Specification (“Catalog Feed”) and the UMC Availability Data Interface Specification (“Availability Feed”). The Catalog Feed includes factual information for the content available in your app (such as Title, Description, Release Date, and Cover Artwork). The Availability Feed describes how (via deep links) and when (via window definitions and restrictions) a user can access content from the Catalog Feed.

  2. Use the provided XSD and macOS Media Feed Validator to validate the structure of your XML. Ensure that your feed contains no XSD errors and no Media Feed Validator “Errors” or “Warnings”. Once achieved, be certain that your Catalog Feed complies with the UMC Standards and Style Guide to ensure your content meets Apple quality standards.

  3. Provide Apple with URLs that can be used to consume your Availability and Catalog feeds per service.

  4. Apple will evaluate the XML structure, content, and metadata quality of your feeds for any issues not found by Media Feed Validator and provide a report categorizing fixes as Must Fix or Should Fix.

    • Once all Must Fix issues have been resolved, Apple will ingest your feed into the Universal Media Catalog in “Isolation Mode”. This mode will simulate mapping to our existing metadata references and will allow us to validate the quality of your metadata. Apple’s Metadata Ops team will analyze the results of this ingestion and will provide a report categorizing any issues found as Must Fix or Should Fix.

  5. Apple will ingest your feed into the Universal Media Catalog in “Mapping Mode”. Once this is complete, Siri will begin Natural Language Processing on your catalog items in preparation for launch. Note that this process takes approximately 3 - 6 weeks.

  6. Implement the UMC Partner Manifest Data Interface to configure catalogs and availability services in the UMC platform. A partner manifest is a collection of configurations for catalogs and availability services for a content provider. The partner manifest data is delivered to Apple’s video content platform through the UMC Data Ingest Service.

Client App Integration

  1. Apple will provision your Apple Developer Team ID to use a managed capability, which will enable your apps to use the Subscription Registration API. This capability will be made available for use when creating Provisioning Profiles from within the Developer Portal. You will need to manually manage profiles for your app within Xcode.

  2. Complete the following client integrations on both tvOS and iOS as described in Apple TV App and Universal Search:

    Subscription Registration: The Subscription Info API informs the Apple TV App if a user is authenticated to your application and what content they are entitled to view.

    Deep Linking: Allows Apple TV app and Universal Search to launch your app for content playback and viewing product pages. When a piece of content was already partially watched, your deep links for playback should must accept any resumeTime parameter in seconds and start the user at the appropriate time in the video. If you would like to track deep links that originate from Apple TV app and Universal Search, be sure to include a unique campaign parameter to the deep links your provide in the feed and parse that value in your URL handler code for tracking.

    Now Playing API: Informs Apple TV app what content a user is watching in your app and the user’s current playback progress. Enables Siri functionality that allows the user to ask questions about content during video playback. For debugging Now Playing, the Now Playing Logger is a drop-in class that can be used to log changes to the Now Playing Info.

    NSUserActivity: Enables Siri functionality that allows a user to ask Siri to “Add this to my Up Next” from within your app.

  3. If content from your service is available via the web, adopt the Adding Subscription Registration to Your Website integration as outlined in Apple TV App and Universal Search.

Testing

  1. Provide TestFlight builds that adopt all features outlined in Apple TV App and Universal Search to Apple. If you do not have the list of Apple recipients, contact your Apple Technical Partner Representative.

  2. Apple will manually validate your app to ensure that Deep Linking, the Now Playing API, and the NSUserActivity API have been implemented correctly and provide a report of required fixes.

  3. Once your feeds and apps have been validated and approved, Apple will enable your brand for Test Mode. Test Mode will allow you to exercise the Apple TV app and Universal Search feature end-to-end only if you have a TestFlight build installed that includes the appropriate integration.

  4. Once end-to-end tests are complete and upon direction by Apple, submit your app to the App Store. Once your iOS and tvOS apps that include Apple TV app and Universal Search integration are available on the App Store, Apple will enable the features for all users.

Enable the APIs for TV App and Universal Search

Before implementing the required APIs for Apple TV App and Universal Search, the following prerequisites must be met:

Adding to Info.plist for the Apple TV App

To indicate that your app is compatible with the Apple TV app, you must add this new key to your app’s Info.plist file. Once you have implemented the Apple TV app into your application, your app will be rejected by App Review if this key is missing.

Key

Type

Value

UISupportsTVApp

Boolean

True

Configuring Your Provisioning Profile

Integrating with the Apple TV App and Universal Search requires an extended entitlement granted to you by Apple. Before proceeding, talk to your technical contact at Apple and ensure that your developer account has been registered as a Universal Search partner. If it has not, send your Developer account Team ID to your Apple contact.

Once your developer account is registered, follow these steps to re-generate your provisioning profile and import it into Xcode.

Note: Many developers depend on Automatic Code Signing. Since the Apple TV App and Universal Search integration requires an extended entitlement, Automatic Code Signing cannot be used.

  1. Log in to the Apple Developer Member Center.

    To log in, visit the Member Center and enter the username and password for an account with Admin privileges. The account must be a member of the developer team that you registered as a Universal Search partner.

  2. Navigate to the provisioning profiles.

    To get to the provisioning profile, go to: Member Center > Certificates, Identifiers & Profiles > Profiles.

  3. Select the appropriate provisioning profile.

  4. Add the entitlement.

    While you are on the page “Review Provisioning Profile,” click the “Edit” button to get to the “Generate a Provisioning Profile” page. Scroll down until you see “Entitlements.” Click the drop down menu and select the available Universal Search option.

  5. Generate the new provisioning profile.

    After you have selected the drop down option for Entitlements, click “Save” to save the changes to the profile with the new entitlement. Once saved, the new profile is ready for download.

Using the New Provisioning Profile

To use the newly created provisioning profile, you must first ensure that any existing version of the provisioning profile is deleted from your build machine. Then, download the new provisioning profile. Once you have the new profile that includes the extended entitlement, you can build and distribute your app.

Provisioning profiles can be deleted by navigating to the following directory in Finder:

~/Library/MobileDevice/Provisioning Profiles/

Troubleshooting Issues with the Profile

If you encounter issues using the profile:

  • Uncheck “Automatically manage signing profiles”

  • Ensure that you have the private key in your keychain (this was generated when creating the certificate which was added to the provisioning profile)

  • Download the provisioning profile and import it into Xcode

  • Ensure that the profile has a matching bundle identifier

  • Double check that:

    • the provisioning profile (distribution) contains the entitlement

    • you have imported the profile from the developer portal after the entitlement was added (if the entitlement was added, but not imported again, the local copy of the profile will not have the entitlement)

Otherwise you may want to delete all of the existing provisioning profiles and then import again from a fresh download from the portal. This way everything is clean and you know for sure you only have the latest version of the profile.

Configuring Application Entitlements

Starting in Xcode 9, entitlements that are being used by a given application also need to be explicitly declared in the project’s local entitlement’s file. Historically, having the entitlement in your provisioning profile was enough, but now it must be declared.

  • 1. In your Xcode project, right-click the project name or a folder (where you want your entitlement’s file to reside) in the project navigator, and select New File

  • 2. Select Properties List as the file type

  • 3. The file can have any name, but typically you could use “Local.entitlements” or “AppName.entitlements”

  • 4. In the new entitlements property file, add any key and value pairs of entitlements that are present in your provisioning profile and are required for your application to function. This may only include the entitlement required for Apple TV App, shown below.

  • 5. In your project’s Build Settings, add the path to your new entitlement’s file under Code Signing Entitlements

Key

Value

com.apple.smoot.subscriptionservice

YES (boolean)

Implement APIs for TV App and Universal Search

Integrating with the Apple TV app and Universal Search requires you to implement the following APIs:

Subscription Registration The Subscription Info API informs the Apple TV App if a user is authenticated to your application and what content they are entitled to view.

Now Playing Info The Now Playing Info is what allows iOS and tvOS to know what is currently playing, and to track playback progress to populate content in the Up Next queue of the Apple TV app. It is also responsible for populating the Now Playing sections of the lock screen and Control Center on iOS, and the HUD on tvOS.

NSUserActivity NSUserActivity is used on asset detail views in your app to inform Siri what piece of content the user is currently viewing. It enables the use of Siri utterances like “Add this to my up next,” which will add the currently viewed content to their Up Next queue in Apple TV app.

Deep Links Universal links or classic deep links allow the Apple TV App to link directly to content and playback within your app. If your app is not installed, it will prompt the user to in-line install.

Subscription Registration

The subscription registration API is provided via the VSSubscriptionRegistrationCenter class in the VideoSubscriberAccount framework. Upon user sign in to your service, your app must register a subscription whose expiration date is Date.distantFuture. In addition, the subscription information should be refreshed on didBecomeActive every time the app is foregrounded.

If your app consists of both free and paid content, the subscription registration API should only be implemented for paid users.

Note: If your deployment target is below 11.0, please reach out to your Apple contact for assistance.

let subscription = VSSubscription()subscription.expirationDate = Date.distantFuturelet registrationCenter = VSSubscriptionRegistrationCenter.default()registrationCenter.setCurrentSubscription(subscription)

When the user signs out, your app must remove the subscription:

let registrationCenter = VSSubscriptionRegistrationCenter.default()registrationCenter.setCurrentSubscription(nil)

Supporting the UMC Availability 3.0 Spec

The UMC Availability 3.0 spec uses the type, availabilityType, to support tiered subscription models. It is your responsibility to update the subscription any time the user entitlements change, such as when the user purchases a new add on, removes an add on, cancels a subscription or signs out of the app.

When registering a subscription with tiers, set the access level, tiers, and billing identifier if applicable.

The billingIdentifier is only used for regional content restrictions, most often in the context of live sports, where some live sporting events are only available to customers in specific regions of the same country. It is generally a hashed zip code.

Note: The tiers and access level values must match the values provided in your availability feed, including casing.

subscription.accessLevel = .paidsubscription.tierIdentifiers = [“Tier1”, “Tier2”]subscription.billingIdentifier = hashedBillingIdentifier

For more information, see the VSSubscription.h header file.

Authentication Context

Subscription information must be provided in your ResponsePayload any time a customer is signed into your TV provider. This lets your customers see their content in the TV App after successfully authenticating without having to launch your app. Use the Subscription class provided in your authentication context to set subscription information.

var responsePayload = new App.ResponsePayload();var subscription = new App.Subscription();

Valid values are 1 and 2:

  • 1 = Free with account

  • 2 = Paid

These must match the value provided in your availability feed.

subscription.accessLevel = 2;

The Bundle ID of your app:

subscription.bundleId = "com.partner.myapp"

The name of your tiers must match the value provided in your availability feed:

subscription.tierIdentifiers = ["Tier1", "Tier2"];responsePayload.subscriptions = [subscription];

TVML

To call the Subscriptions API in TVML, you will need to bridge the API to TVJS. For more information, see JSExport.

Safari

Adopting these changes to your website will make Safari on Mac OS X aware of the user’s subscription to the media service, similarly to the Subscription API integration for iOS and tvOS.

Content providers are expected to include a single meta tag on each web page which will contain the subscription information for the user who is currently logged in. The single tag should contain the following set of attributes:

Key

Required

Type

Description

name

Required

string

Must be apple-media-service-subscription.

content

Required

string

Either a JSON-serialized dictionary, or a list of key-value pairs as described below.

The content field of the meta tag should include these properties:

Key

Required

Type

Description

expires

Required

integer

The number of seconds until the subscription expires. If less than or equal to 0, the subscription is removed immediately.

type

Required

string

A string that indicates what kind of subscription the user has.

The structure for the content field value can either be formatted as a dictionary, serialized into JSON, or as a list of key-value pairs. In the latter case, the keys and values should be associated with an ‘=' and the pairs should be delimited by commas (spaces between pairs are ignored).

Meta-tag examples

<meta name="apple-media-service-subscription" content='{"expires":604800, “type":"subscription"}'><meta name="apple-media-service-subscription" content='expires=604800, type=subscription'>

Now Playing Info

Playback activity data must be gathered and prepared for reporting to the system in order for the Apple TV App to track playback progress for the Up Next queue in the Apple TV App. This is done in two different ways, depending on whether or not you are using AVKit:

  • 1. For AVKit (AVPlayerViewController) on tvOS, populate the metadata array of an AVPlayerItem using instances of AVMetadataItem. AVKit on iOS still requires manual reporting (see 2).

  • 2. For iOS and non-AVKit tvOS, use the MPNowPlayingInfoCenter to manually report playback activity

Currently, web players aren’t supported for TV App integrations.

Note: Configure your AVAudioSession with a AVAudioSession.Category category as playback and without mixWithOthers in your AVAudioSession.CategoryOptions.

Expected Metadata

The metadata expected is different depending on the type of playback. Below is a matrix that identifies which properties should be provided for each type of supported playback. Depending on your app’s platform and AVKit usage, either all or a subset of these properties will need to be provided by you.

Note: Properties that are marked as No must not be included for the given content type.

Property

Type

Description

VOD

EBS**

Live

Duration

Integer

The duration (net time) of the asset in seconds

Yes

No

No

Elapsed Time

Integer

The current playback progress offset in seconds, excluding interstitial content

Yes

No

No

Playback Rate

Float

The rate of playback

0 for paused, 1 for playing

Yes

Yes

Yes

Current Playback Date

Date

The date of the current playback location. Must be set to the value of the AVPlayerItem’s currentDate property. Note that the content being played must have been authored such that its HLS playlist includes the EXT-X-PROGRAM-DATE-TIME tag.

No

Yes

Yes

Content Identifier*

String

The unique identifier for the playing asset

Yes

Yes

No

Service Identifier*

String

The unique service identifier for live streams

No

No

Yes

Is Live Stream

Integer

Indicates if the currently playing asset is live.

0 for false, 1 for true

No

Yes

Yes

Playback Progress

Float

Used to indicate the playback progress of the currently playing asset. 0.0 for no progress, 1.0 for completed to credits start.

Note: if the credit start time is not known, this metadata item must not be provided at all.

Optional

No

No

* The Content Identifier and Service Identifier must match the identifiers provided in the Universal Search availability feed.

** EBS: Event Based Stream

AVKit tvOS Integrations

Implementing Now Playing Info when you are using AVKit (AVPlayerViewController) on tvOS is easy — AVKit has done the bulk of the heavy lifting for you, providing the majority of the metadata properties.

Note: For your AVPlayerViewController, the showsPlaybackControls property must always be true.

You are still responsible for providing the Content Identifier or Service Identifier and Playback Progress (if applicable).

Property

Constant

Service Identifier

AVKitMetadataIdentifierServiceIdentifier

Content Identifier

AVKitMetadataIdentifierExternalContentIdentifier

Playback Progress

AVKitMetadataIdentifierPlaybackProgress

If you intend to provide additional metadata (for example, to populate the HUD), see the AVPlayerItem.h header file for common metadata properties.

Below is an example of adding metadata properties for the VOD content type:

let videoURL = NSURL(string: “https://example.com/video_manifest.m3u8")let playerItem = AVPlayerItem(url: videoURL)let metaTitle = AVMutableMetadataItem()metaTitle.identifier = AVMetadataCommonIdentifierTitlemetaTitle.extendedLanguageTag = "und"metaTitle.value = “Example Title"let metaContentId = AVMutableMetadataItem()metaContentId.extendedLanguageTag = "und"metaContentId.value = “example_content_id”let metaPlaybackProgress = AVMutableMetadataItem()metaPlaybackProgress.extendedLanguageTag = "und"metaPlaybackProgress.value = 0if #available(tvOS 10.1, *) { metaContentId.identifier = AVMetadataIdentifier(AVKitMetadataIdentifierExternalContentIdentifier) metaPlaybackProgress.identifier = AVMetadataIdentifier(AVKitMetadataIdentifierPlaybackProgress)} else { metaContentId.identifier = AVMetadataIdentifier("NPI/_MPNowPlayingInfoPropertyExternalContentIdentifier")}playerItem.externalMetadata = [metaTitle, metaContentId, metaPlaybackProgress]

Once the metadata properties have been added to your AVPlayerItem’s externalMetadata property, AVKit handles updating the Now Playing Info for you.

iOS and non-AVKit tvOS Integration

Implementing Now Playing Info on iOS and on tvOS when you are not using AVKit requires four pieces:

1. Registration of remote commands via MPRemoteCommandCenter In order for iOS and tvOS to recognize the Now Playing Info and to properly support external remotes and accessories (lock screen, Control Center, AirPods, Apple Watch), your app must register for remote commands, and handle the commands appropriately.

2. Disable AVKit Now Playing Info Updates If you are using AVKit on iOS, you must disable AVKit from sending Now Playing Info updates, otherwise it will interfere with your manual updates.

3. Sending Now Playing Info updates on playback start and future playback events The playback activity data provided using the MPNowPlayingInfoCenter class is the key to allowing playback tracking in the Apple TV App. Updated Now Playing Info metadata must be provided on key playback events such as play, pause, and seek. If your content contains interstitial content (e.g. advertisements, bumpers, promos, previews, etc), set the Playback Rate to 0 and do not update the Elapsed Time during interstitial content playback. Once interstitial content playback is complete, resume updating Now Playing Info as applicable for your asset.

4. Unregister for remote commands When your player is torn down, you must unregister for remote commands, otherwise the system will assume that playback is still eligible to be resumed.

Registering for Remote Commands

As noted above, registering for remote commands is required in order for iOS and tvOS to recognize Now Playing Info updates. You must register for at least one remote command, but we recommend registering for as many of the available remote commands as your player, and the respective content type, supports. It is also the mechanism to receive commands such as pause, resume, and seek from the lock screen, Control Center, and external accessories.

let commandCenter = MPRemoteCommandCenter.shared()commandCenter.pauseCommand.isEnabled = truecommandCenter.pauseCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in // pause your player return .success}commandCenter.seekForwardCommand.isEnabled = truecommandCenter.seekForwardCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in // seek forward return .success}commandCenter.seekBackwardCommand.isEnabled = truecommandCenter.seekBackwardCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in // seek backward return .success}

Disable AVKit Now Playing Updates

AVKit on iOS does not allow you to provide the extended metadata properties required by the Apple TV App. Therefore, you must disable AVKit from sending Now Playing Info updates to prevent it from interfering with your manual updates.

self.playerViewController.updatesNowPlayingInfoCenter = false

Send Now Playing Info Updates

Once playback has been initiated, you must update the Now Playing Info with the required metadata properties for the content type.

Note: To aid in development, we strongly recommend using the NowPlayingLogger class during debugging, which allows you to see the same Now Playing Info changes that Apple will see during validation. You can find the NowPlayingLogger class in the Search & Discovery Portal on App Store Connect.

Event

Property Updates

Video Start

MPNowPlayingInfoPropertyExternalContentIdentifier set to the content identifier that matches the identifier provided in the availability feed

MPMediaItemPropertyPlaybackDuration set to the net duration of the content in seconds

MPNowPlayingInfoPropertyPlaybackRate set to 1.0

MPNowPlayingInfoPropertyElapsedPlaybackTime set to the playback offset in seconds

Play

MPNowPlayingInfoPropertyPlaybackRate updated to 1.0

Pause

MPNowPlayingInfoPropertyPlaybackRate updated to 0

MPNowPlayingInfoPropertyElapsedPlaybackTime updated to the playback offset in seconds

Seek

MPNowPlayingInfoPropertyElapsedPlaybackTime updated to the playback offset in seconds

Video completion or player dismissal

nowPlayingInfo dictionary set to nil

Now Playing Info updates should only be sent on the events listed above, and not at an arbitrary interval.

For example, when playback begins for a VOD asset, you might send an initial Now Playing Info update with the content ID:

let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()var nowPlayingInfo = [String: Any]()nowPlayingInfo[MPMediaItemPropertyTitle] = "WWDC 2016"nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = durationInSecondsnowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = elapsedTimeInSecondsnowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 1.0if #available(iOS 10.0, *, tvOS 10.0, *) { nowPlayingInfo[MPNowPlayingInfoPropertyExternalContentIdentifier] = contentId nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackProgress] = 0.0}nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo

When the user pauses the player, you would send another update using the existing dictionary, and updating the values for elapsed time and playback rate:

let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default()var nowPlayingInfo = nowPlayingInfoCenter.nowPlayingInfonowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = elapsedTimeInSecondsnowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 0.0nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo

Unregister for Remote Commands

Once the player is dismissed, you must unregister for the remote commands that were registering before playback started.

commandCenter.pauseCommand.isEnabled = falsecommandCenter.pauseCommand.removeTarget(nil)commandCenter.seekBackwardCommand.isEnabled = falsecommandCenter.seekBackwardCommand.removeTarget(nil)commandCenter.seekForwardCommand.isEnabled = falsecommandCenter.seekForwardCommand.removeTarget(nil)

TVML

Implementing Now Playing Info in TVML apps is just as easy as AVKit:

player.showsResumeMenu = false;var myMediaItem = new MediaItem(‘video’, ‘https://example.com/video_manifest.m3u8’);myMediaItem.title = ‘Example Title’;myMediaItem.externalID = “content_id”; // contentId from availability feedmyMediaItem.metadata = { playbackProgress: 0.0};

Note: the MediaItem.metadata dictionary should only be set if you are setting playbackProgress. See Expected Metadata above for more information

Provide the external Service Identifier and playback progress (if applicable):

Event

Constant

External Service Identifier

externalServiceIdentifier

Playback Progress

playbackProgress

NSUserActivity

NSUserActivity is used on content detail views to enable Siri utterances such as “add this to my Up Next.” This allows users to easily add content to their Up Next queue in the Apple TV App.

If your app does not have a details view for an asset, then NSUserActivity should not be implemented.

Delegate

Action

viewWillAppear

Instantiate NSUserActivity with the respective content ID and invoke becomeCurrent

viewWillDisappear

Invoke invalidate

An NSUserActivity object must remain in memory for the duration of its lifetime, so it’s important to retain a strong reference to the object. Generally, apps set the NSUserActivity object as a property of the details view controller.

In your details view controller’s viewWillAppear delegate:

self.userActivity = NSUserActivity(activityType: "com.developer.app.details")self.userActivity.externalMediaContentIdentifier = "content_id"self.userActivity.becomeCurrent()

In your details view controller’s viewWillDisappear delegate:

self.userActivity.invalidate()

For TV shows, the externalMediaContentIdentifier can be set to the content ID for the series, season, or episode.

TVML

To use NSUserActivity in TVML, you will need to bridge the API to TVJS. For more information, see JSExport.

Deep Links

Implementing deep links allows the Apple TV App to link directly to content details views and playback. There are two methods of implementing deep links on iOS and tvOS:

  1. Universal Links (recommended)

    Universal links allow your app to handle standard HTTP URLs that would traditionally be handled by a browser. This allows you to use the same URLs for your app as you currently do on the web.

    For more information, see the Support Universal Links section of the programming guide.

  2. Custom URL scheme

    Custom URL schemes allow you to register a URL scheme to enable your app to handle URLs.

    For more information, see the Implementing Custom URL Schemes section of the Inter-App Communication section of the programming guide.

Resume Time

When a piece of content was already partially watched, the Apple TV app may invoke your deep link with the resumeTime parameter appended to indicate the time offset at which playback should begin. If the resumeTime query parameter is present, playback must be resumed at this time.

Key

Type

Description

resumeTime

Integer

The offset in seconds in which the playback should resume at.

Validate Your App

Once you have installed and authenticated to your app, you can test its end-to-end integration with the Apple TV app with TestFlight builds if your UMC feeds are live.

Asking for Consent

Users must give consent to connect your app to the Apple TV App when they launch the Apple TV App or initiate content playback from within your app. After authenticating to your app and initiating playback for relevant content, the user should be prompted to connect your app to the Apple TV App.

If this does not work as expected, confirm the following:

  • Your feeds have been approved by Apple.

  • Your app is built with the appropriate Universal Search and Apple TV App entitlements.

  • After authentication, subscription info is written:

    • Expiration date is set to a date in the future.

    • subscriptionInfo is updated on didBecomeActive (this is a warm start).

    • If your app is using Availability 2.0 tiers, those tiers are present and the subscriptionInfo is valid JSON.

Testing Up Next

After watching content in your application, the associated content should appear in your Up Next (unless the content was completed) and the appropriate playback progress is displayed. If this does not work as expected, confirm the following:

  • Content ID is present in Now Playing and is valid (content ID matches ID in the Catalog and Availability feeds)

  • If your app sets the Playback Progress key in Now Playing, the value is set to 1 at credit roll

    • If value is not set to 1 at credit roll, your app should not set the Playback Progress key at all

  • Elapsed Time updated in Now Playing on:

    • Play

    • Pause

    • Seek

  • Playback Rate updated in Now Playing to:

    • 0 on pause

    • 0 during commercials (if applicable)

    • 1 on play

    • 1 after commercials (if applicable)

  • Now Playing Info removed on player dismissal.

Testing NSUserActivity

  • Content ID is present and valid (content ID matches ID in the Catalog and Availability feeds)

  • Contend ID is cleared when playback starts or when the user navigates to another item

    Note: Testing NSUserActivity cannot be tested in Test Mode. It will only work when your app is live.

Testing Deep Links

When launching content from Up Next, Home, or Universal Search, your app should open to the product details page when the OS displays an “Open” button. Your app should also immediately initiate playback when the OS displays a “Play” button. Confirm that these links work on both cold start and warm start.

Test deep linking from Up Next that has been partially watched. This will help you confirm that your app correctly handles deep links with the resumeTime parameter appended. Also verify these on cold and warm start.

Confirm that your app meets Apple TV App Guidelines for User Interactions.

Partner App Regression Tests

Run this set of Apple TV app integration regression tests on both iOS and tvOS before releasing new versions of your Universal Search applications.

You can also utilize NowPlayingLogger in your debug and test builds. This drop-in class is used to log changes to Now Playing Information and provide warnings when issues or inconsistencies are detected. It is helpful when debugging and implementing integrations with Apple TV App and Universal Search, and can be used to facilitate testing in the scenarios below. It must be removed before submitting your App for review.

Important: Complete these tests in the order specified below and let content continue to play between each test.

1. Verify In-line install and Open Deep Link

Note: Test for in-line install only after your app has launched on the Apple TV app, and these new versions have been released to the App Store.

To set up this test:

  1. Ensure you are logged out and not authenticated within your application.

  2. Force close the app. On tvOS, press the Apple TV remote Home button twice and then swipe up on the touch pad. On iOS swipe up from the bottom of the screen and then swipe up on the app.

  3. Uninstall the app.

  4. Open the Apple TV app.

  5. Search for a piece of content in the Apple TV app that is expected to be in your app.

  6. Open the piece of content in your app.

  7. When prompted, install your app.

  8. Sign-in to your app.

After completing these steps, you should expect to see the content playing.

2. Verify Now Playing Info and Subscription Registration Info

Note: Test content that requires an “account” or “subscription.” Free content will not accurately test Subscription Registration Info.

  1. If present, ensure the content plays past promotions and advertisements.

  2. Seek to the midway point of the content.

  3. Exit your video player and application.

  4. Open the Apple TV app.

After completing these steps, you should expect to see the content appearing in first slot of "Up Next," the playback progress bar advanced to the midway point, and your app attributed in the thumbnail.

3. Verify Play Deep Link and Resume Time from an app running in the background

  1. Ensure your app is open in the background and navigate to the Apple TV Home screen.

  2. Open the Apple TV app.

  3. Click the content thumbnail in "Up Next."

After completing this step, you should expect to see your app leading directly to video playback, with the content resuming playback at the appropriate resume time represented by the progress bar indicator within the Apple TV app.

4. Verify Play Deep Link and Resume Time from an app launching

  1. Force close the app by pressing the Apple TV remote Home button twice. Then swipe up on the touch pad.

  2. Open the Apple TV app.

  3. Click the content thumbnail in "Up Next."

After completing this step, you should expect to see your app launch leading directly to video playback, with the content resuming playback at the appropriate resume time represented by the progress bar indicator within the Apple TV app.

Complete tests 2, 3, and 4 with both movies and episodes, and live channels if available. Fix issues accordingly or consult with your Apple TV Technical Representative for support to debug your app’s integration.

UMC Standards and Style Guide 
for Universal Search

About UMC Style

To give the customer a clear idea of what’s available and eliminate the guesswork, provide complete and accurate metadata about your media so Universal Search can quickly find it. Universal Search works in conjunction with the Universal Media Catalog (UMC) services to provide links directly to your media. For more information on the catalog and availability requirements, refer to the UMC Catalog Data Interface Specification and UMC Availability Data Interface Specification sections.

Format your metadata and artwork according to the specifications in this section. Deliver your catalog metadata as far in advance as it is available; receiving your data gives Apple time to integrate it into our systems and provide a seamless experience to our customers.

Important: All metadata should be accurate, should not be placeholder data, and should be provided with the intent of enhancing the customer experience.

Visit Apple Developer for the latest iOS, tvOS, and Xcode downloads.

Guidelines for All Content Types

These guidelines apply to metadata required for content of every type: movies, TV shows, TV seasons, TV episodes, and sporting events. Guidelines on how to capitalize titles per language are also provided since, regardless of content type, uppercase and lowercase in titles differ by language. For artwork guidelines, see Artwork Guidelines for All Content Types.

Guidelines for Metadata Common to All Content

Note: We don’t accept bonus content (e.g. trailers, etc.).

Metadata Guidelines for Titles

The title field holds the content item’s metadata for its title, such as how to treat articles and trademark icons.

1. Title

  • 1.1 Title should be specific to a content item and not proliferated across multiple items.

  • 1.2 Title should not include HTML formatting elements or tags. For example, elements like “<b> </b>” should not be included.

  • 1.3 Title should not be in all capitals, all lowercase, or have random casing; unless that is the specific title. For example, THE PERFECT STORM and ThE MaTrIx are both incorrect.

  • 1.4 Title should not have articles at the end. For example, Rumperbutts, The and Deadly Adoption, A are both incorrect.

  • 1.5 Title should appear in the correct title casing for the language as outlined in section Guidelines for Title Case by Language.

  • 1.6 Main title should be separated from secondary title by a colon. For example:

    Mystery Science Theater 3000: Future War

    Sesame Street: The Best of Elmo

    Bee Gees: One Night Only

  • 1.7 Localized title, specific to each market your content is available in, should be provided.

  • 1.8 Copyright and registered trademark icons should be provided as symbols. For example:

    ™ not TM

    © not (C)

    ® not (R)

Metadata Guidelines for Description

The description field is the place for you to entice viewers to your content. What you write in the description is up to you, but Apple has found that consumers prefer vivid copy describing the content in under 4000 characters (900 - 1200 characters for the optimal customer experience).

2. Description

  • 2.1 Descriptions should be complete and specific to the content item and not proliferated across multiple items.

  • 2.2 Descriptions should not be in all capitals, all lowercase, or in random casing unless that is true to the editorial description of the content.

  • 2.3 Descriptions should be in the same language as the specified locale.

  • 2.4 Descriptions should not contain spoilers.

  • 2.5 Descriptions should not include HTML formatting elements or tags. For example, elements like “<br>” should not be included.

  • 2.6 Mentions of cast and crew members are acceptable, but descriptions should not list the entire cast and crew.

  • 2.7 Descriptions should not contain specific airing information, such as “airs weekly starting on May 30.”

  • 2.8 Descriptions should not contain network airing information. For example, “presented by (Network/Studio Name)” would not be acceptable.

  • 2.9 Descriptions should not contain social media handles or hashtags.

  • 2.10 Descriptions should not contain promotional hooks such as “as seen on TV” or “USA Today’s favorite movie of the year.”

  • 2.11 Descriptions should not be shortened or cut off mid-sentence, ending descriptions in ellipses.

Metadata Guidelines for Duration

3. Duration

  • 3.1 Duration should not include the advertisement runtimes.

  • 3.2 Duration should correspond with the correct version of the content. For example, the extended version should have a duration that matches its length.

Metadata Guidelines for Genre

4. Genre

  • 4.1 Limit Kids & Family genre to content suitable for children.

  • 4.2 Limit Holiday genre to content thematically related the Christmas, Hannukah, and/or Kwanzaa holidays.

  • 4.3 For a complete list of all available genres, see the most recently updated version of the UMC Catalog Data Interface Specification.

Metadata Guidelines for Rating

5. Rating

  • 5.1 Ratings should match the rating system for the territory where the content is available. If the content is available in multiple territories, provide ratings for each in the appropriate rating system.

    Note: For a complete list of all available ratings, see the most recently updated version of the Content Ratings.

  • 5.2 Ratings should represent the correct version. For example, if providing both the unrated and R-rated version of a movie, provide ratings per each to reflect their given ratings.

Guidelines for Title Case by Language

These guidelines apply to the titles of all content types.

Guidelines for English Title Case

English titles should be in title case format and follow these casing conventions.

1. The following words should be lowercase, with a few exceptions:

  • a, an, and, as, but, for, from, nor, of, or, so, the, to, and yet.

  • Prepositions of four letters or fewer (at, by, for, from, in, into, of, off, on, onto, out, over, to, up, and with), except when the word is part of a verb phrase or is used as another part of speech (such as an adverb, adjective, noun, or verb). For example:

    Pirates of the Caribbean: The Curse of the Black Pearl

    From Prada to Nada

    Megan Is Missing

    Escape from the Planet of the Apes

  • These rules also apply for purposely misspelled words. For example:

    Da Best in da West

    Cowgirls n’ Angels

    Pot o’ Gold

2. Exceptions for lowercase words:

  • Always capitalize the first and last word in a title.

  • Capitalize the first and last word in parentheses. For example:

    To Be, or Not to Be

    What They're Looking For

    War (What Is It Good For?)

    (You Make Me Feel Like A) Natural Woman

3. The following words should be uppercase when using title casing:

  • Are, If, Is, It, Than, That, This

Guidelines for Portuguese Title Case

Portuguese titles should follow these casing conventions.

  • 1. Portuguese titles should be in title case format with prepositions, articles, and conjugations in lower case. For example:

    Planeta dos Macacos: A Origem

    Harry Potter e as Relíquias da Morte: Parte 2

    O Filho do Batman

    Água de Mar

Guidelines for Spanish and Latin American Title Case

Spanish and Latin American titles should follow these casing conventions.

  • 1. Spanish and Latin American Spanish titles should be in sentence case format. Note that if the movie title is in English, the title should follow the English rule with title case. For example:

    English title in Spain: Margin Call

    Spanish title in Spain: Como acabar con tu jefe

Guidelines for German Title Case

German titles should follow these casing conventions.

  • 1. German titles should be in sentence case format, and the first letter of every noun should be capitalized. For example:

    Hunde, wollt ihr ewig leben

    Mord mit Aussicht

  • 2. German quotation marks should be in the „Title“ format.

  • 3. You should not use digraphs instead of common German characters, such as Ä ä, Ö ö, Ü ü,and ß. For example:

    Ihre größten Erfolge

    1000 Träume weit

Guidelines for Swedish, Danish, French, Dutch and Italian

Titles for these languages should follow these casing conventions.

  • 1. Swedish, Danish, French, Dutch, and Italian titles should be in sentence case format. For example:

    L’amour dans la rue

    Il mondo che vorrei

    För sent för edelweiss

    Terug naar de kust

  • 2. You should not use digraphs instead of common Danish characters, such as: æ, ø, å.

  • 3. You should not use digraphs instead of common French characters, such as: à, ô, é, ç, œ.

  • 4. French double punctuation signs (“;”, “:”, “?”, and “!”) should be preceded and followed by a space. For example:

    Bridget Jones : L'âge de raison

    Chez nous c'est trois !

    C'est quoi cette famille ?

Metadata Guidelines for Movies

1. Rating

  • 1.1 If no official rating is available, Unrated or Not Rated must be used, if allowed in specific territory. Do not use unrated and not rated interchangeably.

    Unrated applies to content that contains warnings that this version of the film may not be suitable for minors. Unrated content is restricted by all Parental Control settings (such as rated R movies). If the movie has not been rated and contains any content that could be considered explicit, then the rating must be Unrated.

    Not Rated applies to content that has not received an official local rating system (e.g. MPAA, BBFC, etc.) rating but would be suitable for all age groups. Not Rated movies are accessible to all audiences (such as rated G movies). For example, in the U.S., TV shows and old movies that did not go through the MPAA ratings process are Not Rated. Not Rated content is not restricted by Parental Control settings.

  • 1.2 Movies sent with the type “tv_movie” should have corresponding TV ratings.

2. Studio

  • 2.1 Studios should be entered as distinct elements.

3. Release Date

  • 3.1 If a movie was released theatrically, the release date for the territory in which it was first released should be provided. The release year should not be the festival release date or early screening date.

    • 3.1.1 If there is no theatrical release date, the release year should be the physical release date.

    • 3.1.2 If there is no physical release date, the release year should be the digital release date.

  • 3.2 Do not provide dates that content first aired on your service unless this reflects the first time that content was made publicly available.

  • 3.3 If a localized release date is provided, that date should represent the date the movie was theatrically released in the given country.

  • 3.4 The release date should represent the correct version of the movie. For example, if a movie was theatrically released in 2014 but its extended version was released in 2015, the release dates should be represented accordingly.

4. Short Film

  • 4.1 A short or a short-format movie is any motion picture that has a running time of 45 minutes or less.

Metadata Guidelines for TV Shows

1. Description

  • 1.1 The TV show description should not be the description for the latest TV season, but accurate for the entire run of the show.

2. Premiere Date

  • 2.1 The premiere date should not be the date the show was added to your service, unless that is the original airing date for that locale.

    • 2.1.1 The premiere date should not be the date that the show was delivered to Apple.

  • 2.2 If a local premiere date is available, it should represent the date the show aired on television in the specified country.

3. Finale Date

  • 3.1 The finale date should be provided when a show ends.

  • 3.2 If the show is ongoing, the finale date should not be provided.

Metadata Guidelines for TV Seasons

1. Title

  • 1.1 Season title should be descriptive and unique to the season. Otherwise, the title should be Season 1, Season 2, and so forth.

  • 1.2 Season title should not include the show’s title.

Metadata Guidelines for TV Episodes

1. Title

  • 1.1 Episode title should be descriptive and unique to the episode. For example, “Episode 1” is not an acceptable title unless that is the official episode title.

    • 1.1.1 If a title doesn’t exist for an episode, use “Episode #” where # equals a number, such as “Episode 1”, as “Episode 2”, and so forth.

  • 1.2 Episode title should not contain the TV show or TV season title or number.

  • 1.3 Episode title should not include the episode air date. Exceptions to this rule include daily shows, soap operas, and news shows.

  • 1.4 For titles that have both a descriptive title and an episode number, provide only the descriptive title, removing the episode number.

  • 1.5 Multi-part episodes should be labeled accordingly. For example, “Episode 1, Pt. 1" and "Episode 1, Pt. 2” are preferred titles for two-part episodes.

2. Description

  • 2.1 The description should not contain TV season and episode numbers.

  • 2.2 The description should not include general airing or availability information.

  • 2.3 Descriptions should be complete and specific to the content item and not proliferated across multiple items.

3. TV Season and Episode Numbers

  • 3.1 Season numbers should not be the provided as the year of release. For example, a “2016” season number is not acceptable.

  • 3.2 Episode numbers should not include the season number. For example, Season 5, Episode 6 should not be listed as episode number “506”.

  • 3.3 Season and episode numbers should not be placeholder data , such as “0” or “-1”.

  • 3.4 Episode numbers should not be duplicated within the same season.

4. Air Date

  • 4.1 The air date should represent the date the episode first aired in the specified locale.

  • 4.2 The air date should not be the date that the episode was delivered to Apple.

  • 4.3 If the episode never aired on television, the air date should represent the date it was released on its original service.

    • 4.3.1 The air date should not be the date the episode aired on your service, unless the episode was first released on your service.

Metadata Guidelines for Sporting Events

Sporting events are defined as games, matches or competitions, as opposed to non-sporting events which we will not display on the app, for example: talk shows, trophy ceremonies, etc.

Catalog

1. Title

  • 1.1 Due to character limits on the Apple TV app, sporting event titles should be concise.

  • 1.2 If team competitors are not provided (see section 3), please keep the event title within 30 characters when possible.

2. Venue

“Venue” refers to the arena, stadium, court, etc in which the sporting event occurs. Venues are displayed to customers on the product page of each event.

  • 2.1 Venue names should be up-to-date and use the official name of the stadium.

3. Competitors

  • 3.1 Competitors, when known in advance, must be provided for team sports.

  • 3.2 In the case of individual sports, competitor data is not required.

  • 3.3 <isHome> The competitor hosting the event at its home venue should be marked true in isHome field. This is not required for events played at a neutral venue.

4. Sport and League

  • 4.1 Sports and leagues should be consistent. For example, sport = basketball, league = nba

  • 4.2 The “Sport Names and League Abbreviations” dictionary provided by Apple must be used for all sporting events. The dictionary contains most sports, leagues, and championships. Contact your Technical Partner Rep if you provide coverage for an event not listed in the dictionary.

5. Start Time

  • 5.1 Start times correspond to the beginning of the sporting event itself, and should exclude any talk shows before the event.

6. Optional Elements (see Sporting Event Info Schema Definition)

For all optional elements, if no value is provided for the element, the attribute should not be present in the feed.

Availability

1. PrimaryLocale

“primaryLocale” is the expected broadcast language of the channel or sporting event.

  • 1.1 primaryLocale must be provided on the service level if linear, or on each event if EBS.

2. WindowStart

  • 2.1 WindowStart times correspond to the beginning of the sporting event itself, and should exclude any pre-game talk shows before the event.

  • 2.2 If a game is cancelled/rescheduled to a new day, a new catalog item should be provided rather than changing the availability window of the original item. The availability on the original event should be dropped.

3. Updating End Times

  • 3.1 If a sporting event runs longer than the original availability, the availability should be extended.

4. isLive / isBroadcast

isLive must be set to “true” for all events that are happening in real-time. isLive must be set to “false” for all re-air or tape-delay events.

  • 4.1 isLive must be provided for all events on linear. isBroadcast does not need to be provided for linear.

  • 4.2 isLive and isBroadcast must be provided for all EBS events.

UMC Standards and Style Revision History

Date

Version

Notes

04-10-17

1.0

Initial version

07-26-17

1.1

Incorporated Universal Search Content Artwork, Version 1.2

09-13-17

1.2

Changed name of product Apple TV app.

Apple TV App Guidelines for User Interactions

Best practices for user interactions between your app and the Apple TV app to support deep linking are defined for playback, screen loading and page loading on Apple TV.

With the Apple TV app and Universal Search implemented in your TV Provider-supported app, customers can see all the movies, shows, and sports they’re watching, find upcoming episodes, and get recommendations for new things to watch. All without switching between individual apps. Your app supports the Apple TV app and Universal Search by implementing deep linking using the OpenURL call. See Apple TV App and Universal Search for more information on how to implement deep linking in your app.

Playback Behavior

OpenURL call leads to no extraneous views The primary goal of the Apple TV App is to connect people to content within your app as quickly as possible. Therefore, it’s important that there are no extraneous views between the initiation of the OpenURL call and the opening of your app before playback.

OpenURL call causes playback to start immediately When the OpenURL call is made and your app launches or is brought to the foreground, playback should start immediately.

Authentication doesn’t break OpenURL requests When the OpenURL call is made and your app becomes active, it is possible that to fulfill the OpenURL request, the user may need to authenticate with your app. The user should be taken directly to Sign In. Upon successful authentication, the OpenURL call should initiate playback or load a details page.

Resume functionality If your app has bookmarking functionality, there should be no resume dialog presented to the user because this would disrupt the start of immediate playback.

To accomplish this in TVML, set the showsResumeMenu property of the Player to false:

var player = new Player();player.showsResumeMenu = false;

Menu button behavior after exiting playback The behavior of the Menu button includes:

  • From playback, a click of Menu should bring the user to the details page for the content they were watching when they exited.

  • From details, a click of Menu should take the user to the iOS or tvOS home screen, if possible. If the user cannot be taken to the home screen, the user should be taken to your app’s Home landing page.

  • From Home, a click of Menu should take the user to the System and your app should be exited.

Loading Screen Behavior

Loading screen is a single screen Loading screen behavior includes:

  • If your app needs to load resources prior to playback, it is recommended that you present a single loading screen that can contain your brand identification and a loading status indicator.

  • If activity is quantifiable, use a progress bar instead of an activity indicator so the user can better gauge what’s happening and how long it will take.

Loading screen behaviors to avoid These behaviors include:

  • Splash screens with branding prior to initiation of playback

  • Long duration of time loading screens prior to playback

  • Home > Details or other interstitial screens prior to playback

Page Loading Behavior

  • When an OpenURL call is made and your app launches into playback, it’s important to load the proper page view. This is especially true if a user clicks Menu from playback, where they could potentially be taken to the wrong page.

  • The page view that loads after the user click Menu from playback should be relevant to the context of what the user was watching. For instance, if a person is watching an episode of a TV series, the page view that loads after exiting playback should be that TV series’ details page. 

  • If there is no contextually appropriate page to load, your app should default to loading its Home landing page.

Apple TV Live Tune-In for Linear Channels

Integrating your Linear TV Channels with Apple TV Live Tune-In

The Apple TV Live Tune-In feature with Siri Remote allows your supported linear TV channels to get links directly from Siri so your customers can tune in to a linear TV offering from within your video service. Note that your linear channel can only be accessed through Siri remote. To support Apple TV Live Tune-In:

Set Up Deep Links

Your app can communicate with Siri using a custom URL scheme you create and register with Apple’s TVS system.

Using URL Schemes

For background on how to implement custom URL schemes, see the section “Using URL Schemes to Communicate with Apps” in App Programming Guide for iOS.

Note: If you have already set up deep linking when implementing Universal Search, you have completed the deep linking implementation and do not need to do anything extra for linear Live Tune-In support.

However, also note that when referring to the Universal Search document, the Core Spotlight Registration and Now Playing features for Siri integration are not required unless your app is participating in Universal Search.

Using open App delegate

Apps use custom URL schemes to vend services to other apps. By using the openURL App delegate call, your app is able to receive and process these specially formatted URLs.

You must first register the corresponding URL schemes with the system. Once you register a custom URL scheme, your application will be responsible for processing the custom URLs delivered by the system. For example, your app must support receiving and processing custom URLs for showing and playing specific content, such as TV shows and movies.

Registering A Custom URL Scheme

To register a URL type for your app, include the CFBundleURLTypes key in your app’s Info.plist file. The CFBundleURLTypes key contains an array of dictionaries, each of which defines a URL scheme the app supports. The keys and values to include in each dictionary are defined in this table.

CFBundleURLName

A string containing the abstract name of the URL scheme. To ensure uniqueness, it is recommended that you specify a reverse-DNS style of identifier, for example, com.acme.myscheme.

The string you specify is also used as a key in your app’s InfoPlist.strings file. The value of the key is the human-readable scheme name.

CFBundleURLSchemes

An array of strings containing the URL scheme names.

Note: If more than one third-party app registers to handle the same URL scheme, there is currently no process for determining which app will be called.

The contents of a plist showing a URL identifier string and the string in a URL Schemes array.

Responding to App State Changes and System Events

Your app must change its state and properly respond to system events. For more information, see UIApplicationDelegate.

Client Examples

For Swift, use application(_:open:options:). asks the delegate to open a resource specified by a URL and provides a dictionary of launch options.

optional func application(_ app: UIApplication, openURL url: NSURL, options options: [String : AnyObject])

Parameters

Description

app

Your singleton app object.

url

The URL resource to open. This resource can be a network resource or a file.

options

A dictionary of URL handling options.

For TVML, to handle openURL requests in TVML you will need to bridge the open App delegate call to TVJS.

Define Interactions with Siri

On the Apple TV Siri Remote, the system supports specific utterances to trigger the Live Tune-In feature for deep linking into your app. The types of interactions a user could have with Siri are direct request, ambiguous request or uninstalled app.

Direct Request

A direct request is when a user asks to watch a specific channel, such as “Watch ACME West.”

User says: “Watch ACME West” or "Watch the ACME West channel”In this example the user has identified a specific channel associated with an app in our system, so Siri opens directly into that linear channel

User says “Open ACME live” or “Watch ACME live”In this example, although the user has identified the app they want to watch, this may require further disambiguation before opening the link to the app. This can occur when there are several linear offerings and they don’t directly map to the app name used in the utterance.

For example, if there is an East and a West offering, Siri prompts the user to select which linear channel the user wants to tune into. This could also occur when there are multiple channel brands besides East and West (geographies) within a single app.

Ambiguous Request

An ambiguous request is when a user asks to watch a channel or uses an app name that does not match a defined utterance for any app.

User says “Watch ACME”In this example Siri opens the app referred to by the user, but will not attempt to launch the deep link. This utterance is synonymous with “Open ACME” and “Launch ACME.”

If there is a linear offering within the app with the same Channel Brand name as the app name, the user must then navigate within your app to the linear channel to begin watching.

Uninstalled App Behavior

An uninstalled app is when the user’s device does not have the app installed yet.

User says “Watch Acme West”User asks Siri to tune in to a linear channel that is included in the TVS registry, but the app supporting that channel is not installed. Siri presents the user with an Install button that allows the user to install the app from the App Store. Once the app has been installed, the app will be available for future linear Live Tune-In requests.

Define Metadata for Onboarding

You must define a linear channel list containing metadata attributes so Apple’s TVS registration system can lookup and map to the correct linear channel(s) within your app.

Linear Channel List

Your linear channel list must consist of apps and channels as defined below in Linear Live Tune-In Attributes.

In the following example of a channel list, the “Acme Sports” app has two linear channels available, “Acme Sports” and “Acme College Sports.”

App Name

Linear Live Tune-In Channels

Acme

  • Acme News Live

  • Acme Family Channel

Acme Sports

  • Acme Sports

  • Acme College Sports

Linear Live Tune-In Attributes

Use the following attributes of your linear channel list when implementing Live Tune-In. You must provide Apple with the values for all the metadata attributes listed below.

These values are expected in English, but are fully localizable. Work with Apple directly to supply localizations for these fields.

The following metadata attributes will be collected by Apple for each channel.

Attribute

Description

Linear-Live Channel Service Name

Brand name or “call sign” of the linear channel within your app.

Example: ACME News Live

Search Brand ID

Your company’s unique identifier for a Search Brand. You choose this value, but it must be limited to 100 characters.

Example: com.searchBrand.acmeTV

Team Identifier

Unique ID provided to your organization upon enrollment in the Developer Program. The Team Identifier can be found by clicking on your organization name in the upper left of the Developer Portal.

Application Apple ID

Unique ID for the tvOS app that should be launched to play content associated with this Search Brand. 
The Application Apple ID is a numeric value that is associated with the app on the Apple Store.

Linear-Live Channel ID

Your company’s unique ID for a channel. You choose this value, but it must be limited to 100 characters. A Linear-Live Channel ID is associated with a Search Brand ID, but there can be more than one.

Example: com.searchBrand.acmenewslive

Linear-Live Channel URL

URL linking your app to the linear channel.

Example: acme://acmenewslive

Utterance Definitions/Synonyms

Synonyms the system can associate with a channel.

Example: “Watch ACME News” or “Watch ACME News channel”

Available on

tvOS: (Yes/No)

Live Tune-In Guide Revision History

Date

Version

Notes

03-10-2016

1.0

First draft

12-09-2016

1.1

Updated disambiguation information

03-16-2017

1.2

Reformatted