Commit 88d52922 authored by shenyong's avatar shenyong

内购管理类重写

parent 7a003868
...@@ -37,8 +37,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -37,8 +37,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
// 首页缓存 // 首页缓存
findHomeData() findHomeData()
// 获取价格 // 获取内购价格
HomePayModel.share.fetchProducts() IAPManager.share.fetchProducts { p in
Print("获取内购商品信息",p as Any)
}
// HomePayModel.share.fetchProducts()
// 初始化广告SDK // 初始化广告SDK
AdvManager.shared.initAdertisementSDK() AdvManager.shared.initAdertisementSDK()
...@@ -266,10 +269,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -266,10 +269,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
private func setupDefault() { private func setupDefault() {
// HomePayModel.share.loadLocalData() // HomePayModel.share.loadLocalData()
HomePayModel.share.checkSubscriptionState { isSubscribed, expiresDate in // HomePayModel.share.checkSubscriptionState { isSubscribed, expiresDate in
//
// }
IAPManager.share.checkSubscriptionState { isSubscribed, expiresDate in
Print("是否内购---",isSubscribed)
} }
NetStatusManager.manager.startNet { status in NetStatusManager.manager.startNet { status in
switch status { switch status {
......
...@@ -22,17 +22,17 @@ enum IAPError: Error { ...@@ -22,17 +22,17 @@ enum IAPError: Error {
var localizedDescription: String { var localizedDescription: String {
switch self { switch self {
case .noProductsFound: case .noProductsFound:
return "未找到可购买的商品" return "No available goods for purchase were found."
case .purchaseFailure: case .purchaseFailure:
return "购买失败" return "Purchase failed"
case .receiptValidationFailure: case .receiptValidationFailure:
return "订单验证失败" return "Order verification failed."
case .networkError: case .networkError:
return "网络连接错误" return "Network connection error"
case .userCancelled: case .userCancelled:
return "用户取消购买" return "User cancels the purchase."
case .restoreFailed: case .restoreFailed:
return "恢复购买失败" return "Failed to restore purchase."
} }
} }
} }
...@@ -68,9 +68,12 @@ class IAPManager: NSObject { ...@@ -68,9 +68,12 @@ class IAPManager: NSObject {
private var lifetimeProduct: SKProduct? private var lifetimeProduct: SKProduct?
private var state: PayState = .subscribe private var state: PayState = .subscribe
//购买操作的完成回调
private var purchaseCompletion: ((Result<Bool, IAPError>) -> Void)? private var purchaseCompletion: ((Result<Bool, IAPError>) -> Void)?
//恢复购买的完成回调
private var restoreCompletion: ((Result<Bool, IAPError>) -> Void)? private var restoreCompletion: ((Result<Bool, IAPError>) -> Void)?
private var productRequestCompletion: (((SKProduct,SKProduct)?) -> Void)? //获取商品信息的完成回调
private var productRequestCompletion: (((SKProduct?,SKProduct?)?) -> Void)?
var isSubscribed = false { var isSubscribed = false {
didSet { didSet {
...@@ -80,14 +83,6 @@ class IAPManager: NSObject { ...@@ -80,14 +83,6 @@ class IAPManager: NSObject {
} }
} }
var isNoAd = false{
didSet {
if isSubscribed != oldValue {
NotificationCenter.default.post(name: .subscriptionStatusChanged, object: nil)
}
}
}
// MARK: - Initialization // MARK: - Initialization
private override init() { private override init() {
super.init() super.init()
...@@ -103,16 +98,18 @@ class IAPManager: NSObject { ...@@ -103,16 +98,18 @@ class IAPManager: NSObject {
extension IAPManager { extension IAPManager {
// 获取订阅内购商品信息 // 获取订阅内购商品信息
func fetchProducts(completion: @escaping (_ weekPord:SKProduct,_ lifePord:SKProduct) -> Void) { func fetchProducts(completion: @escaping ((SKProduct?,SKProduct?)?) -> Void) {
// 先检查缓存 // 先检查缓存
if let cachedProducts = getCachedProducts() { if let cachedProducts = getCachedProducts() {
// completion(cachedProducts)
// 后台更新最新数据 // 后台更新最新数据
self.weekProduct = cachedProducts.filter{$0.productIdentifier == ProductID.weekMember}.first
self.lifetimeProduct = cachedProducts.filter{$0.productIdentifier == ProductID.lifetimeMember}.first
completion((self.weekProduct,self.lifetimeProduct))
refreshProducts() refreshProducts()
return return
} }
// productRequestCompletion = completion productRequestCompletion = completion
let request = SKProductsRequest(productIdentifiers: Set(ProductID.all)) let request = SKProductsRequest(productIdentifiers: Set(ProductID.all))
request.delegate = self request.delegate = self
request.start() request.start()
...@@ -123,36 +120,71 @@ extension IAPManager { ...@@ -123,36 +120,71 @@ extension IAPManager {
DispatchQueue.global().asyncAfter(deadline: .now() + productRequestTimeout) { [weak self] in DispatchQueue.global().asyncAfter(deadline: .now() + productRequestTimeout) { [weak self] in
guard let weakSelf = self else { return } guard let weakSelf = self else { return }
request.cancel() request.cancel()
// self?.productRequestCompletion?(nil) weakSelf.productRequestCompletion?(nil)
BackgroundTaskManager.share.endTask() BackgroundTaskManager.share.endTask()
} }
} }
// 检查订阅信息
/// - Parameter completion: 回调闭包,返回订阅状态和到期时间
func checkSubscriptionState(completion: @escaping (_ isSubscribed: Bool, _ expiresDate: Date?) -> Void) {
verifyReceiptWithApple { result in
switch result {
case .success(let receipt):
// 打印完整收据信息,方便调试
print("收据信息:\(receipt)")
let status = self.checkSubscriptionStatus(receiptInfo: receipt)
DispatchQueue.main.async {
completion(status.isActive, status.expiresDate)
// 更新本地订阅状态
self.isSubscribed = status.isActive
#if DEBUG
if let expDate = status.expiresDate {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
Print("订阅状态:\(status.isActive ? "已订阅" : "未订阅"),到期时间:\(formatter.string(from: expDate))")
}
#endif
}
case .failure(_):
// 处理错误情况
self.refreshReceipt()
completion(false, nil)
}
}
}
func purchase(_ state: PayState = .subscribe, completion: @escaping (Result<Bool, IAPError>) -> Void) { func purchase(_ state: PayState = .subscribe, completion: @escaping (Result<Bool, IAPError>) -> Void) {
if state == .subscribe,weekProduct == nil,SKPaymentQueue.canMakePayments(){ if state == .subscribe,weekProduct == nil{
completion(.failure(.noProductsFound)) completion(.failure(.noProductsFound))
return return
} }
if state == .nonConsumable,lifetimeProduct == nil,SKPaymentQueue.canMakePayments(){ if state == .nonConsumable,lifetimeProduct == nil{
completion(.failure(.noProductsFound)) completion(.failure(.noProductsFound))
return return
} }
guard SKPaymentQueue.canMakePayments() else{
return
}
self.state = state self.state = state
self.purchaseCompletion = completion self.purchaseCompletion = completion
let payment = SKPayment(product: state == .subscribe ? weekProduct! : lifetimeProduct!) let payment = SKPayment(product: state == .subscribe ? weekProduct! : lifetimeProduct!)
SKPaymentQueue.default().add(payment) SKPaymentQueue.default().add(payment)
alert.show("正在处理购买请求...", "") alert.show("Processing the purchase request...", "")
} }
func restore(_ state: PayState = .subscribe, completion: @escaping (Result<Bool, IAPError>) -> Void) { func restore(_ state: PayState = .subscribe, completion: @escaping (Result<Bool, IAPError>) -> Void) {
self.state = state self.state = state
self.restoreCompletion = completion self.restoreCompletion = completion
SKPaymentQueue.default().restoreCompletedTransactions() SKPaymentQueue.default().restoreCompletedTransactions()
alert.show("正在恢复购买...", "") alert.show("Restoring purchase...", "")
} }
} }
...@@ -196,12 +228,16 @@ private extension IAPManager { ...@@ -196,12 +228,16 @@ private extension IAPManager {
func handlePurchaseResult(_ transaction: SKPaymentTransaction) { func handlePurchaseResult(_ transaction: SKPaymentTransaction) {
switch transaction.transactionState { switch transaction.transactionState {
case .purchased, .restored: case .purchased:
verifyPurchase(transaction) verifyPurchase(transaction)
case .failed: case .failed:
handleFailedTransaction(transaction) handleFailedTransaction(transaction)
case .purchasing: case .purchasing:
Print("购买处理中...") Print("购买处理中...")
case .restored:
restore { _ in
}
default: default:
break break
} }
...@@ -214,15 +250,22 @@ private extension IAPManager { ...@@ -214,15 +250,22 @@ private extension IAPManager {
switch result { switch result {
case .success(let receipt): case .success(let receipt):
let status = self.checkSubscriptionStatus(receiptInfo: receipt) let status = self.checkSubscriptionStatus(receiptInfo: receipt)
self.isNoAd = status.isActive
self.isSubscribed = status.isActive self.isSubscribed = status.isActive
if status.isActive {
if transaction.transactionState == .purchased { if transaction.transactionState == .purchased {
self.purchaseCompletion?(.success(true)) self.purchaseCompletion?(.success(true))
} else { } else {
self.restoreCompletion?(.success(true)) self.restoreCompletion?(.success(true))
} }
} else {
// 订阅状态验证失败
if transaction.transactionState == .purchased {
self.purchaseCompletion?(.failure(.receiptValidationFailure(nil)))
} else {
self.restoreCompletion?(.failure(.receiptValidationFailure(nil)))
}
}
case .failure(let error): case .failure(let error):
if transaction.transactionState == .purchased { if transaction.transactionState == .purchased {
self.purchaseCompletion?(.failure(.receiptValidationFailure(error))) self.purchaseCompletion?(.failure(.receiptValidationFailure(error)))
...@@ -325,37 +368,6 @@ private extension IAPManager { ...@@ -325,37 +368,6 @@ private extension IAPManager {
} }
task.resume() task.resume()
} }
func checkSubscriptionStatus(receiptInfo: [String: Any]) -> (isActive: Bool, isTrial: Bool, expiresDate: Date?) {
guard let latestReceiptInfo = receiptInfo["latest_receipt_info"] as? [[String: Any]],
let lastReceipt = latestReceiptInfo.first else {
return (false, false, nil)
}
let isTrial = (lastReceipt["is_trial_period"] as? String) == "true"
var expiresDate: Date?
if let expiresDateMs = lastReceipt["expires_date_ms"] as? String,
let timeInterval = TimeInterval(expiresDateMs) {
expiresDate = Date(timeIntervalSince1970: timeInterval / 1000.0)
} else if let expiresDateString = lastReceipt["expires_date"] as? String {
let formatter = ISO8601DateFormatter()
expiresDate = formatter.date(from: expiresDateString)
}
let isActive = expiresDate?.compare(Date()) == .orderedDescending
#if DEBUG
if let expDate = expiresDate {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
Print("订阅状态:\(isActive ? "已订阅" : "未订阅"),到期时间:\(formatter.string(from: expDate))")
}
#endif
return (isActive, isTrial, expiresDate)
}
} }
...@@ -369,22 +381,18 @@ extension IAPManager: SKProductsRequestDelegate { ...@@ -369,22 +381,18 @@ extension IAPManager: SKProductsRequestDelegate {
BackgroundTaskManager.share.endTask() BackgroundTaskManager.share.endTask()
return return
} }
// 拿到请求下来的商品信息
self.weekProduct = products.filter{$0.productIdentifier == ProductID.weekMember}.first
self.lifetimeProduct = products.filter{$0.productIdentifier == ProductID.lifetimeMember}.first
let week = products.filter{$0.productIdentifier == ProductID.weekMember}.first // 缓存
let life = products.filter{$0.productIdentifier == ProductID.lifetimeMember}.first if let week = self.weekProduct,let life = self.lifetimeProduct{
cacheProducts([week,life])
}
// var sortedProducts = products
// if products.count >= 2 {
// sortedProducts = products.sorted { $0.productIdentifier == productIdentifiers.first }
// }
//
// self.products = sortedProducts
// cacheProducts(sortedProducts)
//
DispatchQueue.main.async { [weak self] in DispatchQueue.main.async { [weak self] in
// self?.productRequestCompletion?((week,life)) guard let weakSelf = self else { return }
self?.productRequestCompletion?((weakSelf.weekProduct,weakSelf.lifetimeProduct))
BackgroundTaskManager.share.endTask() BackgroundTaskManager.share.endTask()
} }
} }
...@@ -397,20 +405,110 @@ extension IAPManager: SKProductsRequestDelegate { ...@@ -397,20 +405,110 @@ extension IAPManager: SKProductsRequestDelegate {
// MARK: - SKPaymentTransactionObserver // MARK: - SKPaymentTransactionObserver
extension IAPManager: SKPaymentTransactionObserver { extension IAPManager: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
guard let transaction = transactions.first else { return } guard let transaction = transactions.first else { return }
print("交易状态变化:\(transaction.transactionState.rawValue)")
print("商品ID:\(transaction.payment.productIdentifier)")
if let error = transaction.error {
print("错误信息:\(error.localizedDescription)")
}
handlePurchaseResult(transaction) handlePurchaseResult(transaction)
} }
/** 恢复购买 */
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
restoreCompletion?(.success(true)) // 刷新订阅状态
alert.disMiss() checkSubscriptionState { [weak self] isSubscribed, expiresDate in
guard let self = self else { return }
// 更新恢复购买的结果
if isSubscribed {
self.restoreCompletion?(.success(true))
} else {
self.restoreCompletion?(.failure(.restoreFailed(nil)))
}
self.alert.disMiss()
}
} }
/** 恢复失败 */
func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) { func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
restoreCompletion?(.failure(.restoreFailed(error))) restoreCompletion?(.failure(.restoreFailed(error)))
alert.disMiss() alert.disMiss()
} }
/** 刷新收据 */
func refreshReceipt() {
let request = SKReceiptRefreshRequest()
request.delegate = self
request.start()
}
}
extension IAPManager{
func checkSubscriptionStatus(receiptInfo: [String: Any]) -> (isActive: Bool, isTrial: Bool, expiresDate: Date?) {
// 首先检查 in_app 购买记录
if let receipt = receiptInfo["receipt"] as? [String: Any],
let inAppPurchases = receipt["in_app"] as? [[String: Any]] {
// 检查是否存在永久商品购买记录
let hasLifetimePurchase = inAppPurchases.contains { purchase in
return purchase["product_id"] as? String == ProductID.lifetimeMember
}
if hasLifetimePurchase {
print("检测到永久商品购买记录")
return (true, false, nil)
}
}
// 如果没有永久商品,继续检查订阅
guard let latestReceiptInfo = receiptInfo["latest_receipt_info"] as? [[String: Any]] else {
print("没有找到任何购买记录")
return (false, false, nil)
}
// 按过期时间排序,确保获取最新的订阅记录
let sortedReceipts = latestReceiptInfo.sorted { receipt1, receipt2 in
let date1 = getExpiryDate(from: receipt1) ?? Date.distantPast
let date2 = getExpiryDate(from: receipt2) ?? Date.distantPast
return date1 > date2
}
guard let lastReceipt = sortedReceipts.first else {
return (false, false, nil)
}
// 解析试用期状态
let isTrial = (lastReceipt["is_trial_period"] as? String) == "true"
// 获取过期时间
let expiresDate = getExpiryDate(from: lastReceipt)
let isActive = expiresDate?.compare(Date()) == .orderedDescending
#if DEBUG
if let expDate = expiresDate {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
print("订阅状态:\(isActive ? "已订阅" : "未订阅"),到期时间:\(formatter.string(from: expDate))")
}
#endif
return (isActive, isTrial, expiresDate)
}
// 辅助方法:解析过期时间
private func getExpiryDate(from receipt: [String: Any]) -> Date? {
if let expiresDateMs = receipt["expires_date_ms"] as? String,
let timeInterval = TimeInterval(expiresDateMs) {
return Date(timeIntervalSince1970: timeInterval / 1000.0)
} else if let expiresDateString = receipt["expires_date"] as? String {
let formatter = ISO8601DateFormatter()
return formatter.date(from: expiresDateString)
}
return nil
}
} }
// MARK: - Notification Names // MARK: - Notification Names
......
...@@ -60,12 +60,12 @@ class ChargeInfoViewController:BaseViewController { ...@@ -60,12 +60,12 @@ class ChargeInfoViewController:BaseViewController {
} }
} }
if HomePayModel.share.isNoAd == false && isFree != true { if IAPManager.share.isSubscribed == false && isFree != true {
// 弹出内购页面 // 弹出内购页面
HomePayViewController.show { HomePayViewController.show {
// 再次判断下 // 再次判断下
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
// 弹出提示框 // 弹出提示框
let alertView = AdvTipSelectView(frame: self.view.bounds) let alertView = AdvTipSelectView(frame: self.view.bounds)
alertView.selectType = .selectTypeSetAnimation alertView.selectType = .selectTypeSetAnimation
......
...@@ -327,9 +327,10 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo ...@@ -327,9 +327,10 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo
return return
} }
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
// 弹出提示框 // 弹出提示框
let alertView = AdvTipSelectView(frame: self.view.bounds) let alertView = AdvTipSelectView(frame: self.view.bounds)
alertView.selectType = .selectTypeCompressPhoto alertView.selectType = .selectTypeCompressPhoto
......
...@@ -58,7 +58,7 @@ class CompressNavView : UIView { ...@@ -58,7 +58,7 @@ class CompressNavView : UIView {
} }
@objc private func proBtnClick() { @objc private func proBtnClick() {
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
HomePayViewController.show {} HomePayViewController.show {}
}else { }else {
let vc : PayCompletedViewController = PayCompletedViewController() let vc : PayCompletedViewController = PayCompletedViewController()
......
...@@ -104,6 +104,7 @@ class HomeInfoViewController:BaseViewController { ...@@ -104,6 +104,7 @@ class HomeInfoViewController:BaseViewController {
self?.tablewView.deleteModel(array: imgs) self?.tablewView.deleteModel(array: imgs)
} }
}) })
self.setDefaultPage()
} }
func updateFreeTimes(){ func updateFreeTimes(){
...@@ -117,8 +118,6 @@ class HomeInfoViewController:BaseViewController { ...@@ -117,8 +118,6 @@ class HomeInfoViewController:BaseViewController {
} }
} }
setDefaultPage()
} }
} }
...@@ -132,7 +131,7 @@ class HomeInfoViewController:BaseViewController { ...@@ -132,7 +131,7 @@ class HomeInfoViewController:BaseViewController {
guard let self = self else { return } guard let self = self else { return }
// 首先看是否订阅 // 首先看是否订阅
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
// 没有订阅 // 没有订阅
let view : AdvTipDeleteView = AdvTipDeleteView(frame: self.view.bounds) let view : AdvTipDeleteView = AdvTipDeleteView(frame: self.view.bounds)
...@@ -143,7 +142,7 @@ class HomeInfoViewController:BaseViewController { ...@@ -143,7 +142,7 @@ class HomeInfoViewController:BaseViewController {
// 当免费次数用完以后,无论删除多少都需要弹出广告 // 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 { if freeCount <= 0 {
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
// 弹出单个删除类型 // 弹出单个删除类型
view.deleteType = .deletePhotoOne view.deleteType = .deletePhotoOne
view.getOtherInfoByType(type: self.type!) view.getOtherInfoByType(type: self.type!)
...@@ -161,7 +160,7 @@ class HomeInfoViewController:BaseViewController { ...@@ -161,7 +160,7 @@ class HomeInfoViewController:BaseViewController {
if tempArray.count > freeDeleteCount { if tempArray.count > freeDeleteCount {
// 弹出多个删除类型 // 弹出多个删除类型
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: self.type!) view.getOtherInfoByType(type: self.type!)
...@@ -184,7 +183,7 @@ class HomeInfoViewController:BaseViewController { ...@@ -184,7 +183,7 @@ class HomeInfoViewController:BaseViewController {
freeDeleteCount = 5 freeDeleteCount = 5
// 弹出多个删除类型 // 弹出多个删除类型
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: self.type!) view.getOtherInfoByType(type: self.type!)
...@@ -198,7 +197,7 @@ class HomeInfoViewController:BaseViewController { ...@@ -198,7 +197,7 @@ class HomeInfoViewController:BaseViewController {
freeDeleteCount = tempArray.count - 1 freeDeleteCount = tempArray.count - 1
// 弹出多个删除类型 // 弹出多个删除类型
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: self.type!) view.getOtherInfoByType(type: self.type!)
...@@ -227,7 +226,7 @@ class HomeInfoViewController:BaseViewController { ...@@ -227,7 +226,7 @@ class HomeInfoViewController:BaseViewController {
} }
} }
if isMore == true{ if isMore == true{
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
self.popAdverTisement() self.popAdverTisement()
// 广告看完再结束 // 广告看完再结束
AdvManager.shared.finisedCallBack = { AdvManager.shared.finisedCallBack = {
......
...@@ -472,7 +472,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -472,7 +472,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
} }
// 首先看是否订阅 // 首先看是否订阅
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
// 没有订阅 // 没有订阅
let view : AdvTipDeleteView = AdvTipDeleteView(frame: self.view.bounds) let view : AdvTipDeleteView = AdvTipDeleteView(frame: self.view.bounds)
view.dataSource = self.selectedModel view.dataSource = self.selectedModel
...@@ -482,7 +482,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -482,7 +482,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
// 当免费次数用完以后,无论删除多少都需要弹出广告 // 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 { if freeCount <= 0 {
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
// 弹出单个删除类型 // 弹出单个删除类型
view.deleteType = .deletePhotoOne view.deleteType = .deletePhotoOne
view.getOtherInfoByType(type: .Other) view.getOtherInfoByType(type: .Other)
...@@ -500,7 +500,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -500,7 +500,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
if tempArray.count > freeDeleteCount { if tempArray.count > freeDeleteCount {
// 弹出多个删除类型 // 弹出多个删除类型
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .Other) view.getOtherInfoByType(type: .Other)
...@@ -523,7 +523,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -523,7 +523,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
freeDeleteCount = 5 freeDeleteCount = 5
// 弹出多个删除类型 // 弹出多个删除类型
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .Other) view.getOtherInfoByType(type: .Other)
...@@ -537,7 +537,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -537,7 +537,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
freeDeleteCount = tempArray.count - 1 freeDeleteCount = tempArray.count - 1
// 弹出多个删除类型 // 弹出多个删除类型
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .Other) view.getOtherInfoByType(type: .Other)
...@@ -556,7 +556,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -556,7 +556,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
} }
view.deleteButtonClickCallback = {isMore,deleteCount in view.deleteButtonClickCallback = {isMore,deleteCount in
if isMore == true { if isMore == true {
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
self.popAdverTisement() self.popAdverTisement()
// 广告看完再结束 // 广告看完再结束
AdvManager.shared.finisedCallBack = { AdvManager.shared.finisedCallBack = {
......
...@@ -375,7 +375,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -375,7 +375,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
} }
// 首先看是否订阅 // 首先看是否订阅
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
// 没有订阅 // 没有订阅
let view : AdvTipDeleteView = AdvTipDeleteView(frame: self.view.bounds) let view : AdvTipDeleteView = AdvTipDeleteView(frame: self.view.bounds)
view.dataSource = self.selectedModel view.dataSource = self.selectedModel
...@@ -385,7 +385,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -385,7 +385,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
// 当免费次数用完以后,无论删除多少都需要弹出广告 // 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 { if freeCount <= 0 {
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
// 弹出单个删除类型 // 弹出单个删除类型
view.deleteType = .deletePhotoOne view.deleteType = .deletePhotoOne
view.getOtherInfoByType(type: .videos) view.getOtherInfoByType(type: .videos)
...@@ -403,7 +403,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -403,7 +403,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
if tempArray.count > freeDeleteCount { if tempArray.count > freeDeleteCount {
// 弹出多个删除类型 // 弹出多个删除类型
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .videos) view.getOtherInfoByType(type: .videos)
...@@ -426,7 +426,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -426,7 +426,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
freeDeleteCount = 5 freeDeleteCount = 5
// 弹出多个删除类型 // 弹出多个删除类型
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .videos) view.getOtherInfoByType(type: .videos)
...@@ -441,7 +441,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -441,7 +441,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
freeDeleteCount = tempArray.count - 1 freeDeleteCount = tempArray.count - 1
// 弹出多个删除类型 // 弹出多个删除类型
HomePayViewController.show { HomePayViewController.show {
if HomePayModel.share.isNoAd == false{ if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .videos) view.getOtherInfoByType(type: .videos)
...@@ -460,7 +460,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -460,7 +460,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
} }
view.deleteButtonClickCallback = {isMore,deleteCount in view.deleteButtonClickCallback = {isMore,deleteCount in
if isMore == true{ if isMore == true{
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
self.popAdverTisement() self.popAdverTisement()
// 广告看完再结束 // 广告看完再结束
AdvManager.shared.finisedCallBack = { AdvManager.shared.finisedCallBack = {
......
...@@ -188,7 +188,7 @@ class HomeViewController:BaseViewController { ...@@ -188,7 +188,7 @@ class HomeViewController:BaseViewController {
if let cIndex = index as? Int { if let cIndex = index as? Int {
// 先走广告策略 // 先走广告策略
if AdvManager.shared.advTimeAfterInAPP <= 0 && HomePayModel.share.isNoAd == false { if AdvManager.shared.advTimeAfterInAPP <= 0 && IAPManager.share.isSubscribed == false {
AdvManager.shared.showInterstitialAd(vc: self) AdvManager.shared.showInterstitialAd(vc: self)
}else { }else {
junmToModule(cIndex, self) junmToModule(cIndex, self)
...@@ -287,7 +287,7 @@ class HomeViewController:BaseViewController { ...@@ -287,7 +287,7 @@ class HomeViewController:BaseViewController {
if !isShowPay { if !isShowPay {
isShowPay = true isShowPay = true
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
HomePayViewController.show { HomePayViewController.show {
NotificationManager().configNotifications() NotificationManager().configNotifications()
} }
......
...@@ -79,7 +79,7 @@ extension HomeNavView { ...@@ -79,7 +79,7 @@ extension HomeNavView {
homeNavViewModel.pushToDetailController(currentView: self, destnationController: settingViewController) homeNavViewModel.pushToDetailController(currentView: self, destnationController: settingViewController)
} }
@objc private func proBtnClick() { @objc private func proBtnClick() {
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
HomePayViewController.show {} HomePayViewController.show {}
}else { }else {
let vc : PayCompletedViewController = PayCompletedViewController() let vc : PayCompletedViewController = PayCompletedViewController()
......
...@@ -38,12 +38,15 @@ class HomePayDueView: UIView { ...@@ -38,12 +38,15 @@ class HomePayDueView: UIView {
freePrice.font = UIFont.scaledSystemFont(ofSize: 12, weight: .regular) freePrice.font = UIFont.scaledSystemFont(ofSize: 12, weight: .regular)
freeTime.isHidden = false
freePrice.isHidden = false
saveL.isHidden = true
} }
func reloadUI(_ type:Int,product1:SKProduct?,product2:SKProduct?){ func reloadUI(_ type:Int,week:SKProduct?,life:SKProduct?){
guard let pord = product1,let pord1 = product2 else { return } guard let pord = week,let pord1 = life else { return }
if type == 0{ if type == 0{
// 免费试用订阅 // 免费试用订阅
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Save 89%" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wpu-I6-q6N"> <label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Save 89%" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wpu-I6-q6N">
<rect key="frame" x="311" y="29.666666666666671" width="85" height="21"/> <rect key="frame" x="311" y="29.666666666666671" width="85" height="21"/>
<color key="backgroundColor" red="0.32156862749999998" green="0.78039215689999997" blue="0.46274509800000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="backgroundColor" red="0.32156862749999998" green="0.78039215689999997" blue="0.46274509800000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints> <constraints>
......
...@@ -381,18 +381,18 @@ class HomePayView:UIView { ...@@ -381,18 +381,18 @@ class HomePayView:UIView {
} }
var product : SKProduct? var weekProduct : SKProduct?
var product1 : SKProduct? var lifeProduct : SKProduct?
func reloadSKPorduct(product:SKProduct?,product1:SKProduct?){ func reloadSKPorduct(week:SKProduct?,life:SKProduct?){
self.product = product self.weekProduct = week
self.product1 = product1 self.lifeProduct = life
payDueView.reloadUI(type, product1: product, product2: product1) payDueView.reloadUI(type, week: week, life: life)
trailTitle.attributedText = nil trailTitle.attributedText = nil
if let pord = product{ if let pord = week{
trailTitle.text = "Free for 7 days, then \(pord.localizedPrice)/week" trailTitle.text = "Free for 7 days, then \(pord.localizedPrice)/week"
} }
...@@ -403,14 +403,14 @@ class HomePayView:UIView { ...@@ -403,14 +403,14 @@ class HomePayView:UIView {
contentView2Switch?.isOn = type == 0 contentView2Switch?.isOn = type == 0
payButton?.setTitle(type == 0 ? "Try Free" : "Start Now", for: .normal) payButton?.setTitle(type == 0 ? "Try Free" : "Start Now", for: .normal)
payDueView.reloadUI(type, product1: product, product2: product1) payDueView.reloadUI(type, week: weekProduct, life: lifeProduct)
if let pord = product,type == 0{ if let pord = weekProduct,type == 0{
trailTitle.attributedText = nil trailTitle.attributedText = nil
trailTitle.text = "Free for 7 days, then \(pord.localizedPrice)/week" trailTitle.text = "Free for 7 days, then \(pord.localizedPrice)/week"
} }
if let pord = product1,type == 1{ if let pord = lifeProduct,type == 1{
trailTitle.text = "\(pord.localizedPrice)/Lifetime" trailTitle.text = "\(pord.localizedPrice)/Lifetime"
setAttributedString(price: pord.localizedPrice) setAttributedString(price: pord.localizedPrice)
} }
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
import UIKit import UIKit
import StoreKit import StoreKit
import SVProgressHUD
class HomePayViewController:UIViewController { class HomePayViewController:UIViewController {
...@@ -31,11 +32,7 @@ class HomePayViewController:UIViewController { ...@@ -31,11 +32,7 @@ class HomePayViewController:UIViewController {
make.left.right.top.bottom.equalToSuperview() make.left.right.top.bottom.equalToSuperview()
} }
} }
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
HomePayModel.share.fetchProducts()
}
override func viewDidAppear(_ animated: Bool) { override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated) super.viewDidAppear(animated)
...@@ -108,22 +105,47 @@ class HomePayViewController:UIViewController { ...@@ -108,22 +105,47 @@ class HomePayViewController:UIViewController {
extension HomePayViewController { extension HomePayViewController {
private func setPrice() -> Void { private func setPrice() -> Void {
guard currentProduct != nil , // guard currentProduct != nil ,
let p1 = currentProduct?.first, // let p1 = currentProduct?.first,
let p2 = currentProduct?.last // let p2 = currentProduct?.last
else { return } // else { return }
homePayView?.reloadSKPorduct(product: p1, product1: p2) // homePayView?.reloadSKPorduct(product: p1, product1: p2)
} }
private func storeKeD() -> Void { private func storeKeD() -> Void {
HomePayModel.share.storeCall = {[weak self] products in // HomePayModel.share.storeCall = {[weak self] products in
guard let self = self else { return } // guard let self = self else { return }
self.currentProduct = products // self.currentProduct = products
// }
IAPManager.share.fetchProducts { [weak self] products in
guard let weakSelf = self else { return }
DispatchQueue.main.async {
if let (weekProduct, lifetimeProduct) = products {
weakSelf.homePayView?.reloadSKPorduct(week: weekProduct, life: lifetimeProduct)
}
}
} }
} }
private func payTouch() -> Void { private func payTouch() -> Void {
HomePayModel.share.purchase( (homePayView?.type == 0) ? .Subscribe : .NonConsum ) IAPManager.share.purchase((homePayView?.type == 0) ? .subscribe : .nonConsumable) {[weak self] result in
guard let weakSelf = self else { return }
switch result {
case .success(let success):
Print("内购成功",success)
DispatchQueue.main.async {
SVProgressHUD.showSuccess(withStatus: "purchase succeeds")
weakSelf.dismiss(animated: true)
}
case .failure(let failure):
Print("内购失败",failure)
DispatchQueue.main.async {
SVProgressHUD.showError(withStatus: failure.localizedDescription)
}
}
}
} }
private func ppClick() { private func ppClick() {
...@@ -145,7 +167,10 @@ extension HomePayViewController { ...@@ -145,7 +167,10 @@ extension HomePayViewController {
} }
private func restoreClick() { private func restoreClick() {
HomePayModel.share.restore() // HomePayModel.share.restore()
IAPManager.share.restore { result in
}
} }
class func show( _ compate:@escaping(()->Void)) -> Void { class func show( _ compate:@escaping(()->Void)) -> Void {
......
...@@ -19,6 +19,7 @@ class PMLoadingHUD{ ...@@ -19,6 +19,7 @@ class PMLoadingHUD{
}() }()
func show(_ title:String = "Deleting...",_ subTitle:String = "Please wait on the screen. This might take several minutes."){ func show(_ title:String = "Deleting...",_ subTitle:String = "Please wait on the screen. This might take several minutes."){
disMiss()
DispatchQueue.main.async { DispatchQueue.main.async {
KEYWINDOW()?.addSubview(self.loadingView) KEYWINDOW()?.addSubview(self.loadingView)
self.loadingView.setTitleaAndSubTitle(title: title, subTitle: subTitle) self.loadingView.setTitleaAndSubTitle(title: title, subTitle: subTitle)
......
...@@ -238,7 +238,7 @@ class SecretViewController: BaseViewController { ...@@ -238,7 +238,7 @@ class SecretViewController: BaseViewController {
b.callback = { [weak self] in b.callback = { [weak self] in
guard let self = self else { return } guard let self = self else { return }
if b.state == .add { if b.state == .add {
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
// 添加的时候需要先弹出广告 // 添加的时候需要先弹出广告
popAdverTisement() popAdverTisement()
AdvManager.shared.finisedCallBack = { AdvManager.shared.finisedCallBack = {
......
...@@ -21,7 +21,7 @@ class SettingViewHeaderCell : UITableViewCell { ...@@ -21,7 +21,7 @@ class SettingViewHeaderCell : UITableViewCell {
lazy var fLabel : UILabel = { lazy var fLabel : UILabel = {
let label = UILabel(); let label = UILabel();
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
label.text = "Unlock Unlimited Access" label.text = "Unlock Unlimited Access"
}else { }else {
label.text = "Phone Manager Pro Edition" label.text = "Phone Manager Pro Edition"
...@@ -36,7 +36,7 @@ class SettingViewHeaderCell : UITableViewCell { ...@@ -36,7 +36,7 @@ class SettingViewHeaderCell : UITableViewCell {
lazy var sLabel : UILabel = { lazy var sLabel : UILabel = {
let label = UILabel() let label = UILabel()
label.numberOfLines = 0 label.numberOfLines = 0
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
label.text = "Enjoy unlimited access with all Cleanup features" label.text = "Enjoy unlimited access with all Cleanup features"
}else{ }else{
label.text = "You can now access all Phone Manager features without restrictions" label.text = "You can now access all Phone Manager features without restrictions"
...@@ -101,7 +101,7 @@ class SettingViewHeaderCell : UITableViewCell { ...@@ -101,7 +101,7 @@ class SettingViewHeaderCell : UITableViewCell {
make.left.equalToSuperview().offset(15) make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15) make.right.equalToSuperview().offset(-15)
make.top.equalTo(fLabel.snp.bottom).offset(4) make.top.equalTo(fLabel.snp.bottom).offset(4)
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
make.height.equalTo(20) make.height.equalTo(20)
}else{ }else{
make.height.equalTo(42) make.height.equalTo(42)
...@@ -116,7 +116,7 @@ class SettingViewHeaderCell : UITableViewCell { ...@@ -116,7 +116,7 @@ class SettingViewHeaderCell : UITableViewCell {
self.moreButton.snp.makeConstraints { make in self.moreButton.snp.makeConstraints { make in
make.width.equalTo(245) make.width.equalTo(245)
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
make.height.equalTo(46) make.height.equalTo(46)
}else{ }else{
make.height.equalTo(0) make.height.equalTo(0)
......
...@@ -138,7 +138,7 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV ...@@ -138,7 +138,7 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 0 { if indexPath.section == 0 {
if HomePayModel.share.isNoAd == false { if IAPManager.share.isSubscribed == false {
return 385 return 385
}else{ }else{
return 339 return 339
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment