diff --git a/examples/react-native-video-plugin-sample/ios/VideoPluginSample.swift b/examples/react-native-video-plugin-sample/ios/VideoPluginSample.swift index 87ade70d..082f307e 100644 --- a/examples/react-native-video-plugin-sample/ios/VideoPluginSample.swift +++ b/examples/react-native-video-plugin-sample/ios/VideoPluginSample.swift @@ -48,7 +48,7 @@ class VideoPluginSample: NSObject, RNVPlugin { * custom functions to be able to track AVPlayer state change */ func handlePlaybackRateChange(player: AVPlayer, change: NSKeyValueObservedChange) { - NSLog("plugin: handlePlaybackRateChange \(change.oldValue)") + NSLog("plugin: handlePlaybackRateChange \(String(describing: change.oldValue))") } func handlePlayerItemStatusChange(playerItem: AVPlayerItem, change _: NSKeyValueObservedChange) { @@ -56,7 +56,7 @@ class VideoPluginSample: NSObject, RNVPlugin { } func handleCurrentItemChange(player: AVPlayer, change: NSKeyValueObservedChange) { - NSLog("plugin: handleCurrentItemChange \(player.currentItem)") + NSLog("plugin: handleCurrentItemChange \(String(describing: player.currentItem))") guard let playerItem = player.currentItem else { _playerItemStatusObserver?.invalidate() return diff --git a/ios/Video/Features/RCTPlayerObserver.swift b/ios/Video/Features/RCTPlayerObserver.swift index 198a51f5..6f73cfb9 100644 --- a/ios/Video/Features/RCTPlayerObserver.swift +++ b/ios/Video/Features/RCTPlayerObserver.swift @@ -234,10 +234,9 @@ class RCTPlayerObserver: NSObject, AVPlayerItemMetadataOutputPushDelegate, AVPla /* Cancels the previously registered time observer. */ func removePlayerTimeObserver() { - if _timeObserver != nil { - player?.removeTimeObserver(_timeObserver) - _timeObserver = nil - } + guard let timeObserver = _timeObserver else { return } + player?.removeTimeObserver(timeObserver) + _timeObserver = nil } func addTimeObserverIfNotSet() { diff --git a/ios/Video/Features/RCTResourceLoaderDelegate.swift b/ios/Video/Features/RCTResourceLoaderDelegate.swift index 3f3eab27..f7ab1031 100644 --- a/ios/Video/Features/RCTResourceLoaderDelegate.swift +++ b/ios/Video/Features/RCTResourceLoaderDelegate.swift @@ -49,7 +49,7 @@ class RCTResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URLSes func setLicenseResult(_ license: String!, _ licenseUrl: String!) { // Check if the loading request exists in _loadingRequests based on licenseUrl guard let loadingRequest = _loadingRequests[licenseUrl] else { - setLicenseResultError("Loading request for licenseUrl \(licenseUrl) not found", licenseUrl) + setLicenseResultError("Loading request for licenseUrl \(String(describing: licenseUrl)) not found", licenseUrl) return } @@ -87,12 +87,12 @@ class RCTResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URLSes _onVideoError?([ "error": [ "code": NSNumber(value: error.code), - "localizedDescription": error.localizedDescription ?? "", + "localizedDescription": error.localizedDescription, "localizedFailureReason": error.localizedFailureReason ?? "", "localizedRecoverySuggestion": error.localizedRecoverySuggestion ?? "", "domain": error.domain, ], - "target": _reactTag, + "target": _reactTag as Any, ]) return false @@ -158,7 +158,7 @@ class RCTResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URLSes "loadedLicenseUrl": loadingRequest.request.url?.absoluteString ?? "", "contentId": contentId ?? "", "spcBase64": spcData.base64EncodedString(options: []), - "target": self._reactTag]) + "target": self._reactTag as Any]) } else { let data = try await RCTVideoDRM.handleInternalGetLicense( loadingRequest: loadingRequest, diff --git a/ios/Video/Features/RCTVideoSave.swift b/ios/Video/Features/RCTVideoSave.swift index e22b5671..cdf1fdf9 100644 --- a/ios/Video/Features/RCTVideoSave.swift +++ b/ios/Video/Features/RCTVideoSave.swift @@ -60,13 +60,11 @@ enum RCTVideoSave { static func ensureDirExists(withPath path: String?) -> Bool { var isDir: ObjCBool = false - var error: Error? let exists = FileManager.default.fileExists(atPath: path ?? "", isDirectory: &isDir) if !(exists && isDir.boolValue) { do { try FileManager.default.createDirectory(atPath: path ?? "", withIntermediateDirectories: true, attributes: nil) - } catch {} - if error != nil { + } catch { return false } } diff --git a/ios/Video/Features/RCTVideoUtils.swift b/ios/Video/Features/RCTVideoUtils.swift index 56b41d93..703b35fb 100644 --- a/ios/Video/Features/RCTVideoUtils.swift +++ b/ios/Video/Features/RCTVideoUtils.swift @@ -179,12 +179,11 @@ enum RCTVideoUtils { title = value as! String } let language: String! = currentOption?.extendedLanguageTag ?? "" - let selectedOpt = player.currentItem?.currentMediaSelection let selectedOption: AVMediaSelectionOption? = player.currentItem?.currentMediaSelection.selectedMediaOption(in: group!) let textTrack = TextTrack([ "index": NSNumber(value: i), "title": title, - "language": language, + "language": language as Any, "selected": currentOption?.displayName == selectedOption?.displayName, ]) textTracks.append(textTrack) @@ -375,8 +374,8 @@ enum RCTVideoUtils { assetOptions.setObject(headers, forKey: "AVURLAssetHTTPHeaderFieldsKey" as NSCopying) } let cookies: [AnyObject]! = HTTPCookieStorage.shared.cookies - assetOptions.setObject(cookies, forKey: AVURLAssetHTTPCookiesKey as NSCopying) - asset = AVURLAsset(url: url!, options: assetOptions as! [String: Any]) + assetOptions.setObject(cookies as Any, forKey: AVURLAssetHTTPCookiesKey as NSCopying) + asset = AVURLAsset(url: url!, options: assetOptions as? [String: Any]) } else { asset = AVURLAsset(url: url!) } @@ -431,14 +430,10 @@ enum RCTVideoUtils { return try? await AVVideoComposition.videoComposition( with: asset, applyingCIFiltersWithHandler: { (request: AVAsynchronousCIImageFilteringRequest) in - if filter == nil { - request.finish(with: request.sourceImage, context: nil) - } else { - let image: CIImage! = request.sourceImage.clampedToExtent() - filter.setValue(image, forKey: kCIInputImageKey) - let output: CIImage! = filter.outputImage?.cropped(to: request.sourceImage.extent) - request.finish(with: output, context: nil) - } + let image: CIImage! = request.sourceImage.clampedToExtent() + filter.setValue(image, forKey: kCIInputImageKey) + let output: CIImage! = filter.outputImage?.cropped(to: request.sourceImage.extent) + request.finish(with: output, context: nil) } ) } else { @@ -446,14 +441,10 @@ enum RCTVideoUtils { return AVVideoComposition( asset: asset, applyingCIFiltersWithHandler: { (request: AVAsynchronousCIImageFilteringRequest) in - if filter == nil { - request.finish(with: request.sourceImage, context: nil) - } else { - let image: CIImage! = request.sourceImage.clampedToExtent() - filter.setValue(image, forKey: kCIInputImageKey) - let output: CIImage! = filter.outputImage?.cropped(to: request.sourceImage.extent) - request.finish(with: output, context: nil) - } + let image: CIImage! = request.sourceImage.clampedToExtent() + filter.setValue(image, forKey: kCIInputImageKey) + let output: CIImage! = filter.outputImage?.cropped(to: request.sourceImage.extent) + request.finish(with: output, context: nil) } ) #endif diff --git a/ios/Video/RCTVideo.swift b/ios/Video/RCTVideo.swift index 11f7b57a..4c971242 100644 --- a/ios/Video/RCTVideo.swift +++ b/ios/Video/RCTVideo.swift @@ -353,7 +353,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH #endif if let video = _player?.currentItem, - video == nil || video.status != AVPlayerItem.Status.readyToPlay { + video.status != AVPlayerItem.Status.readyToPlay { return } @@ -386,7 +386,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH "playableDuration": RCTVideoUtils.calculatePlayableDuration(_player, withSource: _source), "atValue": currentTime?.value ?? .zero, "currentPlaybackTime": NSNumber(value: Double(currentPlaybackTime?.timeIntervalSince1970 ?? 0 * 1000)).int64Value, - "target": reactTag, + "target": reactTag as Any, "seekableDuration": RCTVideoUtils.calculateSeekableDuration(_player), ]) } @@ -418,12 +418,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH // Perform on next run loop, otherwise onVideoLoadStart is nil onVideoLoadStart?([ "src": [ - "uri": _source?.uri ?? NSNull(), + "uri": _source?.uri ?? NSNull() as Any, "type": _source?.type ?? NSNull(), "isNetwork": NSNumber(value: _source?.isNetwork ?? false), ], "drm": source.drm?.json ?? NSNull(), - "target": reactTag, + "target": reactTag as Any, ]) if let uri = source.uri, uri.starts(with: "ph://") { @@ -491,7 +491,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH if _player == nil { _player = AVPlayer() - ReactNativeVideoManager.shared.onInstanceCreated(id: instanceId, player: _player) + ReactNativeVideoManager.shared.onInstanceCreated(id: instanceId, player: _player as Any) _player!.replaceCurrentItem(with: playerItem) @@ -812,7 +812,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH self.setPaused(self._paused) self.onVideoSeek?(["currentTime": NSNumber(value: Float(CMTimeGetSeconds(item.currentTime()))), "seekTime": time, - "target": self.reactTag]) + "target": self.reactTag as Any]) } _pendingSeek = false @@ -910,7 +910,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH func applyModifiers() { if let video = _player?.currentItem, - video == nil || video.status != AVPlayerItem.Status.readyToPlay { + video.status != AVPlayerItem.Status.readyToPlay { return } if _muted { @@ -1009,7 +1009,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH @objc func setFullscreen(_ fullscreen: Bool) { - var alreadyFullscreenPresented = _presentingViewController?.presentedViewController != nil + let alreadyFullscreenPresented = _presentingViewController?.presentedViewController != nil if fullscreen && !_fullscreenPlayerPresented && _player != nil && !alreadyFullscreenPresented { // Ensure player view controller is not null // Controls will be displayed even if it is disabled in configuration @@ -1048,7 +1048,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH self._fullscreenPlayerPresented = fullscreen self._playerViewController?.autorotate = self._fullscreenAutorotate - self.onVideoFullscreenPlayerDidPresent?(["target": self.reactTag]) + self.onVideoFullscreenPlayerDidPresent?(["target": self.reactTag as Any]) }) } } @@ -1312,7 +1312,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH _selectedAudioTrackCriteria = nil _presentingViewController = nil - ReactNativeVideoManager.shared.onInstanceRemoved(id: instanceId, player: _player) + ReactNativeVideoManager.shared.onInstanceRemoved(id: instanceId, player: _player as Any) _player = nil _resouceLoaderDelegate = nil _playerObserver.clearPlayer() @@ -1366,7 +1366,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH _isBuffering = false } onReadyForDisplay?([ - "target": reactTag, + "target": reactTag as Any, ]) } @@ -1385,7 +1385,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH } onTimedMetadata?([ - "target": reactTag, + "target": reactTag as Any, "metadata": metadata, ]) } @@ -1448,7 +1448,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH var orientation = "undefined" let tracks = await RCTVideoAssetsUtils.getTracks(asset: _playerItem.asset, withMediaType: .video) - var presentationSize = _playerItem.presentationSize + let presentationSize = _playerItem.presentationSize if presentationSize.height != 0.0 { width = Float(presentationSize.width) height = Float(presentationSize.height) @@ -1495,14 +1495,14 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH [ "error": [ "code": NSNumber(value: (_playerItem.error! as NSError).code), - "localizedDescription": _playerItem.error?.localizedDescription == nil ? "" : _playerItem.error?.localizedDescription, + "localizedDescription": _playerItem.error?.localizedDescription == nil ? "" : _playerItem.error?.localizedDescription as Any, "localizedFailureReason": ((_playerItem.error! as NSError).localizedFailureReason == nil ? "" : (_playerItem.error! as NSError).localizedFailureReason) ?? "", "localizedRecoverySuggestion": ((_playerItem.error! as NSError).localizedRecoverySuggestion == nil ? "" : (_playerItem.error! as NSError).localizedRecoverySuggestion) ?? "", "domain": (_playerItem.error as! NSError).domain, ], - "target": reactTag, + "target": reactTag as Any, ] ) } @@ -1615,12 +1615,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH [ "error": [ "code": NSNumber(value: (error as NSError).code), - "localizedDescription": error.localizedDescription ?? "", + "localizedDescription": error.localizedDescription, "localizedFailureReason": (error as NSError).localizedFailureReason ?? "", "localizedRecoverySuggestion": (error as NSError).localizedRecoverySuggestion ?? "", "domain": (error as NSError).domain, ], - "target": reactTag, + "target": reactTag as Any, ] ) } @@ -1667,7 +1667,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH guard let lastEvent = accessLog.events.last else { return } if lastEvent.indicatedBitrate != _lastBitrate { _lastBitrate = lastEvent.indicatedBitrate - onVideoBandwidthUpdate?(["bitrate": _lastBitrate, "target": reactTag]) + onVideoBandwidthUpdate?(["bitrate": _lastBitrate, "target": reactTag as Any]) } } diff --git a/ios/Video/RCTVideoPlayerViewControllerDelegate.swift b/ios/Video/RCTVideoPlayerViewControllerDelegate.swift index 2f9fec3f..acce37e4 100644 --- a/ios/Video/RCTVideoPlayerViewControllerDelegate.swift +++ b/ios/Video/RCTVideoPlayerViewControllerDelegate.swift @@ -1,7 +1,7 @@ import AVKit import Foundation -protocol RCTVideoPlayerViewControllerDelegate: class { +protocol RCTVideoPlayerViewControllerDelegate: AnyObject { func videoPlayerViewControllerWillDismiss(playerViewController: AVPlayerViewController) func videoPlayerViewControllerDidDismiss(playerViewController: AVPlayerViewController) }