From 5d655d00c760a4d99694794c84d1cfd117e7c327 Mon Sep 17 00:00:00 2001 From: AmrAngry Date: Wed, 30 Oct 2019 01:00:26 +0400 Subject: [PATCH 1/9] Pod migration --- .../GPVideoPlayer.xcodeproj/project.pbxproj | 10 +++++-- .../xcschemes/GPVideoPlayer-Example.xcscheme | 28 ++++++++----------- Example/Pods/Pods.xcodeproj/project.pbxproj | 7 +++-- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/Example/GPVideoPlayer.xcodeproj/project.pbxproj b/Example/GPVideoPlayer.xcodeproj/project.pbxproj index 1738902..8f8f1a9 100644 --- a/Example/GPVideoPlayer.xcodeproj/project.pbxproj +++ b/Example/GPVideoPlayer.xcodeproj/project.pbxproj @@ -210,7 +210,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1110; ORGANIZATIONNAME = CocoaPods; TargetAttributes = { 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; 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 @@ - - - - - - - - Date: Wed, 30 Oct 2019 01:01:55 +0400 Subject: [PATCH 2/9] update example project to swift 5 --- Example/GPVideoPlayer.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Example/GPVideoPlayer.xcodeproj/project.pbxproj b/Example/GPVideoPlayer.xcodeproj/project.pbxproj index 8f8f1a9..439fa30 100644 --- a/Example/GPVideoPlayer.xcodeproj/project.pbxproj +++ b/Example/GPVideoPlayer.xcodeproj/project.pbxproj @@ -215,7 +215,7 @@ TargetAttributes = { 607FACCF1AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0900; + LastSwiftMigration = 1110; }; 607FACE41AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; @@ -499,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; }; @@ -515,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; }; From 3001be671f9156e32d97c9d95d6fed8681670dc4 Mon Sep 17 00:00:00 2001 From: AmrAngry Date: Wed, 30 Oct 2019 01:02:58 +0400 Subject: [PATCH 3/9] update testing project to swift 5 --- Example/GPVideoPlayer.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Example/GPVideoPlayer.xcodeproj/project.pbxproj b/Example/GPVideoPlayer.xcodeproj/project.pbxproj index 439fa30..d774953 100644 --- a/Example/GPVideoPlayer.xcodeproj/project.pbxproj +++ b/Example/GPVideoPlayer.xcodeproj/project.pbxproj @@ -219,7 +219,7 @@ }; 607FACE41AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0900; + LastSwiftMigration = 1110; ProvisioningStyle = Automatic; TestTargetID = 607FACCF1AFB9204008FA782; }; @@ -540,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; @@ -562,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; From 39fe087517daf27880aaa6dd22143fa6375a518f Mon Sep 17 00:00:00 2001 From: AmrAngry Date: Wed, 30 Oct 2019 01:04:31 +0400 Subject: [PATCH 4/9] update Pods project to swift 5 --- Example/Pods/Pods.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index bc78180..7bfba83 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -332,7 +332,7 @@ LastUpgradeCheck = 1110; TargetAttributes = { 0FCBC0ACFB3416D7F20C21471153CC30 = { - LastSwiftMigration = 1010; + LastSwiftMigration = 1110; }; }; }; @@ -715,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"; @@ -749,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 = ""; From afd50079e0e4288959301c452d4b8d42dcb2ff61 Mon Sep 17 00:00:00 2001 From: AmrAngry Date: Wed, 30 Oct 2019 02:32:13 +0400 Subject: [PATCH 5/9] update Pods project to swift 5 --- GPVideoPlayer.podspec | 8 ++++---- README.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) 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/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 From d816698ec905c1dc363ef2827374cd6581ad89e4 Mon Sep 17 00:00:00 2001 From: AmrAngry Date: Wed, 30 Oct 2019 02:32:41 +0400 Subject: [PATCH 6/9] modify exmple --- .../GPVideoPlayer/Base.lproj/Main.storyboard | 31 +++++++--- Example/GPVideoPlayer/ViewController.swift | 56 ++++++++++++++----- 2 files changed, 65 insertions(+), 22 deletions(-) diff --git a/Example/GPVideoPlayer/Base.lproj/Main.storyboard b/Example/GPVideoPlayer/Base.lproj/Main.storyboard index d7c4356..c0e0d49 100644 --- a/Example/GPVideoPlayer/Base.lproj/Main.storyboard +++ b/Example/GPVideoPlayer/Base.lproj/Main.storyboard @@ -1,11 +1,9 @@ - - - - + + - + @@ -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() + } + } From 7dc0b32eb2db51d670a484b1f524f9504a36d922 Mon Sep 17 00:00:00 2001 From: AmrAngry Date: Wed, 30 Oct 2019 02:33:26 +0400 Subject: [PATCH 7/9] formatting --- GPVideoPlayer/Classes/GPVideoPlayer.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/GPVideoPlayer/Classes/GPVideoPlayer.swift b/GPVideoPlayer/Classes/GPVideoPlayer.swift index 23c6fd9..06967f9 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 { @@ -45,6 +47,7 @@ public class GPVideoPlayer: UIView { } //MARK: Lifecycle Methods + override public func layoutSubviews() { super.layoutSubviews() self.playerLayer?.frame = self.videoView.bounds @@ -71,6 +74,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 +160,7 @@ public class GPVideoPlayer: UIView { } // MARK: - Private Methods + private extension GPVideoPlayer { func player(with urls: [URL]) -> AVQueuePlayer? { var playerItems = [AVPlayerItem]() @@ -233,3 +238,4 @@ extension AVPlayerViewController { } } + From 253e6c48d4914bec4c2d02e4e909cb8e0fd78d34 Mon Sep 17 00:00:00 2001 From: AmrAngry Date: Wed, 30 Oct 2019 02:33:58 +0400 Subject: [PATCH 8/9] change access modifier for player --- GPVideoPlayer/Classes/GPVideoPlayer.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/GPVideoPlayer/Classes/GPVideoPlayer.swift b/GPVideoPlayer/Classes/GPVideoPlayer.swift index 06967f9..1b441d9 100644 --- a/GPVideoPlayer/Classes/GPVideoPlayer.swift +++ b/GPVideoPlayer/Classes/GPVideoPlayer.swift @@ -37,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" From d9bc23c364d6196807a679d47b613d99f09bed2f Mon Sep 17 00:00:00 2001 From: AmrAngry Date: Wed, 30 Oct 2019 02:34:39 +0400 Subject: [PATCH 9/9] fix duplicate item add issue --- GPVideoPlayer/Classes/GPVideoPlayer.swift | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/GPVideoPlayer/Classes/GPVideoPlayer.swift b/GPVideoPlayer/Classes/GPVideoPlayer.swift index 1b441d9..e552397 100644 --- a/GPVideoPlayer/Classes/GPVideoPlayer.swift +++ b/GPVideoPlayer/Classes/GPVideoPlayer.swift @@ -221,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 {