B面1.1.5提审版本

This commit is contained in:
Mr.zhou 2024-08-03 14:57:17 +08:00
parent 7b17174467
commit 188de9fa4f
3 changed files with 96 additions and 22 deletions

View File

@ -27,6 +27,7 @@
CB2CAAD72C5A1AC500EF691D /* MP_IAPViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB2CAAD62C5A1AC500EF691D /* MP_IAPViewController.xib */; }; CB2CAAD72C5A1AC500EF691D /* MP_IAPViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB2CAAD62C5A1AC500EF691D /* MP_IAPViewController.xib */; };
CB2CAAD82C5A1AC500EF691D /* MP_IAPViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB2CAAD52C5A1AC500EF691D /* MP_IAPViewController.swift */; }; CB2CAAD82C5A1AC500EF691D /* MP_IAPViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB2CAAD52C5A1AC500EF691D /* MP_IAPViewController.swift */; };
CB4FA4D92C5CDC4A0027C949 /* relax.offline.mp3.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CB4FA4D72C5CDC4A0027C949 /* relax.offline.mp3.xcdatamodeld */; }; CB4FA4D92C5CDC4A0027C949 /* relax.offline.mp3.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CB4FA4D72C5CDC4A0027C949 /* relax.offline.mp3.xcdatamodeld */; };
CB6EEB8E2C5DFE6100AEC414 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB6EEB8D2C5DFE6100AEC414 /* StoreKit.framework */; };
CB7FC5422C2AA01F00292A43 /* FacebookAEM in Frameworks */ = {isa = PBXBuildFile; productRef = CB7FC5412C2AA01F00292A43 /* FacebookAEM */; }; CB7FC5422C2AA01F00292A43 /* FacebookAEM in Frameworks */ = {isa = PBXBuildFile; productRef = CB7FC5412C2AA01F00292A43 /* FacebookAEM */; };
CB7FC5442C2AA01F00292A43 /* FacebookBasics in Frameworks */ = {isa = PBXBuildFile; productRef = CB7FC5432C2AA01F00292A43 /* FacebookBasics */; }; CB7FC5442C2AA01F00292A43 /* FacebookBasics in Frameworks */ = {isa = PBXBuildFile; productRef = CB7FC5432C2AA01F00292A43 /* FacebookBasics */; };
CB7FC5462C2AA01F00292A43 /* FacebookCore in Frameworks */ = {isa = PBXBuildFile; productRef = CB7FC5452C2AA01F00292A43 /* FacebookCore */; }; CB7FC5462C2AA01F00292A43 /* FacebookCore in Frameworks */ = {isa = PBXBuildFile; productRef = CB7FC5452C2AA01F00292A43 /* FacebookCore */; };
@ -281,6 +282,7 @@
CB2CAAD52C5A1AC500EF691D /* MP_IAPViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_IAPViewController.swift; sourceTree = "<group>"; }; CB2CAAD52C5A1AC500EF691D /* MP_IAPViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_IAPViewController.swift; sourceTree = "<group>"; };
CB2CAAD62C5A1AC500EF691D /* MP_IAPViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MP_IAPViewController.xib; sourceTree = "<group>"; }; CB2CAAD62C5A1AC500EF691D /* MP_IAPViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MP_IAPViewController.xib; sourceTree = "<group>"; };
CB4FA4D82C5CDC4A0027C949 /* MusicPlayer.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MusicPlayer.xcdatamodel; sourceTree = "<group>"; }; CB4FA4D82C5CDC4A0027C949 /* MusicPlayer.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MusicPlayer.xcdatamodel; sourceTree = "<group>"; };
CB6EEB8D2C5DFE6100AEC414 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
CB7FC5472C2AC25C00292A43 /* MPPositive_CenterListSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_CenterListSearchView.swift; sourceTree = "<group>"; }; CB7FC5472C2AC25C00292A43 /* MPPositive_CenterListSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_CenterListSearchView.swift; sourceTree = "<group>"; };
CBAFC9F22C0A10500054500E /* MP_BaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_BaseViewController.swift; sourceTree = "<group>"; }; CBAFC9F22C0A10500054500E /* MP_BaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_BaseViewController.swift; sourceTree = "<group>"; };
CBAFC9F32C0A10500054500E /* MP_LunchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_LunchViewController.swift; sourceTree = "<group>"; }; CBAFC9F32C0A10500054500E /* MP_LunchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_LunchViewController.swift; sourceTree = "<group>"; };
@ -520,6 +522,7 @@
CBAFCBAB2C0A10DA0054500E /* FirebaseAnalytics in Frameworks */, CBAFCBAB2C0A10DA0054500E /* FirebaseAnalytics in Frameworks */,
CB000F442C12AD2300B0FC0A /* GoogleMobileAds in Frameworks */, CB000F442C12AD2300B0FC0A /* GoogleMobileAds in Frameworks */,
46C4D5B84AF3CA6292152C70 /* Pods_relax_offline_mp3_music.framework in Frameworks */, 46C4D5B84AF3CA6292152C70 /* Pods_relax_offline_mp3_music.framework in Frameworks */,
CB6EEB8E2C5DFE6100AEC414 /* StoreKit.framework in Frameworks */,
CBAFCBAF2C0A10DA0054500E /* FirebaseRemoteConfig in Frameworks */, CBAFCBAF2C0A10DA0054500E /* FirebaseRemoteConfig in Frameworks */,
CB7FC5462C2AA01F00292A43 /* FacebookCore in Frameworks */, CB7FC5462C2AA01F00292A43 /* FacebookCore in Frameworks */,
); );
@ -531,6 +534,7 @@
2286F0649FAEEC8EC5583D68 /* Frameworks */ = { 2286F0649FAEEC8EC5583D68 /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
CB6EEB8D2C5DFE6100AEC414 /* StoreKit.framework */,
CBD4570C2C2EC38400CE766D /* AppTrackingTransparency.framework */, CBD4570C2C2EC38400CE766D /* AppTrackingTransparency.framework */,
8DB1E9160CFEC3A0E35F11BF /* Pods_relax_offline_mp3_music.framework */, 8DB1E9160CFEC3A0E35F11BF /* Pods_relax_offline_mp3_music.framework */,
); );
@ -1744,7 +1748,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1.1.5.1; CURRENT_PROJECT_VERSION = 1.1.5.2;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = RAQJ4FNZUH; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = RAQJ4FNZUH;
@ -1790,7 +1794,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1.1.5.1; CURRENT_PROJECT_VERSION = 1.1.5.2;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = RAQJ4FNZUH; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = RAQJ4FNZUH;

View File

@ -197,21 +197,31 @@ extension MP_IAPManager: SKProductsRequestDelegate, SKPaymentTransactionObserver
private func complete(transaction: SKPaymentTransaction) { private func complete(transaction: SKPaymentTransaction) {
MP_HUD.success("Successfully purchased", delay: 1.0, completion: nil) MP_HUD.success("Successfully purchased", delay: 1.0, completion: nil)
print("Transaction completed successfully.") print("Transaction completed successfully.")
validateReceipt { [weak self] status in
guard let self = self else {return}
if status {
// //
self.storePurchase(productId: transaction.payment.productIdentifier) self.storePurchase(productId: transaction.payment.productIdentifier)
SKPaymentQueue.default().finishTransaction(transaction) SKPaymentQueue.default().finishTransaction(transaction)
//广 //广
reloadOpenStatus() reloadOpenStatus()
} }
}
}
// //
private func restore(transaction: SKPaymentTransaction) { private func restore(transaction: SKPaymentTransaction) {
print("Transaction restored.") print("Transaction restored.")
validateReceipt { [weak self] status in
guard let self = self else {return}
if status {
// //
self.storePurchase(productId: transaction.payment.productIdentifier) self.storePurchase(productId: transaction.payment.productIdentifier)
SKPaymentQueue.default().finishTransaction(transaction) SKPaymentQueue.default().finishTransaction(transaction)
//广 //广
reloadOpenStatus() reloadOpenStatus()
} }
}
}
/// ///
private func fail(transaction: SKPaymentTransaction) { private func fail(transaction: SKPaymentTransaction) {
// //
@ -276,8 +286,66 @@ extension MP_IAPManager: SKProductsRequestDelegate, SKPaymentTransactionObserver
do { do {
if let jsonResponse = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { if let jsonResponse = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
print("Receipt validation response: \(jsonResponse)") print("Receipt validation response: \(jsonResponse)")
// if let status = jsonResponse["status"] as? Int {
if status == 0 {
completion(true) completion(true)
} else if status == 21007 {
self.validateReceiptInSandbox(receiptString: receiptString, completion: completion)
} else {
print("Receipt validation failed with status: \(status)")
completion(false)
}
} else {
completion(false)
}
} else {
completion(false)
}
} catch {
completion(false)
}
}
task.resume()
} catch {
completion(false)
}
}
func validateReceiptInSandbox(receiptString: String, completion: @escaping (Bool) -> Void) {
let requestDictionary = ["receipt-data": receiptString,
"password": "d29627e4f78b4b50a0ce5166acd8aa9f"]
guard JSONSerialization.isValidJSONObject(requestDictionary) else {
completion(false)
return
}
do {
let requestData = try JSONSerialization.data(withJSONObject: requestDictionary)
let validationURLString = "https://sandbox.itunes.apple.com/verifyReceipt"
guard let validationURL = URL(string: validationURLString) else {
completion(false)
return
}
var request = URLRequest(url: validationURL)
request.httpMethod = "POST"
request.cachePolicy = .reloadIgnoringCacheData
request.httpBody = requestData
let session = URLSession.shared
let task = session.dataTask(with: request) { data, response, error in
guard error == nil, let data = data else {
completion(false)
return
}
do {
if let jsonResponse = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
print("Sandbox receipt validation response: \(jsonResponse)")
if let status = jsonResponse["status"] as? Int, status == 0 {
completion(true)
} else {
completion(false)
}
} else { } else {
completion(false) completion(false)
} }

View File

@ -106,15 +106,17 @@ class MPPositive_ArtistShowHeaderView: UIView {
MPPositive_LoadCoreModel.shared.reloadCollectionArtistViewModels(nil) MPPositive_LoadCoreModel.shared.reloadCollectionArtistViewModels(nil)
} }
}else{ }else{
if let artist = self.artist, let header = artist.header {
self.collectionBtn.isSelected = true self.collectionBtn.isSelected = true
let item = MPPositive_CollectionArtistModel.create() let item = MPPositive_CollectionArtistModel.create()
item.title = artist.header.title item.title = header.title
item.coverImage = URL(string: artist.header.thumbnails?.last ?? "") item.coverImage = URL(string: header.thumbnails?.last ?? "")
item.subtitle = artist.header.subscriptionedText item.subtitle = header.subscriptionedText
item.artistId = self.artistid item.artistId = self.artistid
MPPositive_CollectionArtistModel.save() MPPositive_CollectionArtistModel.save()
MPPositive_LoadCoreModel.shared.reloadCollectionArtistViewModels(nil) MPPositive_LoadCoreModel.shared.reloadCollectionArtistViewModels(nil)
} }
}
} }
} }