iOS 3.10 is packed with some great updates! We have exposed HLS #EXT-X-DATERANGE tags that can be used to indicate when there are temporal breaks in a live stream—great for ad stitching. Speaking of advertising, we upgraded and made improvements to our FreeWheel ad client. And those who are looking for more customization, you can now add and remove buttons with custom callbacks in your iOS app.
Release Date: February 6, 2020 (Build 111)
Exposed additional date-range metadata items that might be included in an HLS #EXT-X-DATERANGE tag
Fixed an issue where the playerView disappears when switching to fullscreen mode in projects that are supporting multiple windows
Fixed an issue where serializing specific date-range metadata to JSON would cause a crash
Fixed an issue where players that have the license key entered programmatically crash when their app is upgraded from iOS SDK version 3.8 to a newer version
Release Date: January 30, 2020 (Build 110)
Extended FreeWheel ad support to include versions 6.15.0 - 6.32.0
Added support for playlist-level configuration of FreeWheel where the JWFreewheelConfig can now be nested within an individual JWPlaylistItem. Use case descriptions and a code sample can be found here
Added ability for pauseAd method in JWPlayerController to be called when using the FreeWheel and Google IMA ad clients
Added addButton() and removeButton() API methods allowing developers the ability to add or remove custom player buttons to the player control bar. When new buttons are added via the addButton() API method, they can call back to developers' custom native code
Added getPlaylistItem() and getPlaylist() API methods allowing developers to get the current playlist or playlist item from a player instance
Added date-range metadata type found in JWMetaEventmetadata). The date-range metadata event fires when playback enters the section of an HLS stream tagged with #EXT-X-DATERANGE. Note: #EXT-X-DATERANGE support requires iOS 9.3+
Fixed an issue where default controls are misplaced when the playerView intersects the notch in iPhone X+ devices
Fixed an issue where the player does not recover when a Google IMA exclusion rule is in the ad pre-roll slot
Fixed an issue where tapping the screen while an ad is buffering causes the player UI to stop responding until the ad creative timeout fires and the main content resumes playback
Fixed an issue where calling pause() in onBuffer does not pause the playback
Fixed an issue where some VPAID ad tags return an "invalid XML" error
Implement an improved casting experience in iOS 13 with the latest Google Cast upgrade.
Release Date: November 25, 2019 (Build 108)
Release Date: November 5, 2019 (Build 107)
Upgraded the iOS Google Cast Sender library to version 4.4.5 which provides an improved experience in iOS 13. Apple introduced stricter permissions requirements in iOS 13 that enforces a tighter control for bluetooth access. To accommodate this change there are now two implementation options—guest-mode that includes bluetooth support and non-guest mode which does not have Bluetooth support. When upgrading your app you will need to decide if you want to keep guest mode support or remove guest mode support. More information on how to update your casting implementation can be found here
Fixed an issue where Freewheel VMAP ads served through the JW Player VAST plugin made two ad requests before playing an ad
Fixed an issue where video audio played after the player was released
Fixed an issue that prevented the home screen indicator in iPhone X and above models from fading when in fullscreen
Fixed an issue with multi-threading synchronization
Fixed weak reference usage and removed assertions from network reachability
We have created a new Friendly Ad Obstruction API class that can be used to ensure ad viewability is properly calculated by the Open Measurement SDK when using Google IMA.
Release Date: October 4, 2019 (Build 103)
Added JWFriendlyAdObstructions API class to replace the now deprecated JWExperimentalAPI class that enables the registration of video controls that overlay the media element. Typically, these video controls are considered obstructions and reduce the viewability rate calculated by the Open Measurement SDK. More information on how to use the JWFriendlyAdObstructions API can be found here
Exposed adId method declared in JWAdEvent.h for Google IMA
Improved fullscreen user experience by preventing any noticeable black screens from appearing during the transition to fullscreen
Fixed issue where UIResponder's becomeFirstResponder UI method is not being called on the main thread
Fixed an edge case where an exception occasionally occurs because of a call to NSString’s stringByAppendingString
Fixed an issue where calling play() after stop() results in endless buffering
Fixed an issue where the previous ad frame is loaded for 1 second before the current ad when using Google IMA VMAP
Fixed an issue where when the player is given an empty VAST XML file in Google IMA it causes infinite buffering
Improved the user experience by retaining the paused state after a viewer seeks while paused. Developers who have worked around this in the past by calling pause() on seek no longer need to use the API, but anyone who wishes to resume playback automatically after a seek event now must call play()
Fixed an issue where 608 captions can not be disabled in a playlist item containing side-loaded captions
Fixed an issue where duplicate captions appear for playlist items that contain both side-loaded and in-stream 608 captions
Fixed issue where VMAP ads scheduled with Google IMA in live streams cause the player to infinitely buffer
Release Date: September 5, 2019 (Build 101)
Removed debug assertions from production build in ReachabilityCallback function to avoid uncaught exception
Release Date: August 7, 2019 (Build 100)
Fixes bug where pinch gesture recognizers were ignored in fullscreen. Now custom pinch gesture recognizers supersede our default pinch gesture recognizer which is used for zooming in and out.
Fixed an issue where the onControlBarVisible callback was not firing
Fixed an issue where calling the stop() method would stop the player but did not return it the idle state
Fixed issue where side-loaded captions did not display during offline playback
Release Date: July 15, 2019 (Build 99)
Added side-loaded caption support for offline playback
Exposed nextupOffsetPercentage property which allows the next up overlay to be displayed at a specified percent of the way through the video, rather than at a fixed number of seconds from the beginning or end of the video. When the nextupOffsetPercentage is set, it overrides nextupOffset
Upgraded SDK to use JW Player 8.8.6 Breaking Changes
Annotated Objective-C headers to be Swift friendly. This may require code changes for previous Swift implementations.
Reintroduced the required fetchContentIdentifierForRequest:forEncryption:withCompletion: method in the JWDrmDataSource protocol. This method is required to play DRM encrypted streams.
Fixed an issue where the onControlBarVisible callback was not firing when setting player.controls:true
We have migrated to WKWebView, the latest iOS webkit, which fulfills Apple’s webview requirements. In the process of this migration, we implemented structural changes that have improved overall playback performance as well.
Release Date: May 30, 2019 (Build 93)
Fixed an offline playback issue where only the first playlist item successfully plays in locally stored playlists and all subsequent playlist items fail to play.
Fixed a lockscreen issue where the play/pause buttons in the lockscreen control center flicker for less than 1 second when pressed when the device is locked.
Fixed an issue where sometimes when the device is locked, the elapsed playback time does not display in the lockscreen control center time slider.
During Freewheel ad playback, user cannot use play or pause in lockscreen control center when device is locked.
Upgraded to Google IMA iOS version 3.8.1 which includes IAB’s Open Measurement SDK that enables third-party viewability and verification measurement for ads served to mobile and desktop environments.
Added a new "Experimental API" class that enables the registration of video controls that overlay the media element. Typically, these video controls are considered obstructions and reduce the viewability rate calculated by the Open Measurement SDK. Learn more about Google IMA’s Open Measurement SDK integration and how to register video controls overlay obstructions here.
Fixed an issue where the player fails to initialize with error code 100012 when target name has spaces or special characters.
Release Date: Oct 17, 2018 (Build 73)
Fixed an issue that prevents seek from accepting a negative value during DVR stream playback.
Fixed an issue that shows an incorrect, current position during DVR stream playback.
Release Date: Sep 19, 2018 (Build 72)
Fixed an issue where an echo might be heard when the playback rate is less than 1.
Fixed an issue where player size is not considered when choosing a VAST ad media.
Fixed an issue where UIWebViewbaseUrl creates a URL with a file:// protocol, if relative protocol was used.
Fixed an issue where MPNowPlayingInfoCenter has an empty title if config.title is empty.
Release Date: Sep 13, 2018 (Build 71)
We made the JWPlayerError class public. To be able to use this class in Swift, import this class into the Bridging Header file.
Release Date: Aug 23, 2018 (Build 70)
As another step towards parity between our native SDKs and the web player, we have added the ability to set up custom playback rates for your media. Please refer to the sample in this documentation section.
We are excited to announce JW Player SDK 3.0 for iOS. This release updates the SDK to JW8 and leverages its new UI & UX, optimization, and advertising enhancements to engage your audiences intelligently and monetize your content. In the coming months we will deploy more JW8 features into the JW Player SDKs for iOS & Android, so stay tuned!
Please refer to this important 3.x migration guide for iOS to update your current application from version 2.x to 3.x. This guide includes important information about API changes, new features & callbacks, and will help your team with the transition process.
You may use CocoaPods to update to SDK 3.x, or you can download the SDK 3 packages and new 3.x license keys from the Publish -> Tools section of your JW Player Dashboard. Please note that version 3 of the SDKs are available to our Enterprise edition customers, and require new license keys because 2.x license keys will not work.
Release Date: Jul 25, 2018 (Build 69)
Fixed an issue where ad pods would not be shown on a seek bar if the ad client is FreeWheel
Fixed an issue where playback would not automatically play after pre-roll if the ad client is FreeWheel
Fixed an issue where midrolls would not play if they were set up using percents or timestamp and the ad client is FreeWheel
Release Date: Jul 2, 2018 (Build 63)
Support for new advertising rules, including timeBetweenAds, startOnSeek, frequency, and startOn. Please refer to our Ad Rules Reference for details on how to use them.
Fixed an issue where the app could crash if FreeWheel returned an empty ad tag (undocumented by FreeWheel)
Release Date: June 18, 2018 (Build 50)
We have integrated support for the FreeWheel ad-serving platform. Configure your FreeWheel Ad Manager settings in our new FreeWheel ad client to serve pre-rolls and mid-rolls with other features such as ad-skip and ad-click. Please refer to the new FreeWheel advertising section in our developer guide documentation to get started.
Release Date: May 21, 2018 (Build 49)
Fixed an issue where the onControlBarVisible event would trigger for Ad related controls
Release Date: May 4, 2018 (Build 48)
Fixed an issue where the app would crash if there was a problem with local player related files creation
Upgraded to support Google IMA SDK v3.3.1
Release Date: Apr 16, 2018 (Build 47)
Fixed a VAST issue where content would replay after completion of post-roll
Fixed an issue where skipping a VMAP ad did not proceed to the content
Release Date: Mar 28, 2018 (Build 46)
Fixed an issue where media playback would stop when the app was sent to the background
Fixed an issue where NowPlayingInfo (NPI) Center would not display the media's title & meta data, and NPI controls did not work
Release Date: Mar 20, 2018 (Build 45)
Fixed an HLS in-manifest webVTT captions issue where the list of available tracks was not showing when CC button was selected
Release Date: Feb 27, 2018 (Build 44)
IMPORTANT UPDATE Apple recently tightened their iOS app store submission restrictions. They started to flag the use of non-public APIs and rejecting apps using them - even if these apps were accepted previously without issue. Our team performed a full code audit and this release removes all use of non-public APIs. As a result, we temporarily removed picture-in-picture (PiP) for iPad and background audio support. We will work towards adding these features back in a subsequent release. We strongly recommend all users to update to this version to avoid this issue. If you're upgrading from SDK 2.7.x please refer to the Migration Guide
Release Date: Feb 09, 2018 (Build 43)
Fixed minor bugs
Release Date: Feb 07, 2018 (Build 42)
Fixed an issue where a 'Library not loaded' error message would appear during an Ad Hoc build
Fixed an issue where after a VMAP ad error, the player wouldn't gracefully recover and resume media playback
Release Date: Jan 23, 2018 (Build 41)
Fixed an issue where after a VAST ad error, the player wouldn't gracefully recover and resume media playback
Release Date: Jan 09, 2018 (Build 39)
Fixed an issue where SDKVersion returned an incorrect value
Release Date: Dec 20, 2017 (Build 38)
Fixed an issue where Chromecast and IMA libraries were required to build the app. Reminder: A migration is required from 2.7.x versions, please refer to the Migration Guide.
Release Date: Dec 11, 2017 (Build 36)
JW Player SDK for iOS is now a Dynamic Library and is no longer static. A migration is required from 2.7.x versions, please refer to the Migration Guide. Please note this version contains a known issue: Chromecast and IMA libraries are required to build the app. We recommend version 2.8.1.
Renamed symbol _PLAYABLE_KEY to avoid conflicts with other exposed var / consts / symbols that may have the same name
Fixed an issue where the onControlBarVisible delegate was not called when the player status is "paused"
Fixed an issue where playbackPosition() always reported 0 when called immediately after onSeeked()
Fixed an issue where two playlist items having an identical video file would cause the player to buffer indefinitely on the second item
Release Date: Nov 15, 2017 (Build 34)
All CDN assets, including JS files, are now packaged with the SDK and loaded locally if the CDN is not available
Fixed an issue where the player did not resize correctly in fullscreen/ landscape view for the iPhone X simulator
Fixed an issue in CocoaPods where the player controls would appear after an IMA preroll even if config.controls was set to false
Release Date: Oct 03, 2017 (Build 32)
Fixed all remaining XCode 9 threading warnings
Fixed an issue playing ad tags pointing to media addresses that do not have a URI scheme
Release Date: Sep 19, 2017 (Build 31)
Prevents UIKit instance methods from being called on a background thread when the player is deallocated
Release Date: Sep 15, 2017 (Build 30)
onAdImpression: now includes click-through URL parameter
Upgraded SDK to use JW Player 7.12.6
Release Date: Aug 4, 2017 (Build 29)
Enabled seeking in DVR streams using the JWPlayerController seek: method
Release Date: July 21, 2017 (Build 28)
Added a new onFullscreenRequested() delegate callback to trigger when fullscreen is requested, but before the animation takes place
Upgraded SDK to use JW Player 7.12.1
Fixed an issue where the CC options would not display when replaying a video
Fixed an issue where the first frame of media flashes right before an IMA pre-roll ad played
Fixed an issue where the player would freeze after you seeked past two IMA ads in a video
Release Date: Jun 16, 2017 (Build 27)
Upgraded SDK to use JW Player 7.11.3
Fixed an issue where OnControlbarVisibilityChanged fired when the player was in buffering state and inaccurately reported as true
Release Date: Apr 7, 2017 (Build 26)
New onAdschedule: callback for the VAST ad client that provides detailed information of a VMAP ad schedule.
Upgraded SDK to use JW Player 7.10.4
onAdImpression: now includes VMAP ad schedule details
Fixed an issue where VMAP breakstart/breakend callbacks would not fire when no ad source was present.
Release Date: Mar 24, 2017 (Build 25)
Fixes bug where a file is downloaded on the main thread
Release Date: March 10, 2017 (Build 24)
Fixes bug where the onAdSkipped and onAdMeta delegate methods would not fire
Release Date: Feb 23, 2017 (Build 23)
Added the ability to programmatically setup the JW Player license key in JWPlayerController. Useful for developers who integrate our framework into their own and want to obfuscate the license key from users.
Added bitRateUpperBound property to set the maximum bitrate level during automatic quality switching. Useful in limiting bandwidth consumption for viewers.
Adaptive bitrate switching for HLS streams will now be managed directly by AV Player and will behave like "auto". The HD button in this case will not display and manual quality switching is no longer supported. As a result, this resolves issues regarding multiple audio and caption tracks not behaving correctly for HLS streams and improves overall bitrate switching behavior.
Fixes bug where controlBarIsVisible did not fire during vast ads
Fixes bug where calling load: during a VAST ad does not load the requested file at time 0
Fixes bug where preload would occasionally load the same file twice
Fixes bug where occasionally buffer icon would stay on screen during playback
Supports Google IMA SDK version 3.3.1
Release Date: Feb 17, 2017 (Build 18)
Fixes bug where side loaded webVtt and SRT captions do not display
Release Date: Feb 7, 2017 (Build 17)
Added support for "preload" where media is preloaded after the player is setup but before the play button is pressed. This allows JW Player to fetch media information prior to playback and enhances perceived performance by users.
The "mediafile" string is now returned in the onAdImpression() delegate, which represents the currently playing media item. Also returns a boolean indicating if ad is linear
Release Date: Jan 31, 2017 (Build 16)
Added support for variable rate playback. Dynamically adjust the playback speed of the media to be slower or faster, for both forward and reverse playback.
Enabled pausing and resuming IMA Ad playback with the Player's playback API
Added support from the Google IMA SDK to specify the language to be used to localize ads
Supports Google ChromeCast version 22.214.171.12401
Fixed bug where playlist containing vast pre-rolls would occasionally load next playlist item at the wrong start time
Fixed an out of bounds crash that would intermittently occur when loading a CSS Skin
Release Date: Jan 24, 2017 (Build 15)
Fixed bug where replaying a stream with a vast pre-roll would jump to the end after the ad completed
Fixed IMA crash caused when switching between view controllers
Release Date: Jan 12, 2017 (Build 14)
Fixed firing of VMAP breakstart tracking event
Release Date: Jan 12, 2017 (Build 12)
Fixed bug where HD button would not display
Fixed a crash when a poster image was set that returned a 404 status
Fixed a bug where the onAdImpression delegate method would not get called when playing vast ads that did not contain wrappers
Fixed a bug where the onAdImpression delegate method would incorrectly indicate "preroll" for some VAST ads played using the Google IMA ad client
Fixed a bug preventing ATS compliance
Release Date: Dec. 22, 2016 (Build 11)
Added onControlBarVisible callback that indicates when the player control bar's visibility changes. Sync your custom UI elements to display & hide with the player control bar.
Release Date: Dec. 12, 2016 (Build 9)
Added onAdCompanion() callback for VAST client that returns companion ad data
Upgraded SDKs to use JW Player 7.8
General improvements to SDK player UI
More detailed error messaging to assist debugging
onMeta() now includes bitrate, frame rate, & dropped frames information
Enhanced general fullscreen and rotation UI and behavior
Improved accuracy of state changes when JWPlayerStateChangedNotification is fired
Fixed visual transitions to and from full screen, and on rotations for iPad devices
Fixed an issue that would cause the player to exit fullscreen on a 180 degree rotation
Fixed an issue where calling Load() during an IMA Ad does not dismiss the ad
Fixed an issue where VPAID ads would start in Fullscreen
Fixed a bug where a crash would occur during the deallocation of a JWPlayerController that had been playing ads with the Google IMA client
Fixed a bug where occasionally a crash would occur during changes in Network Connectivity
Release Date: Nov. 22, 2016 (Build 97)
Fixed a bug where some JS and CSS files were downloading on the main thread
Fixed a bug where setting a file and a playlist in the JWConfig would result in the playlist being ignored
Release Date: Nov. 8, 2016 (Build 96)
Fixed a bug where Ads rendered using the Google IMA client would not render on multi-source streams.
Release Date: Oct. 31, 2016 (Build 95)
Fixed a bug where the video would automatically replay after a Google IMA post roll
FIxed a bug where seeking while offline would display the offline poster even though the video would continue playing in the background
Fixed a bug preventing offline playback of local files
Fixed a bug where setting the JWPlayerController pictureInPictureDisabled property to YES would not prevent entering Picture in Picture when exiting the app while in fullscreen
Fixed a bug preventing playback of AES encrypted streams after switching stream qualities
Fixed a bug preventing quality switching when reproducing DVR streams
Fixed a bug preventing AutoStart after calling the JWPlayerController's load: method
Fixed a bug where IMA VMAP post rolls would not replay after replaying the stream
Fixed a bug where occasionally MP4 and MP3 streams would restart after seeking many consecutive times
Compatible with Google IMA SDK version 3.2.1
Release Date: Oct. 3, 2016 (Build 90)
Fixed a bug in iOS 10 where rotating to landscape on a view controller supporting all interface orientations (UIInterfaceOrientationMaskAll) with the player's forceFullScreenOnLandscape property set to True would display an incorrect fullscreen orientation
Release Date: Sep. 22, 2016 (Build 87)
Fixed an issue where uploading to the App Store without the Google IMA or Google Cast SDKs would result in a rejection
Release Date: Sep. 22, 2016 (Build 86)
Fixed an issue where certain enums were not compatible with Swift
Release Date: Sep. 21, 2016 (Build 84)
Fixed an issue where certain HLS streams wouldn't be recognized correctly by the SDK
Fixed an issue in playlists where the HD button would appear even if some items in the playlist did not support multiple qualities
Fixed an issue where the HD button wouldn't appear after 'load:' was called
Fixed an issue where ads with a '#' in the URL would produce an error
Enums are now compatible with Swift
Release Date: Sep. 14, 2016 (Build 83)
Added support for Related Feeds player setup options
Added support for custom HTTP headers for video streams (including signed cookies or tokens) via AVURLAsset Options dictionary
New and updated delegate callbacks (eg. onAdStarted) for parity with HTML5 player
Added a media ID property to JWPlaylistItem to allow developers to specify the JW Media ID for an externally hosted media file in the JW Platform in order to track analytics for that video
Compatible with iOS 10
Improved onTime to ping every 100 ms
Poster image for lock screen is now fetched on the background thread
The player now detects the "Video Override" option from the users's "General -> Accessibiity -> Subtitles & Captioning -> Style" settings to determine whether to have the video settings override the user's accessibility settings
Fixed an issue where setting an adBreak tag with setter instead of using AdBreak's initWithTag custom initializer caused a crash
Fixed an issue where toggling displayLockScreenControls did not update correctly
Fixed an issue for multiple IMA midrolls where if one midroll should fail and return an ad error, the next scheduled midroll would erroneously play out of turn instead of resuming media playback
Fixed an issue where playlists with IMA or VAST ads would erroneously display "Live Stream" in the status bar after ending
Fixed an issue where captions from the media were displayed during ad playback
Release Date: Dec. 01, 2015 (Build 33)
Fixed an issue where the rotation observer wasn't properly updated if multiple players were created, resulting in a crash
Release Date: Nov. 17, 2015 (Build 32)
Updated to JW Player 7
CSS Skinning Model
DPI-responsive player UI with mobile optimization
Devices with a smaller viewing area will now see a more mobile-friendly control bar UI. Font size has been increased and secondary control bar elements have been relocated to an overflow menu
New API Calls
Dynamically load media sources within existing player for playlists or videos
Supports accessibility styling for both 608 captions and in-line captions
Supports custom styling for in-line captions
Fixed bug that prevented full screen on rotation when player view is added to a view that is not the root view of the presented view controller
Fixed bug where MP3 & MP4 media loaded slower than expected
Fixed bug where the player would crash the app when opened for the first time while offline
Playlist icon does not display on the control bar on some phones
Ad Message will occasionally span 2 lines on some phones
For Google IMA prerolls, sometimes the media will appear briefly before the preroll begins
Calling playAd after a VMAP has been loaded using Google IMA will cause the completed ads to replay when the requested ad finishes reproducing
When reproducing a stream containing multiple qualities, if the viewer switches from a quality that contains embedded captions (608 captions or in-line captions) to a quality that does not contain embedded captions, the Closed Caption button might not be removed from the control bar. Toggling the Closed Caption button will have no effect
Occasionally toggling play/pause on lock screen will cause playback information to briefly disappear and then reappear