diff --git a/Example/GPVideoPlayer.xcodeproj/project.pbxproj b/Example/GPVideoPlayer.xcodeproj/project.pbxproj index 1738902..d774953 100644 --- a/Example/GPVideoPlayer.xcodeproj/project.pbxproj +++ b/Example/GPVideoPlayer.xcodeproj/project.pbxproj @@ -210,16 +210,16 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1110; ORGANIZATIONNAME = CocoaPods; TargetAttributes = { 607FACCF1AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0900; + LastSwiftMigration = 1110; }; 607FACE41AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0900; + LastSwiftMigration = 1110; ProvisioningStyle = Automatic; TestTargetID = 607FACCF1AFB9204008FA782; }; @@ -227,7 +227,7 @@ }; buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "GPVideoPlayer" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -386,6 +386,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -394,12 +395,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -439,6 +442,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -447,12 +451,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -493,7 +499,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -509,7 +515,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -534,7 +540,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GPVideoPlayer_Example.app/GPVideoPlayer_Example"; }; name = Debug; @@ -556,7 +562,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GPVideoPlayer_Example.app/GPVideoPlayer_Example"; }; name = Release; diff --git a/Example/GPVideoPlayer.xcodeproj/xcshareddata/xcschemes/GPVideoPlayer-Example.xcscheme b/Example/GPVideoPlayer.xcodeproj/xcshareddata/xcschemes/GPVideoPlayer-Example.xcscheme index 3a4121b..9438095 100644 --- a/Example/GPVideoPlayer.xcodeproj/xcshareddata/xcschemes/GPVideoPlayer-Example.xcscheme +++ b/Example/GPVideoPlayer.xcodeproj/xcshareddata/xcschemes/GPVideoPlayer-Example.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES" + codeCoverageEnabled = "YES"> + + + + @@ -54,17 +63,6 @@ - - - - - - - - - - - - + + - + @@ -22,16 +20,29 @@ - - + + + - + + + @@ -42,6 +53,10 @@ + + + + diff --git a/Example/GPVideoPlayer/ViewController.swift b/Example/GPVideoPlayer/ViewController.swift index e88a887..829bf86 100644 --- a/Example/GPVideoPlayer/ViewController.swift +++ b/Example/GPVideoPlayer/ViewController.swift @@ -10,25 +10,53 @@ import UIKit import GPVideoPlayer class ViewController: UIViewController { - @IBOutlet weak var mediaView: UIView! + + @IBOutlet weak var mediaView: UIView? + + private var player: GPVideoPlayer? override func viewDidLoad() { super.viewDidLoad() - if let player = GPVideoPlayer.initialize(with: self.mediaView.bounds) { - player.isToShowPlaybackControls = true - - self.mediaView.addSubview(player) - - let url1 = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")! - let videoFilePath = Bundle.main.path(forResource: "video", ofType: "mp4") - let url2 = URL(fileURLWithPath: videoFilePath!) - - player.loadVideos(with: [url1, url2]) - player.isToShowPlaybackControls = true - player.isMuted = true - player.playVideo() +// if let player = GPVideoPlayer.initialize(with: self.mediaView.bounds) { +// player.isToShowPlaybackControls = true +// +// self.mediaView.addSubview(player) +// +// let url1 = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")! +// let videoFilePath = Bundle.main.path(forResource: "video", ofType: "mp4") +// let url2 = URL(fileURLWithPath: videoFilePath!) +// +// player.loadVideos(with: [url1]) +// player.isToShowPlaybackControls = true +// player.isMuted = true +// player.playVideo() +// } + + //1. Create a URL + let url: String? = "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4" + guard let streamString = url, let streamURL = URL(string: streamString) else { + return } + print(streamURL.absoluteString) + //2. Create PlayerLayer frame + guard let frame = self.mediaView?.bounds else { + return + } + player = GPVideoPlayer.initialize(with: frame) + guard player != nil else { + return + } + self.mediaView?.addSubview(player ?? UIView()) + + player?.isToShowPlaybackControls = true + player?.loadVideos(with: [streamURL]) + player?.isMuted = true } + + @IBAction func mediaPlayButtonPressed(_ sender: Any) { + player?.playVideo() + } + } diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 7ab1738..7bfba83 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -329,19 +329,20 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0930; - LastUpgradeCheck = 0930; + LastUpgradeCheck = 1110; TargetAttributes = { 0FCBC0ACFB3416D7F20C21471153CC30 = { - LastSwiftMigration = 1010; + LastSwiftMigration = 1110; }; }; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; productRefGroup = 991F36D6B7A81759FC3A5488FF0D3B3D /* Products */; @@ -464,6 +465,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -530,6 +532,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -712,7 +715,7 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -746,7 +749,7 @@ SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; diff --git a/GPVideoPlayer.podspec b/GPVideoPlayer.podspec index 343bc5e..12725ea 100644 --- a/GPVideoPlayer.podspec +++ b/GPVideoPlayer.podspec @@ -8,20 +8,20 @@ Pod::Spec.new do |s| s.name = 'GPVideoPlayer' - s.version = '1.0.4' - s.summary = "A video player with custom playback controls" + s.version = '1.0.5' + s.summary = "A video player with custom playback controls" s.description = <<-DESC A video player with custom playback controls DESC s.homepage = 'https://github.com/pgpt10/GPVideoPlayer' s.license = { :type => 'MIT', :file => 'LICENSE' } - s.platform = :ios, "10.0" + s.platform = :ios, "10.0" s.author = { 'pgpt10' => 'p.gpt10@gmail.com' } s.source = { :git => 'https://github.com/pgpt10/GPVideoPlayer.git', :tag => s.version.to_s } s.ios.deployment_target = '10.0' s.source_files = 'GPVideoPlayer/Classes/**/*' s.resources = 'GPVideoPlayer/Assets/*.xcassets' - s.swift_version = "4.2" + s.swift_version = "5.0" end diff --git a/GPVideoPlayer/Classes/GPVideoPlayer.swift b/GPVideoPlayer/Classes/GPVideoPlayer.swift index 23c6fd9..e552397 100644 --- a/GPVideoPlayer/Classes/GPVideoPlayer.swift +++ b/GPVideoPlayer/Classes/GPVideoPlayer.swift @@ -11,6 +11,7 @@ import AVFoundation import AVKit public class GPVideoPlayer: UIView { + //MARK: Outlets @IBOutlet weak var progressBar: UIProgressView! @IBOutlet weak var videoView: UIView! @@ -26,6 +27,7 @@ public class GPVideoPlayer: UIView { self.volumeButton.isSelected = self.isMuted } } + public var isToShowPlaybackControls = true { didSet { if !isToShowPlaybackControls { @@ -35,9 +37,11 @@ public class GPVideoPlayer: UIView { } } + public var player: AVQueuePlayer? + //MARK: Private Properties + private var playerLayer: AVPlayerLayer? - private var player: AVQueuePlayer? private var playerItems: [AVPlayerItem]? private enum Constants { static let nibName = "GPVideoPlayer" @@ -45,6 +49,7 @@ public class GPVideoPlayer: UIView { } //MARK: Lifecycle Methods + override public func layoutSubviews() { super.layoutSubviews() self.playerLayer?.frame = self.videoView.bounds @@ -71,6 +76,7 @@ public class GPVideoPlayer: UIView { } //MARK: Public Methods + public class func initialize(with frame: CGRect) -> GPVideoPlayer? { let bundle = Bundle(for: GPVideoPlayer.self) let view = bundle.loadNibNamed(Constants.nibName, owner: self, options: nil)?.first as? GPVideoPlayer @@ -156,6 +162,7 @@ public class GPVideoPlayer: UIView { } // MARK: - Private Methods + private extension GPVideoPlayer { func player(with urls: [URL]) -> AVQueuePlayer? { var playerItems = [AVPlayerItem]() @@ -214,15 +221,22 @@ private extension GPVideoPlayer { @objc func playerEndedPlaying(_ notification: Notification) { DispatchQueue.main.async {[weak self] in if let playerItem = notification.object as? AVPlayerItem { - self?.player?.remove(playerItem) - playerItem.seek(to: .zero, completionHandler: nil) - self?.player?.insert(playerItem, after: nil) - if playerItem == self?.playerItems?.last { - self?.pauseVideo() - } + //playerItem.seek(to: .zero, completionHandler: ) + playerItem.seek(to: .zero, completionHandler: { complete in + print(complete) + self?.player?.insert(playerItem, after: nil) + if playerItem == self?.playerItems?.last { + self?.pauseVideo() + } + }) + // self?.player?.insert(playerItem, after: nil) + // if playerItem == self?.playerItems?.last { + // self?.pauseVideo() + // } } } } + } extension AVPlayerViewController { @@ -233,3 +247,4 @@ extension AVPlayerViewController { } } + diff --git a/README.md b/README.md index 6f082cb..caaf76d 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@ It is simple and easy to use video player with playback controls written in Swif ## Requirements -- [x] Xcode 10. -- [x] Swift 4.2. +- [x] Xcode 11.1. +- [x] Swift 5.0. - [x] iOS 10 or higher. ## Installation