Commit 9c1a54f4 authored by yqz's avatar yqz

内购

parent 25267fcb
...@@ -10,11 +10,17 @@ ...@@ -10,11 +10,17 @@
0496DEF32D9E3F58005B2834 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04BD915D2D9D68AD00055CEB /* WidgetKit.framework */; }; 0496DEF32D9E3F58005B2834 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04BD915D2D9D68AD00055CEB /* WidgetKit.framework */; };
0496DEF42D9E3F58005B2834 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04BD915F2D9D68AD00055CEB /* SwiftUI.framework */; }; 0496DEF42D9E3F58005B2834 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04BD915F2D9D68AD00055CEB /* SwiftUI.framework */; };
0496DEFF2D9E3F59005B2834 /* widgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 0496DEF22D9E3F57005B2834 /* widgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 0496DEFF2D9E3F59005B2834 /* widgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 0496DEF22D9E3F57005B2834 /* widgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
04E961E02DA379C400632F13 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04E961DF2DA379C400632F13 /* StoreKit.framework */; };
3A00E856852A8783E544CD7D /* Pods_PhoneManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6028F60B696E2F97EAA2325C /* Pods_PhoneManager.framework */; }; 3A00E856852A8783E544CD7D /* Pods_PhoneManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6028F60B696E2F97EAA2325C /* Pods_PhoneManager.framework */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
0493223D2DA5314500E037A5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = EB388E532D8A61A800629B0D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 041E01052DA3E865000F6C81;
remoteInfo = ChargeShow;
};
0496DEFD2D9E3F59005B2834 /* PBXContainerItemProxy */ = { 0496DEFD2D9E3F59005B2834 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy; isa = PBXContainerItemProxy;
containerPortal = EB388E532D8A61A800629B0D /* Project object */; containerPortal = EB388E532D8A61A800629B0D /* Project object */;
...@@ -42,7 +48,6 @@ ...@@ -42,7 +48,6 @@
dstSubfolderSpec = 13; dstSubfolderSpec = 13;
files = ( files = (
0496DEFF2D9E3F59005B2834 /* widgetExtension.appex in Embed Foundation Extensions */, 0496DEFF2D9E3F59005B2834 /* widgetExtension.appex in Embed Foundation Extensions */,
041E010E2DA3E865000F6C81 /* ChargeShow.appex in Embed Foundation Extensions */,
); );
name = "Embed Foundation Extensions"; name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
...@@ -65,6 +70,13 @@ ...@@ -65,6 +70,13 @@
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
0493223E2DA531CC00E037A5 /* Exceptions for "ChargeShow" folder in "ChargeShow" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
);
target = 041E01052DA3E865000F6C81 /* ChargeShow */;
};
0496DF032D9E3F59005B2834 /* Exceptions for "widget" folder in "widgetExtension" target */ = { 0496DF032D9E3F59005B2834 /* Exceptions for "widget" folder in "widgetExtension" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet; isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = ( membershipExceptions = (
...@@ -84,6 +96,9 @@ ...@@ -84,6 +96,9 @@
/* Begin PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFileSystemSynchronizedRootGroup section */
041E01082DA3E865000F6C81 /* ChargeShow */ = { 041E01082DA3E865000F6C81 /* ChargeShow */ = {
isa = PBXFileSystemSynchronizedRootGroup; isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
0493223E2DA531CC00E037A5 /* Exceptions for "ChargeShow" folder in "ChargeShow" target */,
);
path = ChargeShow; path = ChargeShow;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
...@@ -110,7 +125,6 @@ ...@@ -110,7 +125,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
041E01072DA3E865000F6C81 /* Intents.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
...@@ -362,7 +376,6 @@ ...@@ -362,7 +376,6 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
041E01142DA3E896000F6C81 /* Intents.intentdefinition in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
...@@ -370,7 +383,6 @@ ...@@ -370,7 +383,6 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
041E01162DA3E896000F6C81 /* Intents.intentdefinition in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
...@@ -378,7 +390,6 @@ ...@@ -378,7 +390,6 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
041E01152DA3E896000F6C81 /* Intents.intentdefinition in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
...@@ -388,7 +399,7 @@ ...@@ -388,7 +399,7 @@
041E010D2DA3E865000F6C81 /* PBXTargetDependency */ = { 041E010D2DA3E865000F6C81 /* PBXTargetDependency */ = {
isa = PBXTargetDependency; isa = PBXTargetDependency;
target = 041E01052DA3E865000F6C81 /* ChargeShow */; target = 041E01052DA3E865000F6C81 /* ChargeShow */;
targetProxy = 041E010C2DA3E865000F6C81 /* PBXContainerItemProxy */; targetProxy = 0493223D2DA5314500E037A5 /* PBXContainerItemProxy */;
}; };
0496DEFE2D9E3F59005B2834 /* PBXTargetDependency */ = { 0496DEFE2D9E3F59005B2834 /* PBXTargetDependency */ = {
isa = PBXTargetDependency; isa = PBXTargetDependency;
...@@ -436,7 +447,7 @@ ...@@ -436,7 +447,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = 6K23946NQ5;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ChargeShow/Info.plist; INFOPLIST_FILE = ChargeShow/Info.plist;
...@@ -500,11 +511,9 @@ ...@@ -500,11 +511,9 @@
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CODE_SIGN_ENTITLEMENTS = widgetExtension.entitlements; CODE_SIGN_ENTITLEMENTS = widgetExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic;
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = 6K23946NQ5;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 6K23946NQ5;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = widget/Info.plist; INFOPLIST_FILE = widget/Info.plist;
...@@ -520,7 +529,6 @@ ...@@ -520,7 +529,6 @@
PRODUCT_BUNDLE_IDENTIFIER = com.app.phonemanager.bswidget; PRODUCT_BUNDLE_IDENTIFIER = com.app.phonemanager.bswidget;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = phonemanager_widget_dev;
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
...@@ -577,11 +585,9 @@ ...@@ -577,11 +585,9 @@
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = PhoneManager/PhoneManager.entitlements; CODE_SIGN_ENTITLEMENTS = PhoneManager/PhoneManager.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic;
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = 6K23946NQ5;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 6K23946NQ5;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = PhoneManager/Info.plist; INFOPLIST_FILE = PhoneManager/Info.plist;
INFOPLIST_KEY_NSCameraUsageDescription = "We need camera access to access image storage information"; INFOPLIST_KEY_NSCameraUsageDescription = "We need camera access to access image storage information";
...@@ -602,7 +608,6 @@ ...@@ -602,7 +608,6 @@
PRODUCT_BUNDLE_IDENTIFIER = com.app.phonemanager; PRODUCT_BUNDLE_IDENTIFIER = com.app.phonemanager;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = phonemanager_dev1;
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "PhoneManager/Class/Tool/Class/OC/PhoneManager-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "PhoneManager/Class/Tool/Class/OC/PhoneManager-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
......
...@@ -36,7 +36,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -36,7 +36,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
private func setupDefault() { private func setupDefault() {
HomePayModel.share.checkTrialStatus() HomePayModel.share.loadLocalData()
NetStatusManager.manager.startNet { status in NetStatusManager.manager.startNet { status in
switch status { switch status {
......
{ {
"images" : [ "images" : [
{ {
"filename" : "ic_idsp_unlock.png", "filename" : "ic_unsel_com.png",
"idiom" : "universal", "idiom" : "universal",
"scale" : "1x" "scale" : "1x"
}, },
{ {
"filename" : "ic_idsp_unlock@2x.png", "filename" : "ic_unsel_com@2x.png",
"idiom" : "universal", "idiom" : "universal",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"filename" : "ic_idsp_unlock@3x.png", "filename" : "ic_unsel_com@3x.png",
"idiom" : "universal", "idiom" : "universal",
"scale" : "3x" "scale" : "3x"
} }
......
{
"images" : [
{
"filename" : "icon_close__pingfen_pop.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "icon_close__pingfen_pop@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "icon_close__pingfen_pop@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_bj_quanxian.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_bj_quanxian@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_bj_quanxian@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"filename" : "img_pro_quanxian.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "img_pro_quanxian@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "img_pro_quanxian@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{ {
"images" : [ "images" : [
{ {
"filename" : "ic_naal_unlock.png", "filename" : "star_01.png",
"idiom" : "universal", "idiom" : "universal",
"scale" : "1x" "scale" : "1x"
}, },
{ {
"filename" : "ic_naal_unlock@2x.png", "filename" : "star_01@2x.png",
"idiom" : "universal", "idiom" : "universal",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"filename" : "ic_naal_unlock@3x.png", "filename" : "star_01@3x.png",
"idiom" : "universal", "idiom" : "universal",
"scale" : "3x" "scale" : "3x"
} }
......
{ {
"images" : [ "images" : [
{ {
"filename" : "ic_sbst_unlock.png", "filename" : "star_02.png",
"idiom" : "universal", "idiom" : "universal",
"scale" : "1x" "scale" : "1x"
}, },
{ {
"filename" : "ic_sbst_unlock@2x.png", "filename" : "star_02@2x.png",
"idiom" : "universal", "idiom" : "universal",
"scale" : "2x" "scale" : "2x"
}, },
{ {
"filename" : "ic_sbst_unlock@3x.png", "filename" : "star_02@3x.png",
"idiom" : "universal", "idiom" : "universal",
"scale" : "3x" "scale" : "3x"
} }
......
...@@ -287,6 +287,8 @@ class CompressQualityController : BaseViewController{ ...@@ -287,6 +287,8 @@ class CompressQualityController : BaseViewController{
HomeNoAdsViewController.show { HomeNoAdsViewController.show {
actionBlock() actionBlock()
} }
}else{
actionBlock()
} }
} }
......
...@@ -13,6 +13,15 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs ...@@ -13,6 +13,15 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs
static let share:HomePayModel = HomePayModel() static let share:HomePayModel = HomePayModel()
enum PayState {
case Subscribe // 订阅
case NonConsum // 非消耗型
}
var state:PayState = .Subscribe
private let productIdentifiers:[String] = ["com.app.phonemanager.year.member" , "com.app.phonemanager.lifetime.member"]
var isNoAd:Bool { var isNoAd:Bool {
get { get {
guard let noabd = UserDefaults.standard.object(forKey: "noabd") as? Bool else { return false } guard let noabd = UserDefaults.standard.object(forKey: "noabd") as? Bool else { return false }
...@@ -25,11 +34,10 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs ...@@ -25,11 +34,10 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs
} }
} }
var storeCall:((_ product:SKProduct) -> Void) = { prod in } var storeCall:((_ product:[SKProduct?]) -> Void) = { prod in }
func checkTrialStatus() -> Void { public func loadLocalData() -> Void {
verifyReceiptWithApple { receipt in verifyReceiptWithApple { receipt in
self.alert.dismiss()
guard let json = receipt else { guard let json = receipt else {
self.refreshReceipt() self.refreshReceipt()
return return
...@@ -43,45 +51,83 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs ...@@ -43,45 +51,83 @@ class HomePayModel: NSObject ,SKProductsRequestDelegate ,SKPaymentTransactionObs
s.dateFormat = "yyyyMMdd HHmmss" s.dateFormat = "yyyyMMdd HHmmss"
Print("ext : %@", s.string(from: extDate ?? Date())) Print("ext : %@", s.string(from: extDate ?? Date()))
#endif #endif
}else{
self.isNoAd = false
} }
} }
} }
private func checkTrialStatus() -> Void {
if state == .Subscribe { // 订阅型
verifyReceiptWithApple { receipt in
self.alert.dismiss()
guard let json = receipt else {
self.refreshReceipt()
return
}
let sub = self.checkSubscriptionStatus(receiptInfo: json)
if sub.0 == true {
let extDate = sub.2
self.isNoAd = true
#if DEBUG
let s = DateFormatter()
s.dateFormat = "yyyyMMdd HHmmss"
Print("ext : %@", s.string(from: extDate ?? Date()))
#endif
}else{
self.isNoAd = false
}
}
}else{
self.alert.dismiss()
self.isNoAd = true
}
}
func fetchProducts() { func fetchProducts() {
let request = SKProductsRequest(productIdentifiers: ["com.app.phonemanager.year.member"]) let request = SKProductsRequest(productIdentifiers: Set(productIdentifiers))
request.delegate = self request.delegate = self
request.start() request.start()
Print("获取商品信息") Print("获取商品信息")
} }
var product:SKProduct? private var product:[SKProduct?]?
/** 获取商品列表 */ /** 获取商品列表 */
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
let products = response.products let products = response.products
guard let product = products.first else { var ps:[SKProduct?] = [nil,nil]
return if products.count >= 2 {
} if products.first?.productIdentifier == productIdentifiers.first {
DispatchQueue.main.async { ps[0] = products.first
self.product = product ps[1] = products.last
self.storeCall(product) }else{
ps[1] = products.first
ps[0] = products.last
}
}else{
ps = products
} }
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: {
self.product = ps
Print("获取商品信息成功")
self.storeCall(ps)
})
} }
/** 购买 */ /** 购买 */
func purchase() -> Void { func purchase(_ states:PayState = .Subscribe) -> Void {
guard let prod = product, guard let p1 = product?.first,
let p2 = product?.last,
SKPaymentQueue.canMakePayments() SKPaymentQueue.canMakePayments()
else { return } else { return }
let payment = SKPayment(product: prod) self.state = states
let payment = SKPayment(product: states == .Subscribe ? p1! : p2!)
SKPaymentQueue.default().add(payment) SKPaymentQueue.default().add(payment)
alert.show() alert.show()
} }
/** 恢复 */ /** 恢复 */
func restore() -> Void { func restore(_ states:PayState = .Subscribe) -> Void {
self.state = states
SKPaymentQueue.default().restoreCompletedTransactions() SKPaymentQueue.default().restoreCompletedTransactions()
alert.show() alert.show()
} }
...@@ -245,6 +291,11 @@ extension HomePayModel { ...@@ -245,6 +291,11 @@ extension HomePayModel {
checkTrialStatus() checkTrialStatus()
} }
/** 恢复失败 */
func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: any Error) {
alert.dismiss()
}
/** 刷新收据 */ /** 刷新收据 */
func refreshReceipt() { func refreshReceipt() {
let request = SKReceiptRefreshRequest() let request = SKReceiptRefreshRequest()
......
...@@ -16,7 +16,7 @@ class HomePayViewController:UIViewController { ...@@ -16,7 +16,7 @@ class HomePayViewController:UIViewController {
private var doneBlock:(()->Void) = {} private var doneBlock:(()->Void) = {}
var currentProduct:SKProduct? { var currentProduct:[SKProduct?]? {
didSet { didSet {
setPrice() setPrice()
} }
...@@ -26,12 +26,12 @@ class HomePayViewController:UIViewController { ...@@ -26,12 +26,12 @@ class HomePayViewController:UIViewController {
super.viewDidLoad() super.viewDidLoad()
view.backgroundColor = .green view.backgroundColor = .green
addViews() addViews()
HomePayModel.share.fetchProducts() storeKeD()
} }
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
storeKeD() HomePayModel.share.fetchProducts()
} }
override func viewDidAppear(_ animated: Bool) { override func viewDidAppear(_ animated: Bool) {
...@@ -47,7 +47,6 @@ class HomePayViewController:UIViewController { ...@@ -47,7 +47,6 @@ class HomePayViewController:UIViewController {
guard let self else {return} guard let self else {return}
if let operstatus = status as? OperStatus { if let operstatus = status as? OperStatus {
switch operstatus { switch operstatus {
case .close: case .close:
self.dismiss(animated: true) self.dismiss(animated: true)
...@@ -58,7 +57,6 @@ class HomePayViewController:UIViewController { ...@@ -58,7 +57,6 @@ class HomePayViewController:UIViewController {
} }
if let commonPush = status as? CommonPush { if let commonPush = status as? CommonPush {
switch commonPush { switch commonPush {
case .pp: case .pp:
self.ppClick() self.ppClick()
...@@ -68,7 +66,7 @@ class HomePayViewController:UIViewController { ...@@ -68,7 +66,7 @@ class HomePayViewController:UIViewController {
self.payTouch() self.payTouch()
break break
case .swit: case .swit:
self.disjunctorTouch()
break break
case .restore: case .restore:
self.restoreClick() self.restoreClick()
...@@ -77,31 +75,29 @@ class HomePayViewController:UIViewController { ...@@ -77,31 +75,29 @@ class HomePayViewController:UIViewController {
} }
} }
} }
} }
extension HomePayViewController { extension HomePayViewController {
private func setPrice() -> Void { private func setPrice() -> Void {
guard currentProduct != nil else { return } guard currentProduct != nil ,
homePayView?.product = currentProduct let p1 = currentProduct?.first,
let p2 = currentProduct?.last
else { return }
homePayView?.product = p1
homePayView?.product1 = p2
} }
private func storeKeD() -> Void { private func storeKeD() -> Void {
HomePayModel.share.storeCall = {[weak self] product in HomePayModel.share.storeCall = {[weak self] products in
guard let self = self else { return } guard let self = self else { return }
self.currentProduct = product self.currentProduct = products
} }
} }
private func disjunctorTouch() -> Void {
self.disjunctor = !self.disjunctor
setPrice()
}
private func payTouch() -> Void { private func payTouch() -> Void {
HomePayModel.share.purchase() HomePayModel.share.purchase( (homePayView?.type == 0) ? .Subscribe : .NonConsum )
} }
private func ppClick() { private func ppClick() {
......
...@@ -40,7 +40,12 @@ class PMAlertView: UIViewController { ...@@ -40,7 +40,12 @@ class PMAlertView: UIViewController {
func show() -> Void { func show() -> Void {
DispatchQueue.main.async { DispatchQueue.main.async {
guard let rt = UIViewController.topMostViewController() else { return } Print("显示弹窗")
guard let rt = UIViewController.topMostViewController()
else { return }
if let vc = rt as? PMAlertView {
return
}
self.modalPresentationStyle = .overFullScreen self.modalPresentationStyle = .overFullScreen
self.modalTransitionStyle = .crossDissolve self.modalTransitionStyle = .crossDissolve
rt.present(self, animated: true) rt.present(self, animated: true)
...@@ -49,6 +54,7 @@ class PMAlertView: UIViewController { ...@@ -49,6 +54,7 @@ class PMAlertView: UIViewController {
func dismiss() -> Void { func dismiss() -> Void {
DispatchQueue.main.async { DispatchQueue.main.async {
Print("关闭弹窗")
self.dismiss(animated: true) self.dismiss(animated: true)
} }
} }
......
//
// PMButton.swift
// PhoneManager
//
// Created by edy on 2025/4/8.
//
import UIKit
class PMButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
self.layer.cornerRadius = 12
self.clipsToBounds = true
}
var isSelect:Bool = false {
didSet {
if isSelect {
self.layer.borderColor = UIColor.colorWithHex(hexStr: "#266BFF").cgColor
self.layer.borderWidth = 1
self.gradient(colors: [UIColor.colorWithHex(hexStr: "#FFFFFF"),UIColor.colorWithHex(hexStr: "#E3E9FC")])
}else{
self.layer.borderColor = UIColor.clear.cgColor
self.layer.borderWidth = 0
self.gradient(colors: [.clear])
}
}
}
var labels : [UILabel] = []
func setTitles(_ titles: [String] ) {
if labels.count == titles.count {
for i in 0..<titles.count {
let lb:UILabel = labels[i]
lb.text = titles[i]
}
return
}
if titles.count > 1 {
let t = UILabel()
t.text = titles[0]
t.textColor = .colorWithHex(hexStr: "#333333")
t.font = UIFont.boldSystemFont(ofSize: 16)
self.addSubview(t)
t.snp.makeConstraints { make in
make.left.equalToSuperview().offset(10)
make.bottom.equalTo(self.snp.centerY).offset(-2)
}
let b = UILabel()
b.text = titles[1]
b.textColor = .colorWithHex(hexStr: "#666666")
b.font = UIFont.boldSystemFont(ofSize: 12)
addSubview(b)
b.snp.makeConstraints { make in
make.left.equalToSuperview().offset(10)
make.top.equalTo(self.snp.centerY)
}
labels.append(t)
labels.append(b)
}else if titles.count == 1 {
let t = UILabel()
t.text = titles[0]
t.textColor = .colorWithHex(hexStr: "#333333")
t.font = UIFont.boldSystemFont(ofSize: 16)
self.addSubview(t)
t.snp.makeConstraints { make in
make.left.equalToSuperview().offset(10)
make.centerY.equalToSuperview()
}
labels.append(t)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
import UIKit import UIKit
class PMPageControl: UIPageControl { class PMPageControl: UIPageControl {
private let activeWidth: CGFloat = 16.0 private let activeWidth: CGFloat = 16.0
private let inactiveWidth: CGFloat = 8.0 private let inactiveWidth: CGFloat = 8.0
private let dotSpacing: CGFloat = 8.0 private let dotSpacing: CGFloat = 8.0
...@@ -15,6 +16,7 @@ class PMPageControl: UIPageControl { ...@@ -15,6 +16,7 @@ class PMPageControl: UIPageControl {
override func layoutSubviews() { override func layoutSubviews() {
super.layoutSubviews() super.layoutSubviews()
// for (index, dot) in subviews.enumerated() { // for (index, dot) in subviews.enumerated() {
// Print("Page : %d",index)
// let isCurrentPage = index == currentPage // let isCurrentPage = index == currentPage
// let targetWidth = isCurrentPage ? activeWidth : inactiveWidth // let targetWidth = isCurrentPage ? activeWidth : inactiveWidth
// let previousDotsWidth = CGFloat(index) * (inactiveWidth + dotSpacing) // let previousDotsWidth = CGFloat(index) * (inactiveWidth + dotSpacing)
......
//
// yQzSnStarView.swift
// PhoneManager
//
// Created by edy on 2025/4/9.
//
import UIKit
class yQzSnStarView: UIView {
var maxStar = 5 {
didSet {
reloadView()
}
}
var spacing:CGFloat = 5 {
didSet {
starStack.spacing = self.spacing
}
}
var axis:NSLayoutConstraint.Axis = .vertical {
didSet {
starStack.axis = axis
}
}
var currentStar = 5 {
didSet {
reloadView()
}
}
private func reloadView() -> Void {
for v in starStack.arrangedSubviews {
starStack.removeArrangedSubview(v)
}
for i in 0..<maxStar {
let iconName = i < currentStar ? "star_01" : "star_02"
let icon = UIImageView(image: UIImage(named: iconName))
icon.contentMode = .scaleToFill
starStack.addArrangedSubview(icon)
icon.snp.makeConstraints { make in
make.width.equalTo(icon.snp.height)
}
}
}
private func setupUI() -> Void {
starStack.snp.makeConstraints { make in
make.left.top.bottom.right.equalToSuperview()
}
}
private lazy var starStack: UIStackView = {
let star = UIStackView()
star.axis = .horizontal
star.spacing = 5
star.alignment = .center
star.distribution = .fillEqually
addSubview(star)
return star
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
// //
import UIKit import UIKit
import StoreKit
extension UIView { extension UIView {
...@@ -244,3 +246,16 @@ extension Date { ...@@ -244,3 +246,16 @@ extension Date {
} }
} }
extension SKProduct {
var localizedPrice: String {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = priceLocale
formatter.maximumFractionDigits = 2
guard let priceNumber:NSNumber = price as? NSNumber else {
return ""
}
return formatter.string(from: priceNumber) ?? ""
}
}
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