Why an IPTV Stream Won't Play on iPhone, and How to Fix It
A channel that plays on Android but not on iPhone is usually a raw .ts stream. Why Apple's player wants HLS, and how to get .m3u8 links from the same account.
The same playlist works on an Android phone and in VLC, but on an iPhone or iPad the channel shows a black screen, spins forever, or fails with an error. When that happens, the account is usually fine. The difference is the kind of address each channel uses: Apple’s video player is built around HLS (.m3u8), and many playlists point to raw MPEG-TS streams (.ts) instead. The fix is usually to ask the same account for HLS addresses, which most providers can do without changing anything else.
Key Takeaways
- Apps on iPhone and iPad play video through Apple’s player, which is built for HLS. Raw
.tsstream addresses that VLC and Android play often fail there.- HLS can carry the same MPEG-TS video in short segments, so asking for HLS doesn’t mean lower quality.
- With an Xtream Codes login, ask for
output=m3u8. With an M3U link, ask your provider for the HLS or m3u8 version.- Plain
httpstreams are blocked on Apple devices unless the app is built to allow them, so the player matters too.
Why the same link plays on Android but not on iPhone
Android apps commonly play video with ExoPlayer, Google’s media library. Its supported formats page lists MPEG-TS twice: as a progressive container it plays directly, and as a segment format inside HLS. So on Android, a channel address ending in .ts and one ending in .m3u8 both work.
On Apple devices, video apps play through Apple’s AVFoundation framework. HTTP Live Streaming (HLS) is Apple’s own streaming protocol. What it handles well is an HLS playlist. A continuous raw transport stream served over plain HTTP is a different thing, and it often doesn’t start.
We see this directly in our own player. Its iPhone build plays through AVPlayer, Apple’s player. A channel requested as a raw .ts address doesn’t play there, while the same channel from the same server, requested as .m3u8, plays normally. That’s why it always asks Xtream Codes servers for HLS addresses. Developers report the same thing on Apple’s forums, for example a stream that showed the player controls but no video in AVPlayer, while “only VLC seems to accept this stream” (Apple Developer Forums, 2022).
This isn’t about the video inside. RFC 8216, the HLS specification, allows segments in MPEG-2 Transport Stream format (section 3.2). An HLS stream can carry exactly the same TS video, cut into short segments and listed in an .m3u8 playlist, and then it plays on an iPhone.
How to tell which kind of address you have
Look at the end of the channel addresses in your playlist, or at the output value in your playlist link:
| The address ends in, or the link says | Kind of stream | On iPhone and iPad |
|---|---|---|
.m3u8, or output=m3u8 |
HLS | Plays |
.ts, or output=ts |
Raw MPEG-TS | Often fails |
No extension, such as .../live/user/pass/101 |
Decided by the server | Try it; if it fails, ask for HLS |
If you have the playlist as a file, open it in a text editor: each channel’s address is on the line after its name. Our guide to M3U and M3U8 shows the layout.
Fix 1: With an Xtream Codes login, ask for m3u8
An Xtream Codes login (server, username, password) can produce either kind of address. Players that support the format choose the output when they request your list. If you build the playlist link yourself, put m3u8 at the end:
http://provider.example:8080/get.php?username=USER&password=PASS&type=m3u_plus&output=m3u8
Your account, channels and expiry stay exactly the same; only the addresses change. Xtream Codes logins explained covers the other parts of that link.
Fix 2: With an M3U link, get the HLS version
If your M3U link contains output=ts, change it to output=m3u8 and add it again. If the link looks different, ask your provider for the HLS or m3u8 version of your playlist. Panels often name it HLS in the format options.
Then remove the old playlist from the app and add the new one, so the app doesn’t keep the old addresses.
Fix 3: Make sure plain http streams are allowed
Apple devices have a second rule that catches IPTV streams. App Transport Security, on by default for apps built with the iOS 9 SDK or later, “requires that all HTTP connections” made through Apple’s URL loading system “use HTTPS” (Apple Developer Documentation, NSAppTransportSecurity). Apps can declare exceptions, such as NSAllowsArbitraryLoads for all connections or NSAllowsArbitraryLoadsForMedia for media.
Many IPTV servers only serve plain http. A player that doesn’t declare one of those exceptions can’t load them, whatever the format. This isn’t a setting you can change on the phone. If every channel fails on an iPhone, including .m3u8 ones, try a player built for IPTV streams, which allows http.
Other reasons a channel fails on iPhone
If the address is HLS and the player allows http, check these:
- The stream is down. Try the same channel in your provider’s own app or on another device. If it fails there too, the problem is at the source.
- The account is busy. If your account allows one connection and another device is playing, the server may refuse the iPhone. Our buffering and freezing checklist shows how to test this.
- The video format inside. A stream encoded in a format the device can’t decode won’t play on it, even as HLS. If one channel fails while others from the same provider play, ask the provider about that channel.
The short version
When a channel plays on Android but not on iPhone, look at the address before anything else. A .ts address needs to become .m3u8: change output=ts to output=m3u8, or ask your provider for the HLS version. If nothing plays at all, the app has to allow plain http. If you are setting up a TV next, our guide to adding an M3U playlist on Android TV and Google TV covers it.
Written by the team that builds Kibo Player. We fact-checked every linked source on 10 November 2026. If something here has changed, tell us, and you can read more about us.



