Commit 88d52922 authored by shenyong's avatar shenyong

内购管理类重写

parent 7a003868
......@@ -37,8 +37,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
// 首页缓存
findHomeData()
// 获取价格
HomePayModel.share.fetchProducts()
// 获取内购价格
IAPManager.share.fetchProducts { p in
Print("获取内购商品信息",p as Any)
}
// HomePayModel.share.fetchProducts()
// 初始化广告SDK
AdvManager.shared.initAdertisementSDK()
......@@ -266,10 +269,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
private func setupDefault() {
// 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
switch status {
......
......@@ -22,17 +22,17 @@ enum IAPError: Error {
var localizedDescription: String {
switch self {
case .noProductsFound:
return "未找到可购买的商品"
return "No available goods for purchase were found."
case .purchaseFailure:
return "购买失败"
return "Purchase failed"
case .receiptValidationFailure:
return "订单验证失败"
return "Order verification failed."
case .networkError:
return "网络连接错误"
return "Network connection error"
case .userCancelled:
return "用户取消购买"
return "User cancels the purchase."
case .restoreFailed:
return "恢复购买失败"
return "Failed to restore purchase."
}
}
}
......@@ -68,9 +68,12 @@ class IAPManager: NSObject {
private var lifetimeProduct: SKProduct?
private var state: PayState = .subscribe
//购买操作的完成回调
private var purchaseCompletion: ((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 {
didSet {
......@@ -80,14 +83,6 @@ class IAPManager: NSObject {
}
}
var isNoAd = false{
didSet {
if isSubscribed != oldValue {
NotificationCenter.default.post(name: .subscriptionStatusChanged, object: nil)
}
}
}
// MARK: - Initialization
private override init() {
super.init()
......@@ -103,16 +98,18 @@ class IAPManager: NSObject {
extension IAPManager {
// 获取订阅内购商品信息
func fetchProducts(completion: @escaping (_ weekPord:SKProduct,_ lifePord:SKProduct) -> Void) {
func fetchProducts(completion: @escaping ((SKProduct?,SKProduct?)?) -> Void) {
// 先检查缓存
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()
return
}
// productRequestCompletion = completion
productRequestCompletion = completion
let request = SKProductsRequest(productIdentifiers: Set(ProductID.all))
request.delegate = self
request.start()
......@@ -123,36 +120,71 @@ extension IAPManager {
DispatchQueue.global().asyncAfter(deadline: .now() + productRequestTimeout) { [weak self] in
guard let weakSelf = self else { return }
request.cancel()
// self?.productRequestCompletion?(nil)
weakSelf.productRequestCompletion?(nil)
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) {
if state == .subscribe,weekProduct == nil,SKPaymentQueue.canMakePayments(){
if state == .subscribe,weekProduct == nil{
completion(.failure(.noProductsFound))
return
}
if state == .nonConsumable,lifetimeProduct == nil,SKPaymentQueue.canMakePayments(){
if state == .nonConsumable,lifetimeProduct == nil{
completion(.failure(.noProductsFound))
return
}
guard SKPaymentQueue.canMakePayments() else{
return
}
self.state = state
self.purchaseCompletion = completion
let payment = SKPayment(product: state == .subscribe ? weekProduct! : lifetimeProduct!)
SKPaymentQueue.default().add(payment)
alert.show("正在处理购买请求...", "")
alert.show("Processing the purchase request...", "")
}
func restore(_ state: PayState = .subscribe, completion: @escaping (Result<Bool, IAPError>) -> Void) {
self.state = state
self.restoreCompletion = completion
SKPaymentQueue.default().restoreCompletedTransactions()
alert.show("正在恢复购买...", "")
alert.show("Restoring purchase...", "")
}
}
......@@ -196,12 +228,16 @@ private extension IAPManager {
func handlePurchaseResult(_ transaction: SKPaymentTransaction) {
switch transaction.transactionState {
case .purchased, .restored:
case .purchased:
verifyPurchase(transaction)
case .failed:
handleFailedTransaction(transaction)
case .purchasing:
Print("购买处理中...")
case .restored:
restore { _ in
}
default:
break
}
......@@ -214,15 +250,22 @@ private extension IAPManager {
switch result {
case .success(let receipt):
let status = self.checkSubscriptionStatus(receiptInfo: receipt)
self.isNoAd = status.isActive
self.isSubscribed = status.isActive
if transaction.transactionState == .purchased {
self.purchaseCompletion?(.success(true))
} else {
self.restoreCompletion?(.success(true))
}
if status.isActive {
if transaction.transactionState == .purchased {
self.purchaseCompletion?(.success(true))
} else {
self.restoreCompletion?(.success(true))
}
} else {
// 订阅状态验证失败
if transaction.transactionState == .purchased {
self.purchaseCompletion?(.failure(.receiptValidationFailure(nil)))
} else {
self.restoreCompletion?(.failure(.receiptValidationFailure(nil)))
}
}
case .failure(let error):
if transaction.transactionState == .purchased {
self.purchaseCompletion?(.failure(.receiptValidationFailure(error)))
......@@ -325,37 +368,6 @@ private extension IAPManager {
}
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 {
BackgroundTaskManager.share.endTask()
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
// var sortedProducts = products
// if products.count >= 2 {
// sortedProducts = products.sorted { $0.productIdentifier == productIdentifiers.first }
// }
//
// self.products = sortedProducts
// cacheProducts(sortedProducts)
//
// 缓存
if let week = self.weekProduct,let life = self.lifetimeProduct{
cacheProducts([week,life])
}
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()
}
}
......@@ -397,20 +405,110 @@ extension IAPManager: SKProductsRequestDelegate {
// MARK: - SKPaymentTransactionObserver
extension IAPManager: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
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)
}
/** 恢复购买 */
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) {
restoreCompletion?(.failure(.restoreFailed(error)))
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
......
......@@ -60,12 +60,12 @@ class ChargeInfoViewController:BaseViewController {
}
}
if HomePayModel.share.isNoAd == false && isFree != true {
if IAPManager.share.isSubscribed == false && isFree != true {
// 弹出内购页面
HomePayViewController.show {
// 再次判断下
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
// 弹出提示框
let alertView = AdvTipSelectView(frame: self.view.bounds)
alertView.selectType = .selectTypeSetAnimation
......
......@@ -327,9 +327,10 @@ extension CompressController:WaterfallMutiSectionDelegate,UICollectionViewDataSo
return
}
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
// 弹出提示框
let alertView = AdvTipSelectView(frame: self.view.bounds)
alertView.selectType = .selectTypeCompressPhoto
......
......@@ -58,7 +58,7 @@ class CompressNavView : UIView {
}
@objc private func proBtnClick() {
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
HomePayViewController.show {}
}else {
let vc : PayCompletedViewController = PayCompletedViewController()
......
......@@ -104,6 +104,7 @@ class HomeInfoViewController:BaseViewController {
self?.tablewView.deleteModel(array: imgs)
}
})
self.setDefaultPage()
}
func updateFreeTimes(){
......@@ -117,8 +118,6 @@ class HomeInfoViewController:BaseViewController {
}
}
setDefaultPage()
}
}
......@@ -132,7 +131,7 @@ class HomeInfoViewController:BaseViewController {
guard let self = self else { return }
// 首先看是否订阅
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
// 没有订阅
let view : AdvTipDeleteView = AdvTipDeleteView(frame: self.view.bounds)
......@@ -143,7 +142,7 @@ class HomeInfoViewController:BaseViewController {
// 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 {
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
// 弹出单个删除类型
view.deleteType = .deletePhotoOne
view.getOtherInfoByType(type: self.type!)
......@@ -161,7 +160,7 @@ class HomeInfoViewController:BaseViewController {
if tempArray.count > freeDeleteCount {
// 弹出多个删除类型
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: self.type!)
......@@ -184,7 +183,7 @@ class HomeInfoViewController:BaseViewController {
freeDeleteCount = 5
// 弹出多个删除类型
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: self.type!)
......@@ -198,7 +197,7 @@ class HomeInfoViewController:BaseViewController {
freeDeleteCount = tempArray.count - 1
// 弹出多个删除类型
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: self.type!)
......@@ -227,7 +226,7 @@ class HomeInfoViewController:BaseViewController {
}
}
if isMore == true{
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
self.popAdverTisement()
// 广告看完再结束
AdvManager.shared.finisedCallBack = {
......
......@@ -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)
view.dataSource = self.selectedModel
......@@ -482,7 +482,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
// 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 {
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
// 弹出单个删除类型
view.deleteType = .deletePhotoOne
view.getOtherInfoByType(type: .Other)
......@@ -500,7 +500,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
if tempArray.count > freeDeleteCount {
// 弹出多个删除类型
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .Other)
......@@ -523,7 +523,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
freeDeleteCount = 5
// 弹出多个删除类型
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .Other)
......@@ -537,7 +537,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
freeDeleteCount = tempArray.count - 1
// 弹出多个删除类型
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .Other)
......@@ -556,7 +556,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
}
view.deleteButtonClickCallback = {isMore,deleteCount in
if isMore == true {
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
self.popAdverTisement()
// 广告看完再结束
AdvManager.shared.finisedCallBack = {
......
......@@ -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)
view.dataSource = self.selectedModel
......@@ -385,7 +385,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
// 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 {
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
// 弹出单个删除类型
view.deleteType = .deletePhotoOne
view.getOtherInfoByType(type: .videos)
......@@ -403,7 +403,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
if tempArray.count > freeDeleteCount {
// 弹出多个删除类型
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .videos)
......@@ -426,7 +426,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
freeDeleteCount = 5
// 弹出多个删除类型
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .videos)
......@@ -441,7 +441,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
freeDeleteCount = tempArray.count - 1
// 弹出多个删除类型
HomePayViewController.show {
if HomePayModel.share.isNoAd == false{
if IAPManager.share.isSubscribed == false{
view.deleteType = .deletePhotosMore
view.freeDeleteCount = freeDeleteCount
view.getOtherInfoByType(type: .videos)
......@@ -460,7 +460,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
}
view.deleteButtonClickCallback = {isMore,deleteCount in
if isMore == true{
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
self.popAdverTisement()
// 广告看完再结束
AdvManager.shared.finisedCallBack = {
......
......@@ -188,7 +188,7 @@ class HomeViewController:BaseViewController {
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)
}else {
junmToModule(cIndex, self)
......@@ -287,7 +287,7 @@ class HomeViewController:BaseViewController {
if !isShowPay {
isShowPay = true
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
HomePayViewController.show {
NotificationManager().configNotifications()
}
......
......@@ -79,7 +79,7 @@ extension HomeNavView {
homeNavViewModel.pushToDetailController(currentView: self, destnationController: settingViewController)
}
@objc private func proBtnClick() {
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
HomePayViewController.show {}
}else {
let vc : PayCompletedViewController = PayCompletedViewController()
......
......@@ -38,12 +38,15 @@ class HomePayDueView: UIView {
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{
// 免费试用订阅
......
......@@ -59,7 +59,7 @@
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</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"/>
<color key="backgroundColor" red="0.32156862749999998" green="0.78039215689999997" blue="0.46274509800000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
......
......@@ -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.product1 = product1
payDueView.reloadUI(type, product1: product, product2: product1)
self.weekProduct = week
self.lifeProduct = life
payDueView.reloadUI(type, week: week, life: life)
trailTitle.attributedText = nil
if let pord = product{
if let pord = week{
trailTitle.text = "Free for 7 days, then \(pord.localizedPrice)/week"
}
......@@ -403,14 +403,14 @@ class HomePayView:UIView {
contentView2Switch?.isOn = type == 0
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.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"
setAttributedString(price: pord.localizedPrice)
}
......
......@@ -7,6 +7,7 @@
import UIKit
import StoreKit
import SVProgressHUD
class HomePayViewController:UIViewController {
......@@ -31,11 +32,7 @@ class HomePayViewController:UIViewController {
make.left.right.top.bottom.equalToSuperview()
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
HomePayModel.share.fetchProducts()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
......@@ -108,22 +105,47 @@ class HomePayViewController:UIViewController {
extension HomePayViewController {
private func setPrice() -> Void {
guard currentProduct != nil ,
let p1 = currentProduct?.first,
let p2 = currentProduct?.last
else { return }
homePayView?.reloadSKPorduct(product: p1, product1: p2)
// guard currentProduct != nil ,
// let p1 = currentProduct?.first,
// let p2 = currentProduct?.last
// else { return }
// homePayView?.reloadSKPorduct(product: p1, product1: p2)
}
private func storeKeD() -> Void {
HomePayModel.share.storeCall = {[weak self] products in
guard let self = self else { return }
self.currentProduct = products
// HomePayModel.share.storeCall = {[weak self] products in
// guard let self = self else { return }
// 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 {
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() {
......@@ -145,7 +167,10 @@ extension HomePayViewController {
}
private func restoreClick() {
HomePayModel.share.restore()
// HomePayModel.share.restore()
IAPManager.share.restore { result in
}
}
class func show( _ compate:@escaping(()->Void)) -> Void {
......
......@@ -19,6 +19,7 @@ class PMLoadingHUD{
}()
func show(_ title:String = "Deleting...",_ subTitle:String = "Please wait on the screen. This might take several minutes."){
disMiss()
DispatchQueue.main.async {
KEYWINDOW()?.addSubview(self.loadingView)
self.loadingView.setTitleaAndSubTitle(title: title, subTitle: subTitle)
......
......@@ -238,7 +238,7 @@ class SecretViewController: BaseViewController {
b.callback = { [weak self] in
guard let self = self else { return }
if b.state == .add {
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
// 添加的时候需要先弹出广告
popAdverTisement()
AdvManager.shared.finisedCallBack = {
......
......@@ -21,7 +21,7 @@ class SettingViewHeaderCell : UITableViewCell {
lazy var fLabel : UILabel = {
let label = UILabel();
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
label.text = "Unlock Unlimited Access"
}else {
label.text = "Phone Manager Pro Edition"
......@@ -36,7 +36,7 @@ class SettingViewHeaderCell : UITableViewCell {
lazy var sLabel : UILabel = {
let label = UILabel()
label.numberOfLines = 0
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
label.text = "Enjoy unlimited access with all Cleanup features"
}else{
label.text = "You can now access all Phone Manager features without restrictions"
......@@ -101,7 +101,7 @@ class SettingViewHeaderCell : UITableViewCell {
make.left.equalToSuperview().offset(15)
make.right.equalToSuperview().offset(-15)
make.top.equalTo(fLabel.snp.bottom).offset(4)
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
make.height.equalTo(20)
}else{
make.height.equalTo(42)
......@@ -116,7 +116,7 @@ class SettingViewHeaderCell : UITableViewCell {
self.moreButton.snp.makeConstraints { make in
make.width.equalTo(245)
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
make.height.equalTo(46)
}else{
make.height.equalTo(0)
......
......@@ -138,7 +138,7 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 0 {
if HomePayModel.share.isNoAd == false {
if IAPManager.share.isSubscribed == false {
return 385
}else{
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