diff --git a/Veloria/AppDelegate/AppDelegate+Thirdparty.swift b/Veloria/AppDelegate/AppDelegate+Thirdparty.swift index 8696155..ab69f80 100644 --- a/Veloria/AppDelegate/AppDelegate+Thirdparty.swift +++ b/Veloria/AppDelegate/AppDelegate+Thirdparty.swift @@ -14,6 +14,7 @@ extension AppDelegate { //facebook ApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) - + ///设置刷新控件的语言 + MJRefreshConfig.default.languageCode = VPLocalizedManager.shared.mjLocalizedKey } } diff --git a/Veloria/Class/Explore/Controller/VPExploreViewController.swift b/Veloria/Class/Explore/Controller/VPExploreViewController.swift index 2997f8c..eff00f3 100644 --- a/Veloria/Class/Explore/Controller/VPExploreViewController.swift +++ b/Veloria/Class/Explore/Controller/VPExploreViewController.swift @@ -15,9 +15,14 @@ class VPExploreViewController: VPVideoPlayerViewController { var pagination: VPListPaginationModel? + deinit { + NotificationCenter.default.removeObserver(self) + } override func viewDidLoad() { super.viewDidLoad() + NotificationCenter.default.addObserver(self, selector: #selector(loginStateDidChangeNotification), name: VPLoginManager.loginStateDidChangeNotification, object: nil) + self.delegate = self self.dataSource = self @@ -30,6 +35,9 @@ class VPExploreViewController: VPVideoPlayerViewController { self.navigationController?.setNavigationBarHidden(true, animated: true) } + @objc private func loginStateDidChangeNotification() { + requestDataArr(page: 1) + } } @@ -39,7 +47,7 @@ extension VPExploreViewController: VPPlayerListViewControllerDelegate { guard let pagination = self.pagination else { return } guard let page = self.pagination?.current_page else { return } let pageSize = pagination.page_size ?? 0 - if pagination.page_total ?? 0 <= pageSize * page { + if pagination.total_size ?? 0 <= pageSize * page { return } self.requestDataArr(page: page + 1) diff --git a/Veloria/Class/MyList/Controller/VPCollectListViewController.swift b/Veloria/Class/MyList/Controller/VPCollectListViewController.swift index ba1e8aa..e6abda3 100644 --- a/Veloria/Class/MyList/Controller/VPCollectListViewController.swift +++ b/Veloria/Class/MyList/Controller/VPCollectListViewController.swift @@ -125,6 +125,7 @@ class VPCollectListViewController: VPViewController { override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(updateShortCollectStateNotification), name: VPVideoAPI.updateShortCollectStateNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(loginStateDidChangeNotification), name: VPLoginManager.loginStateDidChangeNotification, object: nil) self.bgImageView.isHidden = true self.view.backgroundColor = .clear @@ -241,6 +242,11 @@ extension VPCollectListViewController { updateNode += 1 } } + + @objc private func loginStateDidChangeNotification() { + requestDataArr(page: 1, completer: nil) + + } } extension VPCollectListViewController { diff --git a/Veloria/Class/MyList/Controller/VPWatchHistoryViewController.swift b/Veloria/Class/MyList/Controller/VPWatchHistoryViewController.swift index 5688b37..1a0b166 100644 --- a/Veloria/Class/MyList/Controller/VPWatchHistoryViewController.swift +++ b/Veloria/Class/MyList/Controller/VPWatchHistoryViewController.swift @@ -30,10 +30,15 @@ class VPWatchHistoryViewController: VPViewController { tableView.register(VPWatchHistoryCell.self, forCellReuseIdentifier: "cell") return tableView }() + + deinit { + NotificationCenter.default.removeObserver(self) + } override func viewDidLoad() { super.viewDidLoad() - + NotificationCenter.default.addObserver(self, selector: #selector(loginStateDidChangeNotification), name: VPLoginManager.loginStateDidChangeNotification, object: nil) + self.bgImageView.isHidden = true self.view.backgroundColor = .clear @@ -57,6 +62,12 @@ class VPWatchHistoryViewController: VPViewController { } +extension VPWatchHistoryViewController { + @objc private func loginStateDidChangeNotification() { + requestDataArr(page: 1, completer: nil) + } +} + extension VPWatchHistoryViewController { private func vp_setupUI() { diff --git a/Veloria/Class/Player/Controller/VPDetailPlayerViewController.swift b/Veloria/Class/Player/Controller/VPDetailPlayerViewController.swift index c2513ef..670f749 100644 --- a/Veloria/Class/Player/Controller/VPDetailPlayerViewController.swift +++ b/Veloria/Class/Player/Controller/VPDetailPlayerViewController.swift @@ -68,8 +68,10 @@ class VPDetailPlayerViewController: VPVideoPlayerViewController { if videoInfo.is_lock == true { self.pause() - self.onRecharge() - + let myCoin = VPLoginManager.manager.userInfo?.totalCoin ?? 0 + if myCoin < (videoInfo.coins ?? 0), self.viewModel.currentPlayer?.hasLastEpisodeUnlocked != true { + self.onRecharge() + } return } @@ -194,6 +196,13 @@ extension VPDetailPlayerViewController: VPPlayerListViewControllerDataSource { cell.videoInfo = detailModel?.episodeList?[indexPath.row] cell.isLoop = false + let upRow = indexPath.row - 1 + if upRow >= 0, let videoInfo = detailModel?.episodeList?[upRow], videoInfo.is_lock == true { + cell.hasLastEpisodeUnlocked = true + } else { + cell.hasLastEpisodeUnlocked = false + } + return cell } diff --git a/Veloria/Class/Player/Controller/VPVideoPlayerViewController.swift b/Veloria/Class/Player/Controller/VPVideoPlayerViewController.swift index f19084f..4ec2844 100644 --- a/Veloria/Class/Player/Controller/VPVideoPlayerViewController.swift +++ b/Veloria/Class/Player/Controller/VPVideoPlayerViewController.swift @@ -142,7 +142,16 @@ class VPVideoPlayerViewController: VPViewController { self.viewModel.currentPlayer?.pause() } + func clearDataArr() { + self.dataArr.removeAll() + self.viewModel.currentPlayer = nil + self.currentIndexPath = .init(row: 0, section: 0) + self.collectionView.contentOffset = .init(x: 0, y: 0) + self.collectionView.reloadData() + } + func setDataArr(dataArr: [Any], completer: (() -> Void)?) { + self.clearDataArr() self.dataArr = dataArr reloadData(completion: completer) } diff --git a/Veloria/Class/Player/Model/VPPlayerProtocol.swift b/Veloria/Class/Player/Model/VPPlayerProtocol.swift index c558f89..602aea4 100644 --- a/Veloria/Class/Player/Model/VPPlayerProtocol.swift +++ b/Veloria/Class/Player/Model/VPPlayerProtocol.swift @@ -18,7 +18,7 @@ import UIKit var isCurrent: Bool { get set } ///上一集是否加锁 - @objc optional var hasLockUpEpisode: Bool { get set } + @objc optional var hasLastEpisodeUnlocked: Bool { get set } ///总进度 var duration: Int { get } diff --git a/Veloria/Class/Player/View/VPDetailPlayerCell.swift b/Veloria/Class/Player/View/VPDetailPlayerCell.swift index a632c92..5f5ce6b 100644 --- a/Veloria/Class/Player/View/VPDetailPlayerCell.swift +++ b/Veloria/Class/Player/View/VPDetailPlayerCell.swift @@ -13,4 +13,10 @@ class VPDetailPlayerCell: VPVideoPlayerCell { return VPDetailPlayerControlView.self } + override var hasLastEpisodeUnlocked: Bool { + didSet { + guard let controlView = self.controlView as? VPDetailPlayerControlView else { return } + controlView.hasLastEpisodeUnlocked = hasLastEpisodeUnlocked + } + } } diff --git a/Veloria/Class/Player/View/VPDetailPlayerControlView.swift b/Veloria/Class/Player/View/VPDetailPlayerControlView.swift index 87b32ef..9e895c9 100644 --- a/Veloria/Class/Player/View/VPDetailPlayerControlView.swift +++ b/Veloria/Class/Player/View/VPDetailPlayerControlView.swift @@ -17,6 +17,12 @@ class VPDetailPlayerControlView: VPVideoPlayerControlView { } } + var hasLastEpisodeUnlocked = false { + didSet { + self.lockView.hasLastEpisodeUnlocked = hasLastEpisodeUnlocked + } + } + override var videoInfo: VPVideoInfoModel? { didSet { diff --git a/Veloria/Class/Player/View/VPVideoLockView.swift b/Veloria/Class/Player/View/VPVideoLockView.swift index 1342732..ff72133 100644 --- a/Veloria/Class/Player/View/VPVideoLockView.swift +++ b/Veloria/Class/Player/View/VPVideoLockView.swift @@ -15,6 +15,12 @@ class VPVideoLockView: UIView { } } + var hasLastEpisodeUnlocked = false { + didSet { + unlockButton.setNeedsUpdateConfiguration() + } + } + var clickUnlockButton: (() -> Void)? private lazy var unlockButton: UIButton = { @@ -33,7 +39,12 @@ class VPVideoLockView: UIView { button.layer.masksToBounds = true button.configurationUpdateHandler = { [weak self] button in guard let self = self else { return } - let title = String(format: "Unlocking costs %@ coins".localized, "\(videoInfo?.coins ?? 0)") + let title: String + if hasLastEpisodeUnlocked { + title = "kVideoLockTipText".localized + } else { + title = String(format: "Unlocking costs %@ coins".localized, "\(videoInfo?.coins ?? 0)") + } let string = AttributedString.createAttributedString(string: title, color: .colorFFFFFF(), font: .fontRegular(ofSize: 14)) button.configuration?.attributedTitle = string } @@ -68,7 +79,11 @@ class VPVideoLockView: UIView { } @objc private func handleUnlockButton() { - self.clickUnlockButton?() + if hasLastEpisodeUnlocked { + VPToast.show(text: "kUnlockVideoErrorToast01".localized) + } else { + self.clickUnlockButton?() + } } @objc private func userInfoUpdateNotification() { diff --git a/Veloria/Class/Player/View/VPVideoPlayerCell.swift b/Veloria/Class/Player/View/VPVideoPlayerCell.swift index 0b5916c..cffeb80 100644 --- a/Veloria/Class/Player/View/VPVideoPlayerCell.swift +++ b/Veloria/Class/Player/View/VPVideoPlayerCell.swift @@ -65,7 +65,7 @@ class VPVideoPlayerCell: VPCollectionViewCell, VPPlayerProtocol { return imageView }() - private lazy var controlView: VPVideoPlayerControlView = { + private(set) lazy var controlView: VPVideoPlayerControlView = { let view = ControlViewClass.init() view.panProgressFinishBlock = { [weak self] progress in guard let self = self else { return } @@ -102,6 +102,8 @@ class VPVideoPlayerCell: VPCollectionViewCell, VPPlayerProtocol { } } + var hasLastEpisodeUnlocked: Bool = false + var duration: Int { get { return player.duration diff --git a/Veloria/Libs/Player/VPPlayer.swift b/Veloria/Libs/Player/VPPlayer.swift index 248f2cb..c67927d 100644 --- a/Veloria/Libs/Player/VPPlayer.swift +++ b/Veloria/Libs/Player/VPPlayer.swift @@ -169,9 +169,9 @@ class VPPlayer: NSObject { func start() { self.isPlaying = true - if self.interruptionType != .began { - player.play() - } +// if self.interruptionType != .began { +// } + player.play() UIApplication.shared.isIdleTimerDisabled = true self.addIdleTimerDisabledObserver() @@ -317,6 +317,7 @@ extension VPPlayer { self.player.play() } } +// vpLog(message: "======音频发生变化\(interruptionType)") } diff --git a/Veloria/Source/Info.plist b/Veloria/Source/Info.plist index 94c2c3a..cadbf6b 100644 --- a/Veloria/Source/Info.plist +++ b/Veloria/Source/Info.plist @@ -50,5 +50,11 @@ + UIBackgroundModes + + fetch + remote-notification + audio + diff --git a/Veloria/Source/en.lproj/Localizable.strings b/Veloria/Source/en.lproj/Localizable.strings index d57cad4..c991761 100644 --- a/Veloria/Source/en.lproj/Localizable.strings +++ b/Veloria/Source/en.lproj/Localizable.strings @@ -99,6 +99,7 @@ "kVipPrivilegeText5" = "The donate coins will expire in %@"; "kVipPrivilegeText6" = "Auto renew, cancel anytime"; "kLoginAgreementText" = "By logging in you agree to: %@ & %@"; +"kVideoLockTipText" = "Please unlock the previous episode"; //无网提示 "kNetworkToast01" = "The service is abnormal. Check the network."; //解锁上一集提示 @@ -112,6 +113,8 @@ "kIapErrorToast02" = "Invalid in-app purchase"; ///没有可恢复购买 "kIapErrorToast03" = "There are no in-app purchases to restore."; +///请购买上一集 +"kUnlockVideoErrorToast01" = "The prequel to this series is not unlocked. Please unlock the prequel before unlocking this series"; diff --git a/资料/app账号信息.txt b/资料/app账号信息.txt index 2080a9d..1ad1975 100644 --- a/资料/app账号信息.txt +++ b/资料/app账号信息.txt @@ -10,4 +10,8 @@ D-U-N-S :616751820 公司地址 :9010, Xijing Apartment Sanqi Shopping Plaza, No.383, Jinxing M. Road 认证官网 :https://www.qjwl168.com 账号 :hn.qinjiu.developer@icloud.com -密码 :Discover2024 \ No newline at end of file +密码 :Discover2024 + +沙盒账号 +veloria@test.com +Test@168 \ No newline at end of file