Commit ea443558 authored by shenyong's avatar shenyong

修复bug 加入开关控制

parent 58d501fb
...@@ -816,7 +816,7 @@ ...@@ -816,7 +816,7 @@
CODE_SIGN_ENTITLEMENTS = PhoneManager/PhoneManager.entitlements; CODE_SIGN_ENTITLEMENTS = PhoneManager/PhoneManager.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 4; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 6K23946NQ5; DEVELOPMENT_TEAM = 6K23946NQ5;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = PhoneManager/Info.plist; INFOPLIST_FILE = PhoneManager/Info.plist;
...@@ -838,7 +838,7 @@ ...@@ -838,7 +838,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 2.2.1; MARKETING_VERSION = 2.2.2;
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 = "";
...@@ -864,7 +864,7 @@ ...@@ -864,7 +864,7 @@
CODE_SIGN_ENTITLEMENTS = PhoneManager/PhoneManager.entitlements; CODE_SIGN_ENTITLEMENTS = PhoneManager/PhoneManager.entitlements;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 4; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 6K23946NQ5; DEVELOPMENT_TEAM = 6K23946NQ5;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = PhoneManager/Info.plist; INFOPLIST_FILE = PhoneManager/Info.plist;
...@@ -886,7 +886,7 @@ ...@@ -886,7 +886,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 2.2.1; MARKETING_VERSION = 2.2.2;
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 = "";
......
...@@ -189,6 +189,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -189,6 +189,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
APIReportManager.shared.startReport(type: .app_start) APIReportManager.shared.startReport(type: .app_start)
UserDef.shard.saveFirstStart() UserDef.shard.saveFirstStart()
} }
ADManager.shared.getADConfig()
ADManager.shared.getAppStoreVersion { value in ADManager.shared.getAppStoreVersion { value in
if let version = value{ if let version = value{
ADManager.shared.onlineVersion = version ADManager.shared.onlineVersion = version
......
...@@ -13,21 +13,24 @@ import AppLovinSDK ...@@ -13,21 +13,24 @@ import AppLovinSDK
import FBAudienceNetwork import FBAudienceNetwork
import SVProgressHUD import SVProgressHUD
class ADManager : NSObject, FullScreenContentDelegate { class ADManager : NSObject, FullScreenContentDelegate {
// fixme:上线前更改 #if DEBUG
private static let REWARDED_INTERSTITIALAD_KEY : String = "ca-app-pub-3480207748580737/4276457203" private static let REWARDED_INTERSTITIALAD_KEY : String = "ca-app-pub-3940256099942544/6978759866"
private static let INTERSTITIALAD_KEY : String = "ca-app-pub-3480207748580737/5836950888" private static let INTERSTITIALAD_KEY : String = "ca-app-pub-3940256099942544/4411468910"
// info.plist: ca-app-pub-3480207748580737~4236262472 private static let ADConfigUrl = "https://api.sayyedandroid.online/getconfigbackBytest?pkg=com.app.phonemanager"
// info.plist: ca-app-pub-3940256099942544~1458002511
// private static let REWARDED_INTERSTITIALAD_KEY : String = "ca-app-pub-3940256099942544/6978759866" #else
// private static let INTERSTITIALAD_KEY : String = "ca-app-pub-3940256099942544/4411468910" private static let REWARDED_INTERSTITIALAD_KEY : String = "ca-app-pub-3480207748580737/3389219669"
// info.plist: ca-app-pub-3940256099942544~1458002511 private static let INTERSTITIALAD_KEY : String = "ca-app-pub-3480207748580737/5836950888"
private static let ADConfigUrl = "https://api.sayyedandroid.online/getconfigback?pkg=com.app.phonemanager"
//info.plist: ca-app-pub-3480207748580737~4236262472
#endif
static let shared : ADManager = ADManager() static let shared : ADManager = ADManager()
private var adConfigModel:ADConfigModel?
var adFromName:String = "" var adFromName:String = ""
// 看完广告的回调 // 看完广告的回调
...@@ -50,8 +53,8 @@ class ADManager : NSObject, FullScreenContentDelegate { ...@@ -50,8 +53,8 @@ class ADManager : NSObject, FullScreenContentDelegate {
/// 记录插屏上次展示广告的时间 /// 记录插屏上次展示广告的时间
private var interstitiallastAdShowTime: Date? private var interstitiallastAdShowTime: Date?
private var currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "2.2.1" private var currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "2.2.2"
var onlineVersion = "2.2.1" var onlineVersion = "2.2.2"
/// 默认每日免费删除次数 /// 默认每日免费删除次数
...@@ -111,12 +114,6 @@ class ADManager : NSObject, FullScreenContentDelegate { ...@@ -111,12 +114,6 @@ class ADManager : NSObject, FullScreenContentDelegate {
NSLog("Adapter Name: %@, Description: %@, Latency: %f", adapter.key, NSLog("Adapter Name: %@, Description: %@, Latency: %f", adapter.key,
adapterStatus.description, adapterStatus.latency) adapterStatus.description, adapterStatus.latency)
} }
Task {
// 同时load两个广告内容
await self.loadInterstitial()
await self.loadRewardedInterstitialAd()
}
// 隐私设置 // 隐私设置
ALPrivacySettings.setHasUserConsent(true) ALPrivacySettings.setHasUserConsent(true)
} }
...@@ -125,7 +122,7 @@ class ADManager : NSObject, FullScreenContentDelegate { ...@@ -125,7 +122,7 @@ class ADManager : NSObject, FullScreenContentDelegate {
/// 获取激励插页广告 /// 获取激励插页广告
func loadRewardedInterstitialAd() async { func loadRewardedInterstitialAd() async {
guard dealVersionShowAD() else{ guard dealVersionShowAD(),dealConfigShowAD(.reward) else{
return return
} }
...@@ -184,7 +181,7 @@ class ADManager : NSObject, FullScreenContentDelegate { ...@@ -184,7 +181,7 @@ class ADManager : NSObject, FullScreenContentDelegate {
/// 获取单纯的插页广告 /// 获取单纯的插页广告
fileprivate func loadInterstitial() async { fileprivate func loadInterstitial() async {
guard dealVersionShowAD() else{ guard dealVersionShowAD(),dealConfigShowAD(.inter) else{
return return
} }
...@@ -243,7 +240,7 @@ class ADManager : NSObject, FullScreenContentDelegate { ...@@ -243,7 +240,7 @@ class ADManager : NSObject, FullScreenContentDelegate {
func showRewardedInterstitialAd(from:String, func showRewardedInterstitialAd(from:String,
finisedCallBack:(@escaping () ->Void), finisedCallBack:(@escaping () ->Void),
showFailBlock:@escaping (ADShowError?) ->Void) { showFailBlock:@escaping (ADShowError?) ->Void) {
guard dealVersionShowAD() else{ guard dealVersionShowAD(),dealConfigShowAD(.reward) else{
rewardedInterstitialAd = nil rewardedInterstitialAd = nil
self.finisedCallBack = finisedCallBack self.finisedCallBack = finisedCallBack
finisedCallBack() finisedCallBack()
...@@ -302,7 +299,7 @@ class ADManager : NSObject, FullScreenContentDelegate { ...@@ -302,7 +299,7 @@ class ADManager : NSObject, FullScreenContentDelegate {
finisedCallBack:@escaping(() ->Void), finisedCallBack:@escaping(() ->Void),
showFailBlock:@escaping ((ADShowError?) ->Void)) { showFailBlock:@escaping ((ADShowError?) ->Void)) {
guard dealVersionShowAD() else{ guard dealVersionShowAD(),dealConfigShowAD(.inter) else{
self.finisedCallBack = finisedCallBack self.finisedCallBack = finisedCallBack
finisedCallBack() finisedCallBack()
interstitial = nil interstitial = nil
...@@ -477,6 +474,20 @@ class ADManager : NSObject, FullScreenContentDelegate { ...@@ -477,6 +474,20 @@ class ADManager : NSObject, FullScreenContentDelegate {
} }
} }
} }
func failShowErrMessage(){
// 这里如果还没有,则弹出框
DispatchQueue.main.async {
let alert = UIAlertController(title: nil, message: "Ad wasn't ready", preferredStyle: .alert)
GETCURRENTNAV()?.present(alert, animated: true, completion: nil)
// 1 秒后关闭弹窗
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
alert.dismiss(animated: true) {
}
}
}
}
} }
...@@ -606,9 +617,14 @@ extension ADManager{ ...@@ -606,9 +617,14 @@ extension ADManager{
} }
func dealConfigShowAD(_ type:ADTypeEnum) ->Bool{
let totalShow = adConfigModel?.showAd ?? true
let adShow = type == .inter ? (adConfigModel?.showInter ?? true) : (adConfigModel?.showReward ?? true)
return (totalShow && adShow)
}
func dealVersionShowAD() -> Bool { func dealVersionShowAD() -> Bool {
let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "2.2.0" let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "2.2.2"
// let onlineVersion = "1.1.0"
// 将版本号按点号分割成数组 // 将版本号按点号分割成数组
let currentComponents = currentVersion.components(separatedBy: ".") let currentComponents = currentVersion.components(separatedBy: ".")
...@@ -630,3 +646,31 @@ extension ADManager{ ...@@ -630,3 +646,31 @@ extension ADManager{
return true // 版本相同 return true // 版本相同
} }
} }
extension ADManager{
func getADConfig(){
HttpRequest.getFormData(to: ADManager.ADConfigUrl) { (result: Result<ADConfigModel, Error>) in
switch result {
case .success(let ad):
print("adconfig: \(ad)")
ADManager.shared.adConfigModel = ad
self.loadAD()
case .failure(let error):
print("Error: \(error)")
self.loadAD()
}
}
}
func loadAD(){
Task {
// 同时load两个广告内容
await self.loadInterstitial()
await self.loadRewardedInterstitialAd()
}
}
}
...@@ -7,6 +7,18 @@ ...@@ -7,6 +7,18 @@
import Foundation import Foundation
struct ADConfigModel:Codable{
var showAd:Bool?
var showReward:Bool?
var showInter:Bool?
var rewardID:String?
var interID:String?
}
enum ADTypeEnum{
case reward,inter
}
enum ADShowError{ enum ADShowError{
case limit case limit
......
...@@ -10,10 +10,9 @@ class DeviceIDManager { ...@@ -10,10 +10,9 @@ class DeviceIDManager {
var deviceID: String { var deviceID: String {
// 尝试从 Keychain 获取已存储的 UUID // 尝试从 Keychain 获取已存储的 UUID
if let savedID = keychain.get(deviceIDKey) { if let savedID = keychain.get(deviceIDKey),savedID.count > 0{
return savedID return savedID
} }
// 如果没有存储过,生成新的 UUID 并保存 // 如果没有存储过,生成新的 UUID 并保存
let newID = UUID().uuidString let newID = UUID().uuidString
keychain.set(newID, forKey: deviceIDKey) keychain.set(newID, forKey: deviceIDKey)
...@@ -33,4 +32,4 @@ extension Dictionary where Key == String { ...@@ -33,4 +32,4 @@ extension Dictionary where Key == String {
} }
return nil return nil
} }
} }
\ No newline at end of file
...@@ -17,7 +17,6 @@ struct HttpRequest{ ...@@ -17,7 +17,6 @@ struct HttpRequest{
return return
} }
// 创建 URL 请求 // 创建 URL 请求
guard let url = urlComponents.url else { guard let url = urlComponents.url else {
completion(.failure(NSError(domain: "Invalid URL Components", code: 102, userInfo: nil))) completion(.failure(NSError(domain: "Invalid URL Components", code: 102, userInfo: nil)))
...@@ -29,6 +28,7 @@ struct HttpRequest{ ...@@ -29,6 +28,7 @@ struct HttpRequest{
request.httpMethod = "GET" request.httpMethod = "GET"
request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Content-Type")
print("请求地址",url.absoluteString) print("请求地址",url.absoluteString)
// 执行网络请求 // 执行网络请求
let session = URLSession.shared let session = URLSession.shared
let task = session.dataTask(with: request) { data, response, error in let task = session.dataTask(with: request) { data, response, error in
...@@ -49,23 +49,26 @@ struct HttpRequest{ ...@@ -49,23 +49,26 @@ struct HttpRequest{
} }
return return
} }
// 解析响应(如果有的话)
do { do {
let model = try JSONDecoder().decode(T.self, from: data) // 先解析顶层 ResponseModel
// print("请求数据",model) let responseModel = try JSONDecoder().decode(ResponseModel<T>.self, from: data)
DispatchQueue.main.async { // 解析 data 字符串为实际模型
completion(.success(model)) if let parsedData = responseModel.result.parsedData {
} DispatchQueue.main.async {
} catch { completion(.success(parsedData))
print("数据解析失败: \(error.localizedDescription)") }
DispatchQueue.main.async { } else {
completion(.failure(NSError(domain: "数据解析失败", code: 104, userInfo: nil))) DispatchQueue.main.async {
} completion(.failure(NSError(domain: "Failed to parse data string", code: 104, userInfo: nil)))
} }
}
} catch {
print("Decoding error: \(error)")
DispatchQueue.main.async {
completion(.failure(error))
}
}
} }
// 启动任务
task.resume() task.resume()
} }
......
...@@ -12,6 +12,15 @@ struct ResponseModel<T: Codable>: Codable { ...@@ -12,6 +12,15 @@ struct ResponseModel<T: Codable>: Codable {
// 结果模型 // 结果模型
struct ResultModel<T: Codable>: Codable { struct ResultModel<T: Codable>: Codable {
let data: T let data: String?
let extras: String? let extras: String?
}
\ No newline at end of file // 自定义解码方法,将 data 字符串解析为泛型模型
var parsedData: T? {
guard let jsonString = data,
let jsonData = jsonString.data(using: .utf8) else {
return nil
}
return try? JSONDecoder().decode(T.self, from: jsonData)
}
}
...@@ -60,22 +60,15 @@ class MergeButtonView : UIView { ...@@ -60,22 +60,15 @@ class MergeButtonView : UIView {
extension MergeButtonView { extension MergeButtonView {
@objc func merge (){ @objc func merge (){
self.alertWhenMergeContact() // self.alertWhenMergeContact()
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
// 添加的时候需要先弹出广告 // 添加的时候需要先弹出广告
// if let vc = self.responderViewController() {
// AdvManager.shared.showInterstitialAd(vc: vc,from:"merge",needAlert: true)
// AdvManager.shared.finisedCallBack = {
// self.alertWhenMergeContact()
// }
// }else {
// self.alertWhenMergeContact()
// }
ADManager.shared.showRewardedInterstitialAd(from: ADShowTypeEnum.Merge.name) {[weak self] in ADManager.shared.showRewardedInterstitialAd(from: ADShowTypeEnum.Merge.name) {[weak self] in
guard let weakSelf = self else { return } guard let weakSelf = self else { return }
weakSelf.alertWhenMergeContact() weakSelf.alertWhenMergeContact()
} showFailBlock: { _ in } showFailBlock: { _ in
ADManager.shared.showErrMessage() self.alertWhenMergeContact()
ADManager.shared.failShowErrMessage()
} }
}else { }else {
...@@ -100,8 +93,9 @@ extension MergeButtonView { ...@@ -100,8 +93,9 @@ extension MergeButtonView {
func alertWhenMergeContact() { func alertWhenMergeContact() {
// 删除之前弹出是否需要备份 // 删除之前弹出是否需要备份
let alertVc = ContactBackupAlertView() let alertVc = ContactBackupAlertView()
self.responderViewController()?.view.showBlur()
alertVc.frame = CGRectMake(0, ScreenH, ScreenW, ScreenH)//(self.responderViewController()?.view.bounds)! alertVc.frame = CGRectMake(0, ScreenH, ScreenW, ScreenH)//(self.responderViewController()?.view.bounds)!
self.responderViewController()?.view.showBlur()
self.responderViewController()?.view.addSubview(alertVc) self.responderViewController()?.view.addSubview(alertVc)
UIView.animate(withDuration: AniDuration) { UIView.animate(withDuration: AniDuration) {
alertVc.frame = CGRectMake(0, 0, ScreenW, ScreenH) alertVc.frame = CGRectMake(0, 0, ScreenW, ScreenH)
......
...@@ -60,19 +60,11 @@ extension MergePreButtonView { ...@@ -60,19 +60,11 @@ extension MergePreButtonView {
@objc func mergePre(){ @objc func mergePre(){
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
// 添加的时候需要先弹出广告 // 添加的时候需要先弹出广告
// if let vc = self.responderViewController() {
// AdvManager.shared.showInterstitialAd(vc: vc,needAlert: true)
// AdvManager.shared.finisedCallBack = {
// self.mergePreCallBack()
// }
// }else {
// self.mergePreCallBack()
// }
ADManager.shared.showRewardedInterstitialAd(from: ADShowTypeEnum.Merge.name) {[weak self] in ADManager.shared.showRewardedInterstitialAd(from: ADShowTypeEnum.Merge.name) {[weak self] in
guard let weakSelf = self else { return } guard let weakSelf = self else { return }
weakSelf.mergePreCallBack() weakSelf.mergePreCallBack()
} showFailBlock: { _ in } showFailBlock: { _ in
ADManager.shared.showErrMessage() ADManager.shared.failShowErrMessage()
} }
}else { }else {
self.mergePreCallBack() self.mergePreCallBack()
......
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