UitzendingGemist is an unofficial native
Uitzending Gemist and
NPO Live application for the Apple TV 4 developed in Swift. It will allow you to browse and watch all video streams of the Nederlandse Publieke Omroep's (e.g. NPO, the Dutch public broadcaster) Uitzending Gemist website on your Apple TV.
TV Gemist; the project that replaces Uitzending Gemist.NOTICE: Due to the release of the NPO 2.0 website and mobile apps in Spring 2017, the old API this tvOS app relies on was deprecated. As of Januari 2018 the NPO has shut down the deprecated API, which consequently means this tvOS app will cease to work. Please refer to
Watching videos is very snappy and almost instantaneous, contrary to streaming from your iDevice to Apple TV over Airplay or using the built-in player in your smart tv. This is a truly native app contrary to some of the other apps that I have seen which are basically webcontainers using a web app hosted on a remote server.
- Fast native app for Apple TV
- Confirmed to work abroad via Unlocator (disable the secure transport setting in the configuration view)
- Easy to use interface for browsing Programs and Episodes
- Live streaming TV and themed channels
- The possibility to (un)favorite programs
- Remembers watched episodes and will allow you to resume watching
- Will show you new unwatched episodes of favorite programs
- Closed Captioning for the deaf and hearing impaired (in Dutch)
- The ability to watch YouTube videos for Programs that have YouTube Resources
Unfortunately the app cannot be distributed in the AppStore as the NPO does not allow third parties in doing so. However, using a free Apple Developer account you can compile it yourself and install it in your own Apple TV 4 (but also read the note below). While this may sound scary and difficult to non-technical users, it's really not that hard if you follow these steps :)
- an Apple TV 4th or 5th generation (the ones that have an AppStore)
- run tvOS 10 or 11
- a recent Apple Computer running
macOS 10.11.x El Capitan or higher
- a (free) Apple Developer account (signup here)
- a USB-C cable to connect your Apple TV to your Apple Computer
Note: as of summer 2016 Apple has reduced the free Developer account provisioning from 90 days to a mere 7 days, which means when you are using a free Apple Developer Account the application will expire every 7 days after which you need to re-deploy the app (make sure to keep your bundle identifier the same for your favorites to stick). The paid Apple Developer Accounts do not have a time based limitation and deployed apps will continue to work during the lifetime of your subscription.
The (latest) code was developed in Xcode 9(alternative link) so you need at least to have that version installed. Continue with the following steps when you have finished installing
Xcode as the next steps require a finished installation.
2. Download the project
You can either download a zipped distribution (novice) or use Git (advanced).
2.1 Download the zipfile
For novice users it is probably the easiest route to just download the latest zipped version and continue with step 3. After installation to your Apple TV you are safe to delete the downloaded project but keep the Bundle Identifier (see step 5) you used in mind as you will need to use it again when you want to redeploy your app to your Apple TV (in the case of software updates or when your free developer limit (7 days) runs out).
2.2 Using Git
While not required, it is advisable to have a
Developer folder on your machine. Execute the following code in
Terminal to create those folders and clone this project:
mkdir -p ~/Developer/tvOS cd ~/Developer/tvOS git clone https://github.com/4np/UitzendingGemist.git cd UitzendingGemist
If you are not experienced with Git, you can pull new changes using:
cd ~/Developer/tvOS/UitzendingGemist git fetch git pull
3. Open the project
Now that everything is in place, you can open the project file
UitzendingGemist.xcworkspace (and not the
Finder. Alternatively, when you still have
Terminal open you can also execute the following command:
4. Connect the Apple TV 4 to your computer
Apple TV 4 using the USB-C cable to your Mac and perform / click through the following steps in Xcode:
5. Change the Bundle Identifier
The bundle identifier (see 4 in the screenshot above) uniquely identifies your app. As you cannot reuse mine, you need to set your own bundle identifier in reverse domain format (for example: com.yourname.UitzendingGemist). Make sure you remember the name as you will need to enter the same bundle identifier when you want to update or re-deploy the app to your AppleTV.
Note: using a different identifier will make the app deploy next to a previous installation and separate favorites. Keeping the identifier the same will make the favorites continue to work after updates. Also free Apple Developer Accounts have a limit on the number of different identifiers you can create on a weekly basis (10).
6. Select the team
In order to deploy the application to the Apple TV it needs to be signed with your team (see 5 in the screenshot above). If you do not have a team (e.g.
None), or you see the message
No Matching provisioning profiles found click the
Fix Issue and login with your Apple ID / Apple Developer Account credentials.
7. Select the Build Device
On the top left in Xcode click on the device the compiled program will be deployed to (see 6 in the screenshot above). If your Apple TV 4 is properly connected you will be able to pick you Apple TV device (otherwise it will run in the Simulator).
8. Run the application
Finally you are able to compile the program and deploy it onto your Apple TV! Click the play icon (see 7 in the screenshot above). The application will be compiled and deployed on your Apple TV 4. After this the application will remain on the Apple TV.
Note: if you encounter issues or you are unable to play, this is where you should debug what it going on. Observe the Xcode console output while leaving your Apple TV connected. Alternatively you can also run in the simulator (see 6 in the screenshot above) and observe the Xcode console output to debug the issues you are experiencing.
9. Sit back and enjoy :)
You're done! You can disconnect your Apple TV and start watching! :)
If you have set up a firewall to filter outbound network requests, make sure to configure it to allow the following URL patterns you can expect the app to call (also see #18):
- apps-api.uitzendinggemist.nl (the API)
- api.github.com (check for new releases)
- *.omroep.nl (images, videos and live streams)
- googleapis.com (youtube API)
- youtube.com (youtube videos)
- freegeoip.net (determine your country by ip)
Note: as the video and image content URLs come from the APIs, although unlikely, these URLs might change
Application screen with Application Icon and Top Shelf image
By Day Screen
By Program Screen
Live TV Screen
Program with a YouTube channel
Several programs have additional YouTube content available.
Content that is geographically restricted will show a warning then you are outside of The Netherlands. While the play button remains enabled you will most likely be unable to watch the video. If you encounter such warnings and are unable to play the respective videos, you might give Unlocator a try. It has been confirmed to work reliably with the Uitzending Gemist tvOS app when you disable the secure transport setting in the configuration screen (see below).
When using Unlocator outside of The Netherlands, disable the secure transport setting (which is enabled by default).
When closed captioning is enabled in the configuration screen (see above), all content will be subtitled (when available).
Copyright 2016 Jeroen Wesbeek Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.