diff --git a/MoviaBox/AppDelegate/AppDelegate+APNS.swift b/MoviaBox/AppDelegate/AppDelegate+APNS.swift index e492832..1902ed5 100644 --- a/MoviaBox/AppDelegate/AppDelegate+APNS.swift +++ b/MoviaBox/AppDelegate/AppDelegate+APNS.swift @@ -45,9 +45,20 @@ extension AppDelegate: UNUserNotificationCenterDelegate { UIApplication.shared.applicationIconBadgeNumber = 0 } - let userInfo = response.notification.request.content.userInfo + guard let userInfo: [String : Any] = response.notification.request.content.userInfo as? [String : Any] else { + completionHandler() + return + } - if let shortPlayId = userInfo["short_play_id"] as? String { + guard let model = SPOpenAppModel.deserialize(from: userInfo) else { + completionHandler() + return + } + SPStatAPI.requestStatApns(messageId: model.message_id ?? "", title: response.notification.request.content.title) + + + if let shortPlayId = model.short_play_id { + let vc = SPPlayerDetailViewController() vc.shortPlayId = shortPlayId SPAPPTool.topViewController()?.navigationController?.pushViewController(vc, animated: true) diff --git a/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift b/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift index 09f2b84..b6464b8 100644 --- a/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift +++ b/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift @@ -30,9 +30,61 @@ extension SceneDelegate { func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { guard let webpageURL = userActivity.webpageURL else { return } - guard let query = webpageURL.query else { return } - - spLog(message: query) + handleOpenAppMessage(webpageURL: webpageURL) + } + +} + + +extension SceneDelegate { + static var hasOpenMessage = false + + func handleOpenAppMessage(webpageURL: URL?) { + + //统计用URL + var statUrlStr: String? + var data: [String : Any]? + + if let pasteStr = UIPasteboard.general.string { + UIPasteboard.general.string = nil + let tempArr = pasteStr.components(separatedBy: "?") + let query = tempArr.last + + let tempData = query?.urlQuryToDictionary() + if tempData?["short_play_id"] != nil { + data = tempData + statUrlStr = pasteStr + } + } + if Self.hasOpenMessage { + return + } + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + Self.hasOpenMessage = false + } + + Self.hasOpenMessage = true + + + if data == nil { + data = webpageURL?.query?.urlQuryToDictionary() + statUrlStr = webpageURL?.absoluteString + } + + if let urlStr = statUrlStr {//上报结果 + SPStatAPI.requestStatW2a(data: urlStr) + } + + + + guard let data = data else { return } + guard let model = SPOpenAppModel.deserialize(from: data) else { return } + guard let shortPlayId = model.short_play_id, shortPlayId.count > 0 else { return } + + + let vc = SPPlayerDetailViewController() + vc.shortPlayId = shortPlayId + SPAPPTool.topViewController()?.navigationController?.pushViewController(vc, animated: true) } } diff --git a/MoviaBox/AppDelegate/AppDelegate+Thirdparty.swift b/MoviaBox/AppDelegate/AppDelegate+Thirdparty.swift index 264aedc..4731c92 100644 --- a/MoviaBox/AppDelegate/AppDelegate+Thirdparty.swift +++ b/MoviaBox/AppDelegate/AppDelegate+Thirdparty.swift @@ -24,7 +24,7 @@ extension AppDelegate { private func registAdjust() { - let config = ADJConfig(appToken: "mtogye6pmha8", environment: ADJEnvironmentProduction) + let config = ADJConfig(appToken: "7z38v0rvceww", environment: ADJEnvironmentProduction) Adjust.initSdk(config) } diff --git a/MoviaBox/AppDelegate/SceneDelegate.swift b/MoviaBox/AppDelegate/SceneDelegate.swift index cf4ba27..3e5b33a 100644 --- a/MoviaBox/AppDelegate/SceneDelegate.swift +++ b/MoviaBox/AppDelegate/SceneDelegate.swift @@ -10,7 +10,8 @@ import UIKit class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? - + + private var timer: Timer? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } @@ -20,6 +21,13 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window = UIWindow(windowScene: windowScene) window?.rootViewController = tabBarController window?.makeKeyAndVisible() + + if let webpageURL = session.stateRestorationActivity?.webpageURL { + handleOpenAppMessage(webpageURL: webpageURL) + } + + //在线状态统计 + timer = Timer.scheduledTimer(timeInterval: 60 * 10, target: self, selector: #selector(handleOnLine), userInfo: nil, repeats: true) } func sceneDidDisconnect(_ scene: UIScene) { @@ -32,6 +40,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func sceneDidBecomeActive(_ scene: UIScene) { // Called when the scene has moved from an inactive state to an active state. // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + SPStatAPI.requestEnterApp() + handleOpenAppMessage(webpageURL: nil) } func sceneWillResignActive(_ scene: UIScene) { @@ -42,14 +52,23 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func sceneWillEnterForeground(_ scene: UIScene) { // Called as the scene transitions from the background to the foreground. // Use this method to undo the changes made on entering the background. + + } func sceneDidEnterBackground(_ scene: UIScene) { // Called as the scene transitions from the foreground to the background. // Use this method to save data, release shared resources, and store enough scene-specific state information // to restore the scene back to its current state. + SPStatAPI.requestLeaveApp() } } +extension SceneDelegate { + + @objc private func handleOnLine() { + SPStatAPI.requestStatOnLine() + } +} diff --git a/MoviaBox/Base/Extension/String+SPAdd.swift b/MoviaBox/Base/Extension/String+SPAdd.swift index 3667890..8a8ddf8 100644 --- a/MoviaBox/Base/Extension/String+SPAdd.swift +++ b/MoviaBox/Base/Extension/String+SPAdd.swift @@ -33,6 +33,25 @@ extension String: SmartCodable { } +extension String { + ///将url中的参数转换成字典 + func urlQuryToDictionary() -> [String : Any] { + let array = self.components(separatedBy: "&") + var tempDic: [String : Any] = [:] + + array.forEach { + if let strRange = $0.range(of: "=") { + var key: String = String($0.prefix(upTo: strRange.upperBound)) + key.removeLast() + var value: String = String($0.suffix(from: strRange.upperBound)) + value = value.removingPercentEncoding ?? value + tempDic[key] = value + } + } + return tempDic + } +} + extension String { ///获取文字Size func size(font: UIFont, size: CGSize = CGSize(width: CGFloat(MAXFLOAT), height: CGFloat(MAXFLOAT))) -> CGSize{ diff --git a/MoviaBox/Base/Extension/UIColor+SPAdd.swift b/MoviaBox/Base/Extension/UIColor+SPAdd.swift index 40b98d5..b204bda 100644 --- a/MoviaBox/Base/Extension/UIColor+SPAdd.swift +++ b/MoviaBox/Base/Extension/UIColor+SPAdd.swift @@ -388,5 +388,13 @@ extension UIColor { static func color362020(alpha: CGFloat = 1) -> UIColor { return color(hex: 0x362020, alpha: alpha) } + + static func color7A7F96(alpha: CGFloat = 1) -> UIColor { + return color(hex: 0x7A7F96, alpha: alpha) + } + + static func color967A7A(alpha: CGFloat = 1) -> UIColor { + return color(hex: 0x967A7A, alpha: alpha) + } } diff --git a/MoviaBox/Base/Model/SPOpenAppModel.swift b/MoviaBox/Base/Model/SPOpenAppModel.swift new file mode 100644 index 0000000..1cd246b --- /dev/null +++ b/MoviaBox/Base/Model/SPOpenAppModel.swift @@ -0,0 +1,17 @@ +// +// SPOpenAppModel.swift +// MoviaBox +// +// Created by 佳尔 on 2025/5/8. +// + +import UIKit +import SmartCodable + +class SPOpenAppModel: SPModel, SmartCodable { + + var id: String? + var message_id: String? + var short_play_id: String? + +} diff --git a/MoviaBox/Base/Networking/API/SPStatAPI.swift b/MoviaBox/Base/Networking/API/SPStatAPI.swift new file mode 100644 index 0000000..a4f0bf7 --- /dev/null +++ b/MoviaBox/Base/Networking/API/SPStatAPI.swift @@ -0,0 +1,75 @@ +// +// SPStatAPI.swift +// MoviaBox +// +// Created by 佳尔 on 2025/5/8. +// + +import UIKit + +///统计 +class SPStatAPI: NSObject { + + ///进入APP + static func requestEnterApp() { + + var param = SPNetworkParameters(path: "/customer/enterTheApp") + param.isToast = false + param.isLoding = false + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in + + } + } + + ///离开APP + static func requestLeaveApp() { + var param = SPNetworkParameters(path: "/customer/leaveApp") + param.isToast = false + param.isLoding = false + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in + + } + } + + ///在线状态统计 + static func requestStatOnLine() { + var param = SPNetworkParameters(path: "/customer/onLine") + param.isToast = false + param.isLoding = false + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in + + } + } + + ///统计w2a点击 + static func requestStatW2a(data: String) { + var param = SPNetworkParameters(path: "/w2aSelfAttribution") + param.isToast = false + param.isLoding = false + param.parameters = [ + "data" : data + ] + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in + + } + } + + ///统计点击推送消息 + static func requestStatApns(messageId: String, title: String) { + var param = SPNetworkParameters(path: "/message/sendReport") + param.isToast = false + param.isLoding = false + param.parameters = [ + "message_id" : messageId, + "title" : title + ] + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in + + } + } +} diff --git a/MoviaBox/Base/Networking/Base/SPNetworkReachabilityManager.swift b/MoviaBox/Base/Networking/Base/SPNetworkReachabilityManager.swift index 1b04239..344106a 100644 --- a/MoviaBox/Base/Networking/Base/SPNetworkReachabilityManager.swift +++ b/MoviaBox/Base/Networking/Base/SPNetworkReachabilityManager.swift @@ -54,16 +54,20 @@ class SPNetworkReachabilityManager { if path.status == .satisfied { if self.isReachable == false { print("++++++有网") + self.isReachable = true NotificationCenter.default.post(name: SPNetworkReachabilityManager.reachabilityDidChangeNotification, object: nil) + } else { + self.isReachable = true } - self.isReachable = true } else { if self.isReachable == true { print("++++++无网") + self.isReachable = false NotificationCenter.default.post(name: SPNetworkReachabilityManager.reachabilityDidChangeNotification, object: nil) + } else { + self.isReachable = false } - self.isReachable = false } // if path.usesInterfaceType(.wifi) { diff --git a/MoviaBox/Class/Home/Controller/SPHomeViewController.swift b/MoviaBox/Class/Home/Controller/SPHomeViewController.swift index 9ef122f..5039d71 100644 --- a/MoviaBox/Class/Home/Controller/SPHomeViewController.swift +++ b/MoviaBox/Class/Home/Controller/SPHomeViewController.swift @@ -12,8 +12,9 @@ class SPHomeViewController: SPHomeChildController { private lazy var viewModel: SPHomeViewModel = SPHomeViewModel() - private lazy var page = 1 - private lazy var dataArr: [SPShortModel] = [] + + + private lazy var requestGroup = DispatchGroup() //MARK: UI属性 private lazy var logoImageView: UIImageView = { @@ -64,6 +65,7 @@ class SPHomeViewController: SPHomeChildController { updateAllData(completer: nil) +// updateEmptyState() _setupUI() @@ -89,7 +91,7 @@ class SPHomeViewController: SPHomeChildController { } override func handleFooterRefresh(_ completer: (() -> Void)?) { - requestListDataArr(page: self.page + 1) { [weak self] in + requestListDataArr(page: self.viewModel.page + 1) { [weak self] in self?.collectionView.sp_endFooterRefreshing() } } @@ -135,6 +137,18 @@ extension SPHomeViewController { updateAllData(completer: nil) } } + ///更新空白页面状态 + private func updateEmptyState() { + + if SPNetworkReachabilityManager.manager.isReachable != true, viewModel.isEmptyData { + self.collectionView.showNoNetworkEmpty { [weak self] in + self?.updateAllData(completer: nil) + } + } else { + self.collectionView.hiddenEmpty() + } + + } } @@ -143,13 +157,13 @@ extension SPHomeViewController: UICollectionViewDelegate, UICollectionViewDataSo func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = SPHomeShortCell.dequeueReusableCell(collectionView: collectionView, indexPath: indexPath) - cell.model = dataArr[indexPath.row] + cell.model = viewModel.dataArr[indexPath.row] return cell } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return dataArr.count + return viewModel.dataArr.count } func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { @@ -161,7 +175,7 @@ extension SPHomeViewController: UICollectionViewDelegate, UICollectionViewDataSo } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - let model = self.dataArr[indexPath.row] + let model = viewModel.dataArr[indexPath.row] let vc = SPPlayerDetailViewController() vc.shortPlayId = model.short_play_id @@ -174,14 +188,25 @@ extension SPHomeViewController: UICollectionViewDelegate, UICollectionViewDataSo extension SPHomeViewController { private func updateAllData(completer: (() -> Void)?) { - requestModuleData() - requestPlayHistory() - requestListDataArr(page: 1) { + self.requestGroup.enter() + requestModuleData { [weak self] in + self?.requestGroup.leave() + } + self.requestGroup.enter() + requestPlayHistory { [weak self] in + self?.requestGroup.leave() + } + self.requestGroup.enter() + requestListDataArr(page: 1) { [weak self] in + self?.requestGroup.leave() + } + + self.requestGroup.notify(queue: DispatchQueue.main) { completer?() } } - private func requestModuleData() { + private func requestModuleData(completer: (() -> Void)? = nil) { SPHomeAPI.requestHomeModuleData { [weak self] model in guard let self = self else { return } if let model = model { @@ -190,11 +215,13 @@ extension SPHomeViewController { self.layout.headerReferenceSize = CGSize(width: kSPScreenWidth, height: SPHomeHeaderView.contentHeight(viewModel: self.viewModel)) self.collectionView.reloadData() } + self.updateEmptyState() + completer?() } } ///获取播放记录 - private func requestPlayHistory() { + private func requestPlayHistory(completer: (() -> Void)? = nil) { SPVideoAPI.requestPlayHistoryList(page: 1) { [weak self] listModel in guard let self = self else { return } if let list = listModel?.list { @@ -202,6 +229,8 @@ extension SPHomeViewController { self.layout.headerReferenceSize = CGSize(width: kSPScreenWidth, height: SPHomeHeaderView.contentHeight(viewModel: self.viewModel)) self.collectionView.reloadData() } + self.updateEmptyState() + completer?() } } @@ -212,13 +241,14 @@ extension SPHomeViewController { if let list = listModel?.list { if page == 1 { - self.dataArr.removeAll() + self.viewModel.dataArr.removeAll() } - self.dataArr += list + self.viewModel.dataArr += list self.collectionView.reloadData() - self.page = page + self.viewModel.page = page } + self.updateEmptyState() completer?() } } diff --git a/MoviaBox/Class/Home/View/SPHomeHeaderView.swift b/MoviaBox/Class/Home/View/SPHomeHeaderView.swift index 5592ba7..f56cd87 100644 --- a/MoviaBox/Class/Home/View/SPHomeHeaderView.swift +++ b/MoviaBox/Class/Home/View/SPHomeHeaderView.swift @@ -18,8 +18,11 @@ class SPHomeHeaderView: UICollectionReusableView { stackView.removeAllArrangedSubview() - stackView.addArrangedSubview(bannerView) - bannerView.reloadData() + + if let bannerData = moduleModel?.bannerData, bannerData.count > 0 { + stackView.addArrangedSubview(bannerView) + bannerView.reloadData() + } if let historyList = viewModel?.playHistoryArr, historyList.count > 0 { stackView.addArrangedSubview(playHistoryView) @@ -200,18 +203,27 @@ extension SPHomeHeaderView: ZKCycleScrollViewDelegate, ZKCycleScrollViewDataSour extension SPHomeHeaderView { static func contentHeight(viewModel: SPHomeViewModel) -> CGFloat { - var height = bannerHeight() + var height: CGFloat = 0 let moduleModel = viewModel.moduleModel + if let bannerData = moduleModel?.bannerData, bannerData.count > 0 { + height = height + bannerHeight() + } + ///历史记录 if let historyList = viewModel.playHistoryArr, historyList.count > 0 { - height = height + SPHomePlayHistoryView.contentHeight(dataArr: historyList) + 25 + if height > 0 { + height = height + 25 + } + height = height + SPHomePlayHistoryView.contentHeight(dataArr: historyList) } - ///九宫格数据 if let list = moduleModel?.nineSquare?.list, list.count > 0 { - height = height + SPHomeExploreView.contentHeight(dataArr: list) + 25 + if height > 0 { + height = height + 25 + } + height = height + SPHomeExploreView.contentHeight(dataArr: list) } // height = height + SPHomeTrendingView.contentHeight(dataArr: moduleModel?.bannerData ?? []) + 25 diff --git a/MoviaBox/Class/Home/View/SPSearchAssociativeView.swift b/MoviaBox/Class/Home/View/SPSearchAssociativeView.swift index 8c8a82b..d05295c 100644 --- a/MoviaBox/Class/Home/View/SPSearchAssociativeView.swift +++ b/MoviaBox/Class/Home/View/SPSearchAssociativeView.swift @@ -24,6 +24,7 @@ class SPSearchAssociativeView: UIView { tableView.separatorInset = .init(top: 0, left: 16, bottom: 0, right: 16) tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: kSPTabbarSafeBottomMargin, right: 0) tableView.keyboardDismissMode = .onDrag + tableView.showNormalEmpty(image: UIImage(named: "empty_image_03")) SPSearchAssociativeCell.registerCell(tableView: tableView) return tableView }() diff --git a/MoviaBox/Class/Home/ViewModel/SPHomeViewModel.swift b/MoviaBox/Class/Home/ViewModel/SPHomeViewModel.swift index a9e4db8..fbcc5ea 100644 --- a/MoviaBox/Class/Home/ViewModel/SPHomeViewModel.swift +++ b/MoviaBox/Class/Home/ViewModel/SPHomeViewModel.swift @@ -9,11 +9,20 @@ import UIKit class SPHomeViewModel: NSObject { + lazy var page = 1 + lazy var dataArr: [SPShortModel] = [] + var moduleModel: SPHomeModuleModel? ///历史记录 var playHistoryArr: [SPShortModel]? + var isEmptyData: Bool { + if dataArr.count > 0 || (playHistoryArr?.count ?? 0) > 0 || moduleModel != nil { + return false + } + return true + } } diff --git a/MoviaBox/Class/MyList/Controller/SPCollectListViewController.swift b/MoviaBox/Class/MyList/Controller/SPCollectListViewController.swift index 4a5c3b4..4076ac7 100644 --- a/MoviaBox/Class/MyList/Controller/SPCollectListViewController.swift +++ b/MoviaBox/Class/MyList/Controller/SPCollectListViewController.swift @@ -34,6 +34,7 @@ class SPCollectListViewController: SPMyListChildViewController { collectionView.delegate = self collectionView.dataSource = self collectionView.contentInset = .init(top: 10, left: 0, bottom: 0, right: 0) + collectionView.showNormalEmpty() collectionView.sp_addRefreshHeader(insetTop: collectionView.contentInset.top) { [weak self] in self?.handleHeaderRefresh(nil) } @@ -148,11 +149,6 @@ extension SPCollectListViewController: UICollectionViewDelegate, UICollectionVie func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { let count = self.dataArr.count - if count == 0 { - self.collectionView.addNormalEmpty() - } else { - self.collectionView.hiddenEmpty() - } return count } diff --git a/MoviaBox/Class/MyList/Controller/SPMyListViewController.swift b/MoviaBox/Class/MyList/Controller/SPMyListViewController.swift index 440e607..2da6710 100644 --- a/MoviaBox/Class/MyList/Controller/SPMyListViewController.swift +++ b/MoviaBox/Class/MyList/Controller/SPMyListViewController.swift @@ -65,6 +65,13 @@ class SPMyListViewController: SPViewController { return pageView }() + private(set) lazy var wmPageView: WMPageController = { + let pageView = WMPageController() + pageView.delegate = self + pageView.dataSource = self + return pageView + }() + private lazy var editButton: UIButton = { let button = UIButton(type: .custom) button.setImage(UIImage(named: "delete_icon_01"), for: .normal) @@ -145,9 +152,11 @@ class SPMyListViewController: SPViewController { extension SPMyListViewController { private func _setupUI() { addChild(pageView) +// addChild(self.wmPageView) view.addSubview(lineView) view.addSubview(pageView.view) +// view.addSubview(wmPageView.view) view.addSubview(editButton) view.addSubview(cancelButton) // view.addSubview(allSelectedButton) @@ -182,6 +191,40 @@ extension SPMyListViewController { } } +//MARK: -------------- WMPageControllerDelegate & WMPageControllerDataSource -------------- +extension SPMyListViewController: WMPageControllerDelegate, WMPageControllerDataSource { + + func pageController(_ pageController: WMPageController, preferredFrameForContentView contentView: WMScrollView) -> CGRect { + let y = kSPStatusbarHeight + 10 + 35 + return .init(x: 0, y: kSPStatusbarHeight + 10 + 35, width: kSPScreenWidth, height: kSPScreenHeight - y - kSPTabBarHeight) + } + + func pageController(_ pageController: WMPageController, preferredFrameFor menuView: WMMenuView) -> CGRect { + return .init(x: 0, y: kSPStatusbarHeight + 10, width: kSPScreenWidth, height: 35) + } + + func numbersOfChildControllers(in pageController: WMPageController) -> Int { + return titles.count + } + + func pageController(_ pageController: WMPageController, titleAt index: Int) -> String { + return titles[index] + } + + func pageController(_ pageController: WMPageController, viewControllerAt index: Int) -> UIViewController { + self.viewControllers[index] + } + + func pageController(_ pageController: WMPageController, didEnter viewController: UIViewController, withInfo info: [AnyHashable : Any]) { + if pageController.selectIndex == 0 { + self.editButton.isHidden = false + } else { + self.editButton.isHidden = true + } + } + +} + //MARK: -------------- JYPageControllerDelegate & JYPageControllerDataSource -------------- extension SPMyListViewController: JYPageControllerDelegate, JYPageControllerDataSource { diff --git a/MoviaBox/Class/MyList/Controller/SPPlayHistoryViewController.swift b/MoviaBox/Class/MyList/Controller/SPPlayHistoryViewController.swift index 19dd608..341c96f 100644 --- a/MoviaBox/Class/MyList/Controller/SPPlayHistoryViewController.swift +++ b/MoviaBox/Class/MyList/Controller/SPPlayHistoryViewController.swift @@ -32,6 +32,7 @@ class SPPlayHistoryViewController: SPMyListChildViewController { let collectionView = SPCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) collectionView.delegate = self collectionView.dataSource = self + collectionView.showNormalEmpty() collectionView.contentInset = .init(top: 10, left: 0, bottom: 0, right: 0) collectionView.sp_addRefreshHeader(insetTop: collectionView.contentInset.top) { [weak self] in self?.handleHeaderRefresh(nil) @@ -143,13 +144,6 @@ extension SPPlayHistoryViewController: UICollectionViewDelegate, UICollectionVie func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { let count = self.dataArr.count - - if count == 0 { - self.collectionView.addNormalEmpty() - } else { - self.collectionView.hiddenEmpty() - } - return count } diff --git a/MoviaBox/Class/Player/Controller/SPPlayerDetailViewController.swift b/MoviaBox/Class/Player/Controller/SPPlayerDetailViewController.swift index b53aab5..9300174 100644 --- a/MoviaBox/Class/Player/Controller/SPPlayerDetailViewController.swift +++ b/MoviaBox/Class/Player/Controller/SPPlayerDetailViewController.swift @@ -198,6 +198,8 @@ extension SPPlayerDetailViewController { guard let self = self else { return } self.play() } + //更新用户信息 + SPLoginManager.manager.updateUserInfo(completer: nil) default: break diff --git a/MoviaBox/Class/Wallet/Controller/SPCoinOrderRecordViewController.swift b/MoviaBox/Class/Wallet/Controller/SPCoinOrderRecordViewController.swift index deea27a..e14a96d 100644 --- a/MoviaBox/Class/Wallet/Controller/SPCoinOrderRecordViewController.swift +++ b/MoviaBox/Class/Wallet/Controller/SPCoinOrderRecordViewController.swift @@ -19,6 +19,7 @@ class SPCoinOrderRecordViewController: SPViewController { tableView.delegate = self tableView.dataSource = self tableView.rowHeight = 70 + tableView.showNormalEmpty() tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: kSPTabbarSafeBottomMargin, right: 0) tableView.sp_addRefreshHeader { [weak self] in self?.handleHeaderRefresh(nil) @@ -76,11 +77,6 @@ extension SPCoinOrderRecordViewController: UITableViewDelegate, UITableViewDataS func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let count = self.dataArr.count - if count == 0 { - self.tableView.addNormalEmpty() - } else { - self.tableView.hiddenEmpty() - } return count } diff --git a/MoviaBox/Class/Wallet/Controller/SPConsumptionRecordsViewController.swift b/MoviaBox/Class/Wallet/Controller/SPConsumptionRecordsViewController.swift index 39dd8a6..33b677e 100644 --- a/MoviaBox/Class/Wallet/Controller/SPConsumptionRecordsViewController.swift +++ b/MoviaBox/Class/Wallet/Controller/SPConsumptionRecordsViewController.swift @@ -19,6 +19,7 @@ class SPConsumptionRecordsViewController: SPViewController { tableView.delegate = self tableView.dataSource = self tableView.rowHeight = 72 + tableView.showNormalEmpty() tableView.separatorInset = .init(top: 0, left: 32, bottom: 0, right: 32) tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: kSPTabbarSafeBottomMargin, right: 0) tableView.sp_addRefreshHeader { [weak self] in @@ -82,11 +83,6 @@ extension SPConsumptionRecordsViewController: UITableViewDelegate, UITableViewDa func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let count = self.dataArr.count - if count == 0 { - self.tableView.addNormalEmpty() - } else { - self.tableView.hiddenEmpty() - } return count } } diff --git a/MoviaBox/Class/Wallet/Controller/SPRewardCoinsViewController.swift b/MoviaBox/Class/Wallet/Controller/SPRewardCoinsViewController.swift index 60da69e..75b687e 100644 --- a/MoviaBox/Class/Wallet/Controller/SPRewardCoinsViewController.swift +++ b/MoviaBox/Class/Wallet/Controller/SPRewardCoinsViewController.swift @@ -19,6 +19,7 @@ class SPRewardCoinsViewController: SPViewController { tableView.delegate = self tableView.dataSource = self tableView.rowHeight = 96 + tableView.showNormalEmpty() tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: kSPTabbarSafeBottomMargin, right: 0) tableView.sp_addRefreshHeader { [weak self] in self?.handleHeaderRefresh(nil) @@ -84,11 +85,6 @@ extension SPRewardCoinsViewController: UITableViewDelegate, UITableViewDataSourc func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let count = self.dataArr.count - if count == 0 { - self.tableView.addNormalEmpty() - } else { - self.tableView.hiddenEmpty() - } return count } } diff --git a/MoviaBox/Class/Wallet/Controller/SPVIPOrderRecordViewController.swift b/MoviaBox/Class/Wallet/Controller/SPVIPOrderRecordViewController.swift index 54abeae..b131b0f 100644 --- a/MoviaBox/Class/Wallet/Controller/SPVIPOrderRecordViewController.swift +++ b/MoviaBox/Class/Wallet/Controller/SPVIPOrderRecordViewController.swift @@ -18,6 +18,7 @@ class SPVIPOrderRecordViewController: SPViewController { tableView.delegate = self tableView.dataSource = self tableView.rowHeight = 74 + tableView.showNormalEmpty() tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: kSPTabbarSafeBottomMargin, right: 0) tableView.sp_addRefreshHeader { [weak self] in self?.handleHeaderRefresh(nil) @@ -75,11 +76,6 @@ extension SPVIPOrderRecordViewController: UITableViewDelegate, UITableViewDataSo func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let count = self.dataArr.count - if count == 0 { - self.tableView.addNormalEmpty() - } else { - self.tableView.hiddenEmpty() - } return count } diff --git a/MoviaBox/Libs/Empty/SPEmptyState.swift b/MoviaBox/Libs/Empty/SPEmptyState.swift deleted file mode 100644 index 56b43f6..0000000 --- a/MoviaBox/Libs/Empty/SPEmptyState.swift +++ /dev/null @@ -1,92 +0,0 @@ -// -// SPEmptyState.swift -// MoviaBox -// -// Created by Overseas on 2025/4/19. -// - -import UIKit -import EmptyStateKit - -struct SPEmptyParameters { -// var title: String = "暂无内容" -// var titleFont: UIFont = UIFont.text_md -// var titleColor: UIColor = UIColor.system_text_secondary_300 - var image: UIImage? = UIImage(named: "empty_image_01") -// var buttonTitle: String? -} - -enum SPEmptyState { - case normail(parameters: SPEmptyParameters) -} - -extension SPEmptyState: CustomState { - - var image: UIImage? { - switch self { - case .normail(let parameters): - return parameters.image - - - } - } - - var title: String? { - switch self { - case .normail(_): - return nil - - } - } - -// var titleButton: String? { -// switch self { -// case .normail(let parameters): -// return parameters.buttonTitle -// } - -} - -extension SPEmptyState { - var format: EmptyStateFormat { - - var format = EmptyStateFormat() - format.backgroundColor = .clear - format.imageSize = self.image?.size ?? .zero - format.animation = nil - format.verticalMargin = -50 -// -// format.buttonWidth = 107 -// format.buttonTopMargin = 10 -// format.buttonColor = .system_fill_primary_100 -// format.buttonAttributes = [ -// .font: UIFont.text_md, -// .foregroundColor: UIColor.system_text_secondary_500 -// ] -// -// switch self { -// case .normail(let p): -// format.titleAttributes = [ -// .font: p.titleFont, -// .foregroundColor: p.titleColor -// ] -// -// -// case .login(let p): -// format.titleAttributes = [ -// .font: p.titleFont, -// .foregroundColor: p.titleColor -// ] -// -// -// } - - - - - return format - } -} - - - diff --git a/MoviaBox/Libs/Empty/SPNoNetworkEmptyView.swift b/MoviaBox/Libs/Empty/SPNoNetworkEmptyView.swift new file mode 100644 index 0000000..3cb7df9 --- /dev/null +++ b/MoviaBox/Libs/Empty/SPNoNetworkEmptyView.swift @@ -0,0 +1,90 @@ +// +// SPNoNetworkEmptyView.swift +// MoviaBox +// +// Created by 佳尔 on 2025/5/8. +// + +import UIKit + +class SPNoNetworkEmptyView: UIView { + + + override var intrinsicContentSize: CGSize { + return CGSize(width: kSPScreenWidth, height: 100) + } + + var clickButton: (() -> Void)? + + //MARK: UI属性 + private lazy var iconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "empty_image_02")) + return imageView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontRegular(ofSize: 16) + label.textColor = .color967A7A() + label.text = "kNoNetworkTip_01".localized + return label + }() + + private lazy var button: UIButton = { + let button = JXButton(type: .custom) + button.layer.cornerRadius = 17 + button.layer.masksToBounds = true + button.layer.borderWidth = 1 + button.layer.borderColor = UIColor.colorFFFFFF().cgColor + button.jx_font = .fontRegular(ofSize: 18) + button.setTitleColor(.colorFFFFFF(), for: .normal) + button.setTitle("Retry".localized, for: .normal) + button.leftAndRightMargin = 33 + button.addTarget(self, action: #selector(handleButton), for: .touchUpInside) + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + _setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc private func handleButton() { + self.clickButton?() + } + +} + +extension SPNoNetworkEmptyView { + + private func _setupUI() { + addSubview(iconImageView) + addSubview(titleLabel) + addSubview(button) + + iconImageView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.centerX.equalToSuperview() + } + + titleLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(iconImageView.snp.bottom) + } + + button.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(titleLabel.snp.bottom).offset(28) + make.height.equalTo(34) + make.bottom.equalToSuperview() + } + + + } + + +} diff --git a/MoviaBox/Libs/Empty/UIScrollView+Empty.swift b/MoviaBox/Libs/Empty/UIScrollView+Empty.swift index de4e7c3..370beed 100644 --- a/MoviaBox/Libs/Empty/UIScrollView+Empty.swift +++ b/MoviaBox/Libs/Empty/UIScrollView+Empty.swift @@ -6,18 +6,47 @@ // import UIKit +import EmptyDataSet_Swift extension UIScrollView { - func addNormalEmpty() { - let parameters = SPEmptyParameters() - let emptyState = SPEmptyState.normail(parameters: parameters) - self.emptyState.format = emptyState.format - self.emptyState.show(emptyState) + ///展示一个普通的空白页 + func showNormalEmpty(image: UIImage? = UIImage(named: "empty_image_01"), title: String? = nil, titleColor: UIColor? = nil) { + + self.emptyDataSetView { view in + view.image(image) + .isScrollAllowed(true) + .verticalOffset(-100) + } } + ///展示一个无网的空白页 + func showNoNetworkEmpty(buttonHandle: (() -> Void)? = nil) { + + let customView = SPNoNetworkEmptyView() + customView.clickButton = { + buttonHandle?() + } + + self.emptyDataSetView { view in + view.isScrollAllowed(true) + .customView(customView) + .verticalOffset(-70) + } + + self.reloadEmptyDataSet() + } + + + func hiddenEmpty() { - self.emptyState.hide() + + self.emptyDataSetView { view in + view.customView(nil) + view.image(nil) + view.titleLabelString(nil) + } + self.reloadEmptyDataSet() } } diff --git a/MoviaBox/MoviaBox.entitlements b/MoviaBox/MoviaBox.entitlements index 948cd23..c3f2102 100644 --- a/MoviaBox/MoviaBox.entitlements +++ b/MoviaBox/MoviaBox.entitlements @@ -10,7 +10,7 @@ com.apple.developer.associated-domains - applinks:moviaboxapp.go.link + applinks:moviaapp.go.link applinks:www.moviatv.com keychain-access-groups diff --git a/MoviaBox/Source/Assets.xcassets/image/empty_image_02.imageset/Contents.json b/MoviaBox/Source/Assets.xcassets/image/empty_image_02.imageset/Contents.json new file mode 100644 index 0000000..a2f99d5 --- /dev/null +++ b/MoviaBox/Source/Assets.xcassets/image/empty_image_02.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "image 38@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "image 38@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MoviaBox/Source/Assets.xcassets/image/empty_image_02.imageset/image 38@2x.png b/MoviaBox/Source/Assets.xcassets/image/empty_image_02.imageset/image 38@2x.png new file mode 100644 index 0000000..1affab3 Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/empty_image_02.imageset/image 38@2x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/image/empty_image_02.imageset/image 38@3x.png b/MoviaBox/Source/Assets.xcassets/image/empty_image_02.imageset/image 38@3x.png new file mode 100644 index 0000000..38dba3d Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/empty_image_02.imageset/image 38@3x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/image/empty_image_03.imageset/Contents.json b/MoviaBox/Source/Assets.xcassets/image/empty_image_03.imageset/Contents.json new file mode 100644 index 0000000..432df22 --- /dev/null +++ b/MoviaBox/Source/Assets.xcassets/image/empty_image_03.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MoviaBox/Source/Assets.xcassets/image/empty_image_03.imageset/Group@2x.png b/MoviaBox/Source/Assets.xcassets/image/empty_image_03.imageset/Group@2x.png new file mode 100644 index 0000000..966bbc4 Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/empty_image_03.imageset/Group@2x.png differ diff --git a/MoviaBox/Source/Assets.xcassets/image/empty_image_03.imageset/Group@3x.png b/MoviaBox/Source/Assets.xcassets/image/empty_image_03.imageset/Group@3x.png new file mode 100644 index 0000000..a79237e Binary files /dev/null and b/MoviaBox/Source/Assets.xcassets/image/empty_image_03.imageset/Group@3x.png differ diff --git a/MoviaBox/Source/Info.plist b/MoviaBox/Source/Info.plist index 25102d7..9b08ccf 100644 --- a/MoviaBox/Source/Info.plist +++ b/MoviaBox/Source/Info.plist @@ -19,7 +19,7 @@ Editor CFBundleURLSchemes - MoviaTV + moviaapp diff --git a/MoviaBox/Source/en.lproj/Localizable.strings b/MoviaBox/Source/en.lproj/Localizable.strings index 485ec85..67ada5a 100644 --- a/MoviaBox/Source/en.lproj/Localizable.strings +++ b/MoviaBox/Source/en.lproj/Localizable.strings @@ -92,6 +92,7 @@ "Unlock now for" = "Unlock now for"; "Unlock the previous episode" = "Unlock the previous episode"; "Purchase Single Episode" = "Purchase Single Episode"; +"Retry" = "Retry"; ///没有可恢复购买 "kToastMessage_01" = "There are no recoverable in-app purchases."; @@ -109,4 +110,5 @@ "kStoreTipTitle" = "Related terms and conditions:"; "kStoreTipText" = "1. Coins can only be used within this application.
2. Payment: The purchase will be charged to your iTunes account. 
3. Renewal: Your Apple iTunes account will be charged within 24 hours before the expiration and the subscription period will be extended for another subscription cycle upon successful deduction.
4. Cancellation: To cancel the subscription renewal, please turn off the automatic renewal function in the iTunes/Apple ID settings at least 24 hours before the current subscription period expires. If canceled within the last 24 hours before expiration, a subscription fee will still be charged. 
5. Payment successful but recharge not taking effect for an extended period? Click here to refresh or send an email to: cs.jiaer.developer@icloud.com. 
6. Manage your subscriptions: You can view, change, or cancel your subscriptions. "; "kDeleteAccountCheckText" = "I accept the deletion risk and agree to delete my account"; +"kNoNetworkTip_01" = "Connection error. Please try again!"; diff --git a/MoviaBox/Thirdparty/JYPageController/Classes/JYScrollView.swift b/MoviaBox/Thirdparty/JYPageController/Classes/JYScrollView.swift index f87c599..e787c43 100644 --- a/MoviaBox/Thirdparty/JYPageController/Classes/JYScrollView.swift +++ b/MoviaBox/Thirdparty/JYPageController/Classes/JYScrollView.swift @@ -7,7 +7,7 @@ import UIKit -public class JYScrollView: UITableView,UIGestureRecognizerDelegate { +public class JYScrollView: UITableView { public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return gestureRecognizer.isKind(of: UIPanGestureRecognizer.classForCoder()) && otherGestureRecognizer.isKind(of: UIPanGestureRecognizer.classForCoder()) diff --git a/Podfile b/Podfile index 6ef15fa..97bfe72 100644 --- a/Podfile +++ b/Podfile @@ -26,7 +26,7 @@ target 'MoviaBox' do pod 'KTVHTTPCache' #视频缓存 pod 'HWPanModal' #底部弹出控制器 pod 'Kingfisher' #图片加载 - pod 'EmptyStateKit' #空数据页面 + pod 'EmptyDataSet-Swift' #空数据页面 pod 'ReachabilitySwift' #网络状态监控 pod 'WMZPageController' #分页控制器 pod 'SVProgressHUD' #HUD diff --git a/Podfile.lock b/Podfile.lock index e67bdc4..6fd758e 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -6,7 +6,7 @@ PODS: - AdjustSignature (3.35.2) - Alamofire (5.10.2) - CocoaAsyncSocket (7.6.5) - - EmptyStateKit (1.1.0) + - EmptyDataSet-Swift (5.0.0) - HWPanModal (0.9.9) - Kingfisher (8.3.2) - KTVHTTPCache (3.0.2): @@ -38,7 +38,7 @@ PODS: DEPENDENCIES: - Adjust - - EmptyStateKit + - EmptyDataSet-Swift - HWPanModal - Kingfisher - KTVHTTPCache @@ -58,12 +58,12 @@ SPEC REPOS: https://github.com/CocoaPods/Specs.git: - Adjust - AdjustSignature + - EmptyDataSet-Swift - Kingfisher - ZFPlayer trunk: - Alamofire - CocoaAsyncSocket - - EmptyStateKit - HWPanModal - KTVHTTPCache - MJRefresh @@ -82,7 +82,7 @@ SPEC CHECKSUMS: AdjustSignature: 23b9e5d4adcadffc303bb6b410fde617dd88504f Alamofire: 7193b3b92c74a07f85569e1a6c4f4237291e7496 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - EmptyStateKit: dc41e9ce5c6089f67a49d063bce73ade9f2ba73f + EmptyDataSet-Swift: eb382c0c87a2d9c678077385a595cec52da38171 HWPanModal: b57a6717d3cdcd666bff44f9dd2a5be9f4d6f5d2 Kingfisher: 0621d0ac0c78fecb19f6dc5303bde2b52abaf2f5 KTVHTTPCache: 5711692cdf9a5ecfe829b1e16577deb3ffe3dc86 @@ -98,6 +98,6 @@ SPEC CHECKSUMS: YYKit: 7cda43304a8dc3696c449041e2cb3107b4e236e7 ZFPlayer: 5cf39e8d9f0c2394a014b0db4767b5b5a6bffe13 -PODFILE CHECKSUM: 2a79f81260b8df4d6be58f4acb217732b1cd49ab +PODFILE CHECKSUM: 1e8174e48a7218cf3eed0a059ee987d0638ab131 COCOAPODS: 1.16.2 diff --git a/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/build-request.json b/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/build-request.json new file mode 100644 index 0000000..851be67 --- /dev/null +++ b/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/build-request.json @@ -0,0 +1,27 @@ +{ + "buildCommand" : { + "command" : "build", + "skipDependencies" : false, + "style" : "buildOnly" + }, + "configuredTargets" : [ + + ], + "continueBuildingAfterErrors" : false, + "dependencyScope" : "workspace", + "enableIndexBuildArena" : false, + "hideShellScriptEnvironment" : false, + "parameters" : { + "action" : "build", + "overrides" : { + + } + }, + "qos" : "default", + "schemeCommand" : "launch", + "showNonLoggedProgress" : true, + "useDryRun" : false, + "useImplicitDependencies" : false, + "useLegacyBuildLocations" : false, + "useParallelTargets" : true +} \ No newline at end of file diff --git a/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/description.msgpack b/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/description.msgpack new file mode 100644 index 0000000..9a7c838 Binary files /dev/null and b/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/description.msgpack differ diff --git a/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/manifest.json b/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/manifest.json new file mode 100644 index 0000000..7391713 --- /dev/null +++ b/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/manifest.json @@ -0,0 +1 @@ +{"client":{"name":"basic","version":0,"file-system":"device-agnostic","perform-ownership-analysis":"no"},"targets":{"":[""]},"commands":{"":{"tool":"phony","inputs":[""],"outputs":[""]},"P0:::Gate WorkspaceHeaderMapVFSFilesWritten":{"tool":"phony","inputs":[],"outputs":[""]}}} \ No newline at end of file diff --git a/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/target-graph.txt b/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/target-graph.txt new file mode 100644 index 0000000..b83b158 --- /dev/null +++ b/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/target-graph.txt @@ -0,0 +1 @@ +Target dependency graph (0 target) \ No newline at end of file diff --git a/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/task-store.msgpack b/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/task-store.msgpack new file mode 100644 index 0000000..6cef3fe Binary files /dev/null and b/build/XCBuildData/8524cc39f017101f2a0ad46f4fd68ba5.xcbuilddata/task-store.msgpack differ diff --git a/证书秘钥/内购/SubscriptionKey_9TBBMA3N28.p8 b/证书秘钥/内购/SubscriptionKey_9TBBMA3N28.p8 new file mode 100644 index 0000000..0bbcc3e --- /dev/null +++ b/证书秘钥/内购/SubscriptionKey_9TBBMA3N28.p8 @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgXR+Zedc3wF8TuJG6 +oDKxJbcDqDLJDEx/ExfQKT5GMc+gCgYIKoZIzj0DAQehRANCAASNWCeIL6ELCoVo +igAm8yXBuraOuuQdbPBmJnFwauYq3pFZt3RiTKZxXLs3TAHXuuK6jlUMNZ0SsyIf +epUu2+ms +-----END PRIVATE KEY----- \ No newline at end of file diff --git a/证书秘钥/内购/SubscriptionKey_B4LXRNN96J-秘钥2.p8 b/证书秘钥/内购/SubscriptionKey_B4LXRNN96J-秘钥2.p8 new file mode 100644 index 0000000..0095683 --- /dev/null +++ b/证书秘钥/内购/SubscriptionKey_B4LXRNN96J-秘钥2.p8 @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgIAZqlqn64s0g/cLK +HYv57T2s5WVllSrs6yyZeL0F1UegCgYIKoZIzj0DAQehRANCAATkoC81el02PBYY +0NtOiD6ZABY5yidgX7BLdfhIR4YABXRMHqgf5cC1wJeMFbuPimAhFyQUOjz4U3Pu +VYJ/uVUy +-----END PRIVATE KEY----- \ No newline at end of file diff --git a/证书秘钥/内购/秘钥.txt b/证书秘钥/内购/秘钥.txt new file mode 100644 index 0000000..35326a5 --- /dev/null +++ b/证书秘钥/内购/秘钥.txt @@ -0,0 +1,2 @@ +Issuer ID:5a4eda78-a1ec-4e14-b9e1-438e0c6b65e0 +共享秘钥:ef592c2f58e544f7b64c9e8e3fbdd918 \ No newline at end of file diff --git a/证书秘钥/团队秘钥/AuthKey_J5BTYX2VYL.p8 b/证书秘钥/团队秘钥/AuthKey_J5BTYX2VYL.p8 new file mode 100644 index 0000000..5a139fc --- /dev/null +++ b/证书秘钥/团队秘钥/AuthKey_J5BTYX2VYL.p8 @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgcGOb1W3PIj7aFHCV +gklnxGt7MUXIwO8NGjxmYugvNqygCgYIKoZIzj0DAQehRANCAAT4GJv/flDfYucP +klNWB0Gbl4SC8g1aRQWsjlH5ZhTRCADsQMchLv1hfLluggscZ9/mjooXqxeIa9dA +kCEe5BH5 +-----END PRIVATE KEY----- \ No newline at end of file diff --git a/证书秘钥/推送证书/AuthKey_RR837V244H.p8 b/证书秘钥/推送证书/AuthKey_RR837V244H.p8 new file mode 100644 index 0000000..74b8770 --- /dev/null +++ b/证书秘钥/推送证书/AuthKey_RR837V244H.p8 @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgybyT4E9RcVHpanWn +rWHRf50TR8iio6SZ2s2oploN4JegCgYIKoZIzj0DAQehRANCAAQ4gRcELlsyQecH +Czr4kIVXbrD9oOk/ibNsSq7QpHSHgs8T+Ev08miNqPc9fMxP9KkIVgTxdKNdVkXg +g7cByXj5 +-----END PRIVATE KEY----- \ No newline at end of file diff --git a/证书秘钥/推送证书/GoogleService-Info.plist b/证书秘钥/推送证书/GoogleService-Info.plist new file mode 100644 index 0000000..75c241b --- /dev/null +++ b/证书秘钥/推送证书/GoogleService-Info.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyAT78NBZpoE2kazUeiWOBKuQNczOEtPPbU + GCM_SENDER_ID + 157639867903 + PLIST_VERSION + 1 + BUNDLE_ID + com.thimratv.app + PROJECT_ID + movia-c4ef0 + STORAGE_BUCKET + movia-c4ef0.firebasestorage.app + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:157639867903:ios:63bd57e22b7c906450fbca + + \ No newline at end of file