{"id":18367664,"url":"https://github.com/jwplayer/jwplayer-ios-bestpracticeapps","last_synced_at":"2025-08-20T04:31:45.162Z","repository":{"id":14450523,"uuid":"53980255","full_name":"jwplayer/jwplayer-ios-bestPracticeApps","owner":"jwplayer","description":null,"archived":false,"fork":false,"pushed_at":"2024-12-12T22:41:51.000Z","size":17189,"stargazers_count":37,"open_issues_count":2,"forks_count":24,"subscribers_count":16,"default_branch":"main","last_synced_at":"2024-12-12T23:29:43.963Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jwplayer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-03-15T21:38:12.000Z","updated_at":"2024-12-12T22:41:51.000Z","dependencies_parsed_at":"2023-02-18T08:31:13.015Z","dependency_job_id":"f54a2679-9edd-44ce-be63-151d1c9f5e48","html_url":"https://github.com/jwplayer/jwplayer-ios-bestPracticeApps","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwplayer%2Fjwplayer-ios-bestPracticeApps","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwplayer%2Fjwplayer-ios-bestPracticeApps/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwplayer%2Fjwplayer-ios-bestPracticeApps/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jwplayer%2Fjwplayer-ios-bestPracticeApps/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jwplayer","download_url":"https://codeload.github.com/jwplayer/jwplayer-ios-bestPracticeApps/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230394228,"owners_count":18218707,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-05T23:22:51.356Z","updated_at":"2024-12-19T07:05:59.230Z","avatar_url":"https://github.com/jwplayer.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JWPlayerKit 4.x Best Practice Apps\n\nThis repository contains samples relating to the JWPlayerKit SDK version 4.x for iOS and JWPlayerTVKit SDK version 1.x for tvOS. \n\n## BestPracticeApps\n\nThe BestPracticeApps [workspace](https://developer.apple.com/documentation/xcode/managing-multiple-projects-and-their-dependencies) is composed of several projects (with corresponding targets), each of which runs as a separate application.\n\n|Platform | Project | Description|\n| ------------- | ------------- | ------------- |\n|`iOS`|[Advanced Player](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/AdvancedPlayer) | Advanced implementation of JWPlayerKit SDK with VAST ads. |\n|`iOS`|[Basic Player](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/BasicPlayer) | Simple implementation of JWPlayerKit SDK with a single player item. |\n|`tvOS`|[BasicTVPlayer](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/BasicTVPlayer) | Simple implementation of JWPlayerTVKit SDK with a single player item. |\n|`iOS`|[ChromeCast](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/ChromeCast) | Simple implementation including the ability to cast to ChromeCast devices.[^chromecastDisclaimer]  |\n|`iOS`|[ChromeCast-GCKUICastButton](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/Chromecast-GCKUICastButton) | Simple implementation using the cast button provided by the ChromeCast framework to cast to ChromeCast devices.[^chromecastDisclaimer] |\n|`iOS`|[Custom UI](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/Custom%20UI) | Demonstrates how to create a basic user interface from scratch, using only JWPlayerView. |\n|`iOS`|[DRM Fairplay](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/DRM%20Fairplay#drm-fairplay---best-practices-app)  | Simple implementation of JWPlayerKit SDK that plays protected video content through FairPlay (DRM). |\n|`iOS`|[FeedTableViewController](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/FeedTableViewController)  | Simple implementation of JWPlayerKit SDK that plays videos embedded in a UITableView, with a naive 'infinite scroll' implementation. |\n|`iOS`|[Offline DRM](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/Offline%20DRM#offline-drm---best-practices-app) | Demonstrates how to implement offline playback of protected video content through FairPlay (DRM). |\n|`iOS`|[Offline Playback](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/Offline%20Playback#offline-playback---best-practices-app) | Demonstrates how to implement offline download, storage and playback of unprotected content. |\n|`iOS`|[Google IMA Ads](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/Google%20IMA%20Ads#google-ima-ads---best-practices-app) | Simple implementation of JWPlayerKit SDK with Google IMA. |\n|`iOS`|[Google IMA Companion Ads](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/Google%20IMA%20Companion%20Ads#google-ima-companion-ads---best-practices-app) | Simple implementation of JWPlayerKit SDK with Google IMA Companion Ads. |\n|`iOS`|[Google DAI Ads](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/Google%20DAI%20Ads#google-dai-ads---best-practices-app) | Simple implementation of JWPlayerKit SDK with Google DAI. |\n|`iOS`|[JWPlayer Ads](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/JWPlayer%20Ads#jwplayer-ads---best-practices-app) | Simple implementation of JWPlayerKit SDK with advertising. |\n|`iOS`|[Recommendations](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/Recommendations) | Simple implementation including recommended related content. |\n|`iOS`|[Picture in Picture](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/Picture%20in%20Picture) | Demonstrates how to enable Picture in Picture. |\n|`iOS`|[Captions](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main/JWBestPracticeApps/Captions) | Demonstrates how to handle caption events. |\n\n[^chromecastDisclaimer]: Unlike the other apps in this project which are *working* code examples, this app is a valid code example that nevertheless does **not** work as-is. \nRather, it requires the **dynamic** build of the Google Cast SDK. As Google does not distribute this via CocoaPods, it must be [added manually](https://developers.google.com/cast/docs/ios_sender#manual_setup) to a given project — as we do not include external frameworks in our repositories. Please refer to our [documentation](https://developer.jwplayer.com/jwplayer/docs/ios-enable-casting-to-chromecast-devices) for more information.\n\n## Setup\n\n| :information_source: The project uses [cocoapods](https://guides.cocoapods.org/using/getting-started.html) to manage dependencies. |\n|-|\n\n#### Steps to compile:\n1. Make sure Xcode is closed.\n1. In the Terminal app, navigate to the project's root directory.\n1. To download and integrate the dependencies in the project, run: \n    ```console\n    pod install\n    ```\n1. Open `JWBestPracticeApps-4x.xcworkspace`.\n1. Add your [JWPlayer iOS SDK license key](https://support.jwplayer.com/articles/android-and-ios-sdk-reference#:~:text=HOW%20DO%20I%20GET%20THE%20IOS%20OR%20ANDROID%20SDK%3F%20HOW%20DO%20I%20USE%20THE%20SDKS%3F) to the AppDelegate for the target project:\n    ```swift \n    JWPlayerKitLicense.setLicenseKey(\u003c#Your License Key#\u003e)\n    ```\n    \nNow you can build and run the project.\n\n---\n\n| :warning: Looking for SDK version 3.x?  | \n|-|\n| The demo apps in this repository are intended to be used with **version 4.x** of the JWPlayerKit iOS SDK. \u003cbr\u003e For information on JWPlayer SDK **version 3.x** BestPracticeApps, go to [this link](https://github.com/jwplayer/jwplayer-ios-bestPracticeApps/tree/main-v3/). | \n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjwplayer%2Fjwplayer-ios-bestpracticeapps","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjwplayer%2Fjwplayer-ios-bestpracticeapps","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjwplayer%2Fjwplayer-ios-bestpracticeapps/lists"}