Native video and audio playback for your Cursor app
An HTML5 video tag works inside the app, but long lessons feel cramped and playback usually stops when the user switches apps. With WebViewGold your Cursor app hands a stream URL to the native player with one link (startnativevideo://), so viewers get fullscreen and Picture-in-Picture on both platforms and AirPlay on iPhone. On iOS you can also keep HTML audio playing in the background for podcasts, radio and audio courses.
From $109 one-time per platform, or let our team do it all from $698.
Approval guarantee – or money back within 14 days
No coding needed
One-time payment, free updates
24/7 human support
Made in Germany since 2014 · ISO 27001
9:41
CCursor
Video and audio playbackNow live in your pocket
App Store · Google Play Approved
What the native player adds
Native player with Picture-in-Picture
Link to startnativevideo://videostreamurl= followed by a direct stream URL and WebViewGold opens the system video player on iOS and Android. Users can shrink the video into a floating window and keep browsing the app, or even switch to another app.
AirPlay and familiar controls
On iPhone and iPad the native player brings AirPlay, fullscreen and the standard playback controls users already know. No custom player library to maintain in the web app.
Background audio on iOS
For podcasts, radio streams, meditations and audio lessons, the HTML background audio setup keeps the web app's audio playing when the iPhone is locked or another app is in front. It is a setting in the Xcode project, shown step by step in the iOS documentation video.
Direct stream URLs only
The native player needs an .mp4 file or an HLS .m3u8 stream, not the URL of a page that embeds a video. Streaming hosts such as Mux, Cloudflare Stream or Bunny Stream give you HLS URLs; YouTube and Vimeo pages stay normal embeds.
Prompt for Cursor
Paste this into Cursor to implement the web-app side. Review the result, publish, then test inside the WebViewGold app.
Prompt for the Cursor agent
Prompt for the Cursor agent: Add native media playback for the WebViewGold wrapper. In lib/native.ts add isWebViewGold() (navigator.userAgent contains my custom token) and playNativeVideo(url), which sets window.location.href to "startnativevideo://videostreamurl=" + url. Create components/MediaPlayer that calls playNativeVideo inside the app and renders a video element with controls and playsinline in browsers, loading hls.js only when the browser cannot play HLS natively. Replace every direct video element for lessons with MediaPlayer. Add a server endpoint that returns a short-lived signed stream URL after checking the user's access. If a URL is not .mp4 or .m3u8, fall back to the embed instead of calling the bridge. Add a .cursor/rules entry describing the bridge and unit tests for the URL check.
About 30 minutes, most of it testing on real phones.
Get a direct stream URL
Use an .mp4 file from your storage or an HLS .m3u8 playlist from your video host. Long lessons stream better as HLS, because the player adapts the quality to the connection.
Make the URL playable on its own
The native player loads the stream itself and may not see the login session of the web view. For paid lessons, create a short-lived signed URL on the server after checking access, and pass that.
Call the bridge inside the app only
Set a custom user agent that contains a token such as WebViewGold (useragent_iphone and useragent_ipad in Config.swift, USER_AGENT in Config.java). When it is present, the Play button navigates to startnativevideo://videostreamurl= plus the stream URL; in a browser, the normal <video> element plays.
Switch on background audio if you need it (iOS)
Only for apps whose audio should keep playing with the screen locked. Follow the HTML background audio video in the iOS docs, then test with the phone locked and with another app in front.
Test like a viewer
Start a video, open Picture-in-Picture, browse to another page, lock the phone, rotate to landscape, and try a slow mobile connection. Do it on an iPhone and on an Android phone.
A play helper for app and browser
One function for both worlds. The signed stream URL comes from the server side of your stack: Your own API routes or services.
javascript
// Custom user agent containing "WebViewGold" set in Config.swift / Config.java
var IN_APP = navigator.userAgent.indexOf("WebViewGold") !== -1;
// streamUrl: direct .mp4 or HLS .m3u8 (signed and short-lived for paid content)
function playVideo(streamUrl, videoEl) {
if (IN_APP) {
window.location.href = "startnativevideo://videostreamurl=" + streamUrl;
} else {
videoEl.src = streamUrl; // HLS outside Safari needs a library such as hls.js
videoEl.play();
}
}
// In the browser keep a normal player:
// <video controls playsinline preload="metadata" poster="/poster.jpg"></video>
Store review and content rules
Apple Guideline 2.5.4: background services are for their intended purpose. Enable background audio only when the app plays audio the user expects to keep hearing (podcast, radio, audio course), and tell the reviewer in the review notes where to find it.
Courses and premium videos sold inside the iOS app are digital content: Apple expects In-App Purchase (Guideline 3.1.1) and Google Play Billing applies on Android. See in-app purchases for vibe-coded apps.
Only stream what you have the rights to. Apps full of third-party films, sports or TV channels get questions about licensing (Guideline 5.2 on intellectual property).
A video catalog alone can look like a website (Guideline 4.2). Native playback with Picture-in-Picture, push reminders for new lessons and a clean offline screen make the case for an app together.
Android: the WebViewGold docs describe the native video player with Picture-in-Picture, not a background audio switch. Test what your audio does when the app is minimized and do not promise lock-screen playback in the Play listing until you have verified it.
Frequently asked questions
Can I play YouTube or Vimeo videos in the native player?
Not through startnativevideo://, which needs a direct .mp4 file or HLS .m3u8 stream. YouTube and Vimeo embeds usually keep working as normal iframes inside the app, with their own player and fullscreen button.
Does Picture-in-Picture work on iOS and Android?
Yes. Both the iOS and the Android documentation describe startnativevideo:// with Picture-in-Picture: the video keeps playing in a floating window while the user browses the app or another app.
Will audio keep playing when the screen is locked?
On iOS, yes, once HTML background audio is enabled in the Xcode project as shown in the iOS docs. On Android, the WebViewGold docs do not describe a background audio mode, so test your player on a device before you promise it.
Do I need In-App Purchase for paid videos in my Cursor app?
If the app itself sells the course or subscription, yes: Apple expects In-App Purchase for digital content (Guideline 3.1.1) and Google expects Play Billing. Content bought on your website can often be unlocked in the app as well; check the current text of Guidelines 3.1.1 and 3.1.3, because the rules on external purchase links differ by region.
Can users download videos to watch offline?
Links ending in .mp4 are handled by the WebViewGold file downloader, which saves the file on the device. A complete offline library inside the Cursor web app is a larger project; for most course apps, streaming plus the native offline screen is enough.
Three ways to get your app into the stores
Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.
Do it yourself
$109 per platform, one-time
The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.
No Mac, no Xcode, no Android Studio: configure in the browser, we build both apps in the cloud and hand them to App Store Connect and the Play Console.
Send us your URL and icon. Our team configures, builds and delivers your app within 72 hours, white-label, with source projects. Both platforms for $1,158.