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