Commit b5f7ddad authored by shenyong's avatar shenyong

广告增加版本控制,广告管理类更换,删除无效资源

parent 86e200c3
...@@ -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 = 2; CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = 6K23946NQ5; DEVELOPMENT_TEAM = 6K23946NQ5;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = PhoneManager/Info.plist; INFOPLIST_FILE = PhoneManager/Info.plist;
...@@ -831,7 +831,6 @@ ...@@ -831,7 +831,6 @@
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UIStatusBarStyle = "";
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 14.0; IPHONEOS_DEPLOYMENT_TARGET = 14.0;
...@@ -865,7 +864,7 @@ ...@@ -865,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 = 2; CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = 6K23946NQ5; DEVELOPMENT_TEAM = 6K23946NQ5;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = PhoneManager/Info.plist; INFOPLIST_FILE = PhoneManager/Info.plist;
...@@ -880,7 +879,6 @@ ...@@ -880,7 +879,6 @@
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UIStatusBarStyle = "";
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 14.0; IPHONEOS_DEPLOYMENT_TARGET = 14.0;
......
...@@ -66,7 +66,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -66,7 +66,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
} }
// 初始化广告SDK // 初始化广告SDK
AdvManager.shared.initAdertisementSDK() ADManager.shared.initAdertisementSDK()
FirebaseApp.configure() FirebaseApp.configure()
PMEmailManager.shareManager.restore() PMEmailManager.shareManager.restore()
SettingConfiguration.share.initData() SettingConfiguration.share.initData()
...@@ -85,6 +85,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -85,6 +85,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
self.reportAdjsutADJAttribution(attribution) self.reportAdjsutADJAttribution(attribution)
} }
PMLoadingHUD.share.config() PMLoadingHUD.share.config()
UNUserNotificationCenter.current().delegate = self UNUserNotificationCenter.current().delegate = self
return true return true
...@@ -188,6 +189,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -188,6 +189,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
APIReportManager.shared.startReport(type: .app_start) APIReportManager.shared.startReport(type: .app_start)
UserDef.shard.saveFirstStart() UserDef.shard.saveFirstStart()
} }
ADManager.shared.getAppStoreVersion { value in
if let version = value{
ADManager.shared.onlineVersion = version
}
}
break break
} }
} }
......
This diff is collapsed.
//
// ADModel.swift
// PhoneManager
//
// Created by edy on 2025/5/26.
//
import Foundation
enum ADShowError{
case limit
case noAd
case unkown
case presentFail
case fail(Error?)
var localizedDescription: String {
switch self {
case .limit:
return "ad is limit time"
case .noAd:
return "no ad to show"
case .unkown:
return "unkown error"
case .fail(let error):
return error?.localizedDescription ?? "fail"
case .presentFail:
return "can not present ad"
}
}
}
enum ADShowTypeEnum{
case Merge,PhotoDelete,Secret,Email,Charge,Compress,videoDdelete,Trash,EmailLoginSignOut,Widgets
var name:String{
switch self {
case .Merge:
return "Merge"
case .PhotoDelete:
return "PhotoDelete"
case .Secret:
return "Secret"
case .Email:
return "Email"
case .Charge:
return "Charge"
case .Compress:
return "Compress"
case .videoDdelete:
return "videoDelete"
case .Trash:
return "Trash"
case .EmailLoginSignOut:
return "EmailLoginSignOut"
case .Widgets:
return "Widgets"
}
}
}
...@@ -68,30 +68,33 @@ struct APIReportManager{ ...@@ -68,30 +68,33 @@ struct APIReportManager{
} }
private func getbpBody() ->[String:String]{ private func getbpBody() ->[String:String]{
// var DEBUG = true
// #if DEBUG
// DEBUG = true
// #else
// DEBUG = false
// #endif
let DEBUG = false
let body = [ let body = [
"\(bundleId)_3": "\(Device.current)", //手机型号 "\(bundleId)_3": "\(Device.current)", //手机型号
"\(bundleId)_4": "Apple", // 手机厂商 "\(bundleId)_4": "Apple", // 手机厂商
"\(bundleId)_5": UIDevice.current.systemVersion, //系统版本号 "\(bundleId)_5": UIDevice.current.systemVersion, //系统版本号
"\(bundleId)_8": Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "", // APP版本号 "\(bundleId)_8": Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "", // APP版本号
"\(bundleId)_9": DeviceIDManager.shared.deviceID, //UUID "\(bundleId)_9": DeviceIDManager.shared.deviceID, //UUID
"\(bundleId)_10":AdvManager.shared.getIDFA(), //iafa "\(bundleId)_10":ADManager.shared.getIDFA(), //iafa
"\(bundleId)_13": "iOS", // platform "\(bundleId)_13": "iOS", // platform
"\(bundleId)_14": Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "", //版本号 "\(bundleId)_14": Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "", //版本号
"\(bundleId)_15": "AppStore", //渠道标识 "\(bundleId)_15": "AppStore", //渠道标识
"\(bundleId)_24": DEBUG ? "debug" : "release", //环境 debug:开发环境 release:正式环境 "\(bundleId)_24": isDebug() ? "debug" : "release", //环境 debug:开发环境 release:正式环境
"\(bundleId)_34": TimeZone.current.identifier, //手机本地时区 "\(bundleId)_34": TimeZone.current.identifier, //手机本地时区
"\(bundleId)_35": DeviceIDManager.shared.deviceID //UUID "\(bundleId)_35": DeviceIDManager.shared.deviceID //UUID
] ]
return body return body
} }
// 使用编译时条件的辅助函数
private func isDebug() -> Bool {
#if DEBUG
return true
#else
return false
#endif
}
} }
......
...@@ -833,4 +833,112 @@ extension PhotoManager{ ...@@ -833,4 +833,112 @@ extension PhotoManager{
filterSimilarScreenShotModels = similarShots filterSimilarScreenShotModels = similarShots
} }
func getPHAsssetwithID(ids :[String]) -> PHAsset? {
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: ids, options: nil)
let assetsArray = fetchResult.objects(at: IndexSet(0..<fetchResult.count))
return assetsArray.first
}
func getPHAsssetwithIDs(ids :[AssetModel]) -> [PHAsset]? {
let localIdentifiers = ids.map { $0.localIdentifier }
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: localIdentifiers, options: nil)
let assetsArray = fetchResult.objects(at: IndexSet(0..<fetchResult.count))
return assetsArray
}
func getImageFromAssetID(id: String) -> UIImage? {
if let asset = getPHAsssetwithID(ids: [id]) {
return getImageFromAsset(asset: asset)
}else {
return nil
}
}
func getImageFromAsset(asset: PHAsset) -> UIImage? {
var image: UIImage?
let imageManager = PHImageManager.default()
let targetSize = CGSize(width: 400, height: 400)
let options = PHImageRequestOptions()
options.isSynchronous = true
options.deliveryMode = .opportunistic
options.isNetworkAccessAllowed = true
imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: options) { result, _ in
image = result
}
return image
}
static func deleteAssets(localIdentifiers: [String],suc:@escaping () -> ()) {
// 获取要删除的 PHAsset
PMLoadingHUD.share.show()
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: localIdentifiers, options: nil)
// 开始删除操作
PHPhotoLibrary.shared().performChanges({
// 创建删除请求
PHAssetChangeRequest.deleteAssets(fetchResult)
}) { success, error in
if success {
suc()
} else if let error = error {
print("删除失败: \(error.localizedDescription)")
}
PMLoadingHUD.share.disMiss()
}
}
func asynGetImageFromAssetID(id: String,finised:@escaping (UIImage)->Void) {
if let asset = getPHAsssetwithID(ids: [id]) {
let imageManager = PHImageManager.default()
let targetSize = CGSize(width: 400, height: 400)
let options = PHImageRequestOptions()
options.isSynchronous = false
options.deliveryMode = .opportunistic
options.isNetworkAccessAllowed = true
imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: options) { result, _ in
finised(result ?? UIImage())
}
}else {
finised(UIImage())
}
}
/// 获取视频第一帧
/// - Parameters:
/// - ident: 视频的标识
/// - finished: 完成回调
func getVideoImageByIdent(ident: AssetModel,finished:@escaping (UIImage)->Void,errorHandler:@escaping ()->Void){
// 定义请求选项来获取视频的第一帧
let options = PHImageRequestOptions()
// 获取当前版本的照片或视频
options.version = .current
// 尽可能快地提供结果
options.deliveryMode = .highQualityFormat
// 允许从iCloud请求
options.isNetworkAccessAllowed = true
// 异步请求
options.isSynchronous = false
// 从 PHAsset 获取 AVAsset
if let videoAsset = getPHAsssetwithID(ids: [ident.localIdentifier]){
// 使用requestImageForAsset方法请求视频的第一帧图片
PHImageManager.default().requestImage(for: videoAsset, targetSize: CGSize(width: 400, height: 400), contentMode: PHImageContentMode.aspectFit, options: options) { image, _ in
// 处理获取到的图片
if let thumbnailImage = image {
// 使用获取到的图片,例如显示在UIImageView上
finished(thumbnailImage)
} else {
errorHandler()
}
}
}
}
} }
...@@ -191,3 +191,23 @@ extension Sequence where Element == [AssetModel] { ...@@ -191,3 +191,23 @@ extension Sequence where Element == [AssetModel] {
} }
} }
} }
enum PrivacyType:String {
case authorized = "authorized"
case notDetermined = "notDetermined"
case denied = "denied"
case restricted = "restricted"
}
enum PhotsFileType:String {
case duplicates = "Duplicates"
case similar = "Similar"
case videos = "Videos"
case similarScreenshots = "Similar Screenshots"
case screenshots = "Screenshots"
case SimilarVideos = "Similar Videos"
case Other = "Other"
}
//
// SecretPhotoManager.swift
// PhoneManager
//
// Created by edy on 2025/5/26.
//
import Foundation
import UIKit
import HXPhotoPicker
import CryptoKit
import Photos
class SecretPhotoManager: NSObject, PhotoPickerControllerDelegate , CameraControllerDelegate {
func cameraController(_ cameraController: HXPhotoPicker.CameraController, didFinishWithResult result: HXPhotoPicker.CameraController.Result, phAsset: PHAsset?, location: CLLocation?) {
switch result {
case .image(let image):
image.compressImage(0.3) {[weak self] image in
let data = image.pngData()
guard self?.callback != nil else { return }
self?.callback!(0,data)
}
break
case .video(let fileUrl):
let data = NSData(contentsOf: fileUrl)
guard callback != nil else { return }
callback!(1,data)
break
default:
break
}
}
func pickerController(_ pickerController: PhotoPickerController, didFinishSelection result: PickerResult) {
guard callback != nil else { return }
callback!(-1,result.photoAssets)
}
func deleteAssets(_ assets:[PHAsset] = []) -> Void {
if assets.count > 0 {
PMLoadingHUD.share.show()
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.deleteAssets(assets as NSFastEnumeration)
}) { success, error in
if success {
print("删除成功")
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
PMLoadingHUD.share.disMiss()
}
} else if let error = error {
DispatchQueue.main.async {
PMLoadingHUD.share.disMiss()
}
print("删除失败: \(error.localizedDescription)")
}
}
}
}
static let share = SecretPhotoManager()
var callback:((Int,Any)->Void)?
func show(_ type:Int) -> Void {
if type == 0 {
let config = CameraConfiguration()
let vc = CameraController(config: config, type: .all, delegate: self)
vc.modalPresentationStyle = .overFullScreen
guard let root = cWindow?.rootViewController else { return }
root.present(vc, animated: true)
}else{
var config = PickerConfiguration()
config.selectMode = .multiple
config.maximumSelectedCount = 4
let vc = PhotoPickerController(picker: config, delegate: self)
vc.modalPresentationStyle = .overFullScreen
guard let root = cWindow?.rootViewController else { return }
root.present(vc, animated: true)
}
}
}
...@@ -23,12 +23,12 @@ enum AdvertisementType { ...@@ -23,12 +23,12 @@ enum AdvertisementType {
class AdvManager : NSObject, FullScreenContentDelegate { class AdvManager : NSObject, FullScreenContentDelegate {
// fixme:上线前更改 // fixme:上线前更改
private static let REWARDED_INTERSTITIALAD_KEY : String = "ca-app-pub-3480207748580737/4276457203" // private static let REWARDED_INTERSTITIALAD_KEY : String = "ca-app-pub-3480207748580737/4276457203"
private static let INTERSTITIALAD_KEY : String = "ca-app-pub-3480207748580737/5836950888" // private static let INTERSTITIALAD_KEY : String = "ca-app-pub-3480207748580737/5836950888"
// info.plist: ca-app-pub-3480207748580737~4236262472 // info.plist: ca-app-pub-3480207748580737~4236262472
// private static let REWARDED_INTERSTITIALAD_KEY : String = "ca-app-pub-3940256099942544/6978759866" private static let REWARDED_INTERSTITIALAD_KEY : String = "ca-app-pub-3940256099942544/6978759866"
// private static let INTERSTITIALAD_KEY : String = "ca-app-pub-3940256099942544/4411468910" private static let INTERSTITIALAD_KEY : String = "ca-app-pub-3940256099942544/4411468910"
static let shared : AdvManager = AdvManager() static let shared : AdvManager = AdvManager()
...@@ -253,10 +253,12 @@ class AdvManager : NSObject, FullScreenContentDelegate { ...@@ -253,10 +253,12 @@ class AdvManager : NSObject, FullScreenContentDelegate {
await self.loadRewardedInterstitialAd() await self.loadRewardedInterstitialAd()
} }
if !isByInter{ if !isByInter{
if let inter = self.interstitial{
showInterstitialAd(vc: vc,isByReward: true) showInterstitialAd(vc: vc,isByReward: true)
}else{ }else{
showErrMessage(vc: vc) showErrMessage(vc: vc)
} }
}
return return
} }
self.adFromName = from self.adFromName = from
......
...@@ -306,7 +306,7 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat ...@@ -306,7 +306,7 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat
// } // }
// 最多25张使用同步 // 最多25张使用同步
if let image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: self.dataSource[indexPath.item].localIdentifier) { if let image = PhotoManager.shared.getImageFromAssetID(id: self.dataSource[indexPath.item].localIdentifier) {
cell.imageView.image = image cell.imageView.image = image
} }
return cell return cell
......
...@@ -78,9 +78,9 @@ class ChargeInfoViewController:BaseViewController { ...@@ -78,9 +78,9 @@ class ChargeInfoViewController:BaseViewController {
self.view.hideBlur() self.view.hideBlur()
if isSure { if isSure {
self.popAdverTisement() self.popAdverTisement()
AdvManager.shared.finisedCallBack = { // AdvManager.shared.finisedCallBack = {
self.setAnimation() // self.setAnimation()
} // }
} }
} }
} }
...@@ -239,7 +239,13 @@ class ChargeInfoViewController:BaseViewController { ...@@ -239,7 +239,13 @@ class ChargeInfoViewController:BaseViewController {
/// 弹出广告 /// 弹出广告
func popAdverTisement(){ func popAdverTisement(){
AdvManager.shared.showRewardedInterstitialAd(vc: self,from:"charge") //AdvManager.shared.showRewardedInterstitialAd(vc: self,from:"charge")
ADManager.shared.showRewardedInterstitialAd(from: ADShowTypeEnum.Charge.name) {
self.setAnimation()
} showFailBlock: { error in
}
} }
} }
...@@ -36,24 +36,28 @@ class CompressSelectCell : UICollectionViewCell { ...@@ -36,24 +36,28 @@ class CompressSelectCell : UICollectionViewCell {
var model : AssetModel? { var model : AssetModel? {
didSet{ didSet{
guard let model = self.model else {return} guard let model = self.model else {return}
self.backImageView.image = UIImage() let placeImage = currentMediaType == .compressPhoto ? "videosmoren" : "othermoren"
if self.currentMediaType == .compressPhoto { self.backImageView.asset.load(withLocalIdentifier:model.localIdentifier,placeholder: UIImage.init(named: placeImage))
let viewModel = CompressViewModel()
viewModel.getImageFromAssetIdentifier(identifier: model.localIdentifier) {[weak self] image in
guard let self else { return} // self.backImageView.image = UIImage()
DispatchQueue.main.async { // if self.currentMediaType == .compressPhoto {
self.backImageView.image = image // let viewModel = CompressViewModel()
} // viewModel.getImageFromAssetIdentifier(identifier: model.localIdentifier) {[weak self] image in
} // guard let self else { return}
}else { // DispatchQueue.main.async {
PhotoAndVideoMananger.mananger.getVideoImageByIdent(ident: model) { image in // self.backImageView.image = image
DispatchQueue.main.async { // }
self.backImageView.image = image // }
} // }else {
} errorHandler: { // PhotoAndVideoMananger.mananger.getVideoImageByIdent(ident: model) { image in
print("获取视频图片资源失败") // DispatchQueue.main.async {
} // self.backImageView.image = image
} // }
// } errorHandler: {
// print("获取视频图片资源失败")
// }
// }
// 这里不再进行计算了 直接按照50%的去计算 // 这里不再进行计算了 直接按照50%的去计算
let saveSize = model.assetSize/2 let saveSize = model.assetSize/2
let sizeKB : Double = saveSize/1000 let sizeKB : Double = saveSize/1000
......
...@@ -290,12 +290,12 @@ class CompressQualityController : BaseViewController{ ...@@ -290,12 +290,12 @@ class CompressQualityController : BaseViewController{
alertView.dismiss(animated: true) { alertView.dismiss(animated: true) {
if isSure { if isSure {
self.popAdverTisement() self.popAdverTisement()
AdvManager.shared.finisedCallBack = { // AdvManager.shared.finisedCallBack = {
self.jumpToNextPage() // self.jumpToNextPage()
} // }
AdvManager.shared.failueFinishedCallBack = { // AdvManager.shared.failueFinishedCallBack = {
self.navigationController?.popViewController(animated: true) // self.navigationController?.popViewController(animated: true)
} // }
} }
} }
} }
...@@ -319,7 +319,13 @@ class CompressQualityController : BaseViewController{ ...@@ -319,7 +319,13 @@ class CompressQualityController : BaseViewController{
} }
/// 弹出广告 /// 弹出广告
func popAdverTisement(){ func popAdverTisement(){
AdvManager.shared.showRewardedInterstitialAd(vc: self,from:"compress") // AdvManager.shared.showRewardedInterstitialAd(vc: self,from:"compress")
ADManager.shared.showRewardedInterstitialAd(from:ADShowTypeEnum.Compress.name) {
self.jumpToNextPage()
} showFailBlock: { error in
self.navigationController?.popViewController(animated: true)
}
} }
} }
...@@ -15,7 +15,7 @@ class PreViewController : BaseViewController { ...@@ -15,7 +15,7 @@ class PreViewController : BaseViewController {
lazy var preImageView : UIImageView = { lazy var preImageView : UIImageView = {
let view = UIImageView(frame: CGRect(x: 0, y: self.titleView.height, width: self.view.width, height: self.view.height - self.titleView.height)) let view = UIImageView(frame: CGRect(x: 0, y: self.titleView.height, width: self.view.width, height: self.view.height - self.titleView.height))
view.backgroundColor = .white view.backgroundColor = .white
view.image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: self.imageIdent) view.image = PhotoManager.shared.getImageFromAssetID(id: self.imageIdent)
view.contentMode = .scaleAspectFit view.contentMode = .scaleAspectFit
view.clipsToBounds = true view.clipsToBounds = true
......
...@@ -63,14 +63,21 @@ extension MergeButtonView { ...@@ -63,14 +63,21 @@ extension MergeButtonView {
self.alertWhenMergeContact() self.alertWhenMergeContact()
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
// 添加的时候需要先弹出广告 // 添加的时候需要先弹出广告
if let vc = self.responderViewController() { // if let vc = self.responderViewController() {
AdvManager.shared.showInterstitialAd(vc: vc,from:"merge",needAlert: true) // AdvManager.shared.showInterstitialAd(vc: vc,from:"merge",needAlert: true)
AdvManager.shared.finisedCallBack = { // AdvManager.shared.finisedCallBack = {
self.alertWhenMergeContact() // self.alertWhenMergeContact()
} // }
}else { // }else {
self.alertWhenMergeContact() // self.alertWhenMergeContact()
// }
ADManager.shared.showRewardedInterstitialAd(from: ADShowTypeEnum.Merge.name) {[weak self] in
guard let weakSelf = self else { return }
weakSelf.alertWhenMergeContact()
} showFailBlock: { _ in
ADManager.shared.showErrMessage()
} }
}else { }else {
self.alertWhenMergeContact() self.alertWhenMergeContact()
} }
......
...@@ -60,13 +60,19 @@ extension MergePreButtonView { ...@@ -60,13 +60,19 @@ extension MergePreButtonView {
@objc func mergePre(){ @objc func mergePre(){
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
// 添加的时候需要先弹出广告 // 添加的时候需要先弹出广告
if let vc = self.responderViewController() { // if let vc = self.responderViewController() {
AdvManager.shared.showInterstitialAd(vc: vc,needAlert: true) // AdvManager.shared.showInterstitialAd(vc: vc,needAlert: true)
AdvManager.shared.finisedCallBack = { // AdvManager.shared.finisedCallBack = {
self.mergePreCallBack() // self.mergePreCallBack()
} // }
}else { // }else {
self.mergePreCallBack() // self.mergePreCallBack()
// }
ADManager.shared.showRewardedInterstitialAd(from: ADShowTypeEnum.Merge.name) {[weak self] in
guard let weakSelf = self else { return }
weakSelf.mergePreCallBack()
} showFailBlock: { _ in
ADManager.shared.showErrMessage()
} }
}else { }else {
self.mergePreCallBack() self.mergePreCallBack()
......
...@@ -136,7 +136,7 @@ class HomeInfoViewController:BaseViewController { ...@@ -136,7 +136,7 @@ class HomeInfoViewController:BaseViewController {
view.dataSource = dealArray view.dataSource = dealArray
// 获取当前免费次数 // 获取当前免费次数
let freeCount = AdvManager.shared.defaultFreeTimes let freeCount = ADManager.shared.defaultFreeTimes
// 当免费次数用完以后,无论删除多少都需要弹出广告 // 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 { if freeCount <= 0 {
HomePayViewController.show { HomePayViewController.show {
...@@ -229,13 +229,21 @@ class HomeInfoViewController:BaseViewController { ...@@ -229,13 +229,21 @@ class HomeInfoViewController:BaseViewController {
} }
if isMore == true{ if isMore == true{
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
self.popAdverTisement() let currentType = self.type == .SimilarVideos ? ADShowTypeEnum.videoDdelete : ADShowTypeEnum.PhotoDelete
// 广告看完再结束 ADManager.shared.showRewardedInterstitialAd(from: currentType.name) {
AdvManager.shared.finisedCallBack = {
DispatchQueue.main.async { DispatchQueue.main.async {
deleteOp(imgs: tempArr,isAfterAdv: true) deleteOp(imgs: tempArr,isAfterAdv: true)
} }
} showFailBlock: { error in
} }
// self.popAdverTisement()
// 广告看完再结束
// AdvManager.shared.finisedCallBack = {
// DispatchQueue.main.async {
// deleteOp(imgs: tempArr,isAfterAdv: true)
// }
// }
}else{ }else{
deleteOp(imgs: tempArr,isAfterAdv: true) deleteOp(imgs: tempArr,isAfterAdv: true)
} }
...@@ -293,7 +301,15 @@ class HomeInfoViewController:BaseViewController { ...@@ -293,7 +301,15 @@ class HomeInfoViewController:BaseViewController {
/// 弹出广告 /// 弹出广告
func popAdverTisement(){ func popAdverTisement(){
AdvManager.shared.showRewardedInterstitialAd(vc: self) // AdvManager.shared.showRewardedInterstitialAd(vc: self)
// ADManager.shared.showRewardedInterstitialAd(from: "") {
// DispatchQueue.main.async {
// deleteOp(imgs: tempArr,isAfterAdv: true)
// }
// } showFailBlock: { error in
//
// }
} }
// 由于继承自 UIViewController,必须实现这个必需的构造器 // 由于继承自 UIViewController,必须实现这个必需的构造器
......
...@@ -506,7 +506,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -506,7 +506,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
dataSource.isSeleted = cell.choose dataSource.isSeleted = cell.choose
dataSource.id = ident dataSource.id = ident
// 获取image // 获取image
dataSource.image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: ident.localIdentifier) dataSource.image = PhotoManager.shared.getImageFromAssetID(id: ident.localIdentifier)
vc.homeDataSource = [dataSource] vc.homeDataSource = [dataSource]
vc.backOrgPageCallBack = {index,data in vc.backOrgPageCallBack = {index,data in
...@@ -671,7 +671,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -671,7 +671,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
view.dataSource = self.selectedModel view.dataSource = self.selectedModel
// 获取当前免费次数 // 获取当前免费次数
let freeCount = AdvManager.shared.defaultFreeTimes let freeCount = ADManager.shared.defaultFreeTimes
// 当免费次数用完以后,无论删除多少都需要弹出广告 // 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 { if freeCount <= 0 {
HomePayViewController.show { HomePayViewController.show {
...@@ -686,7 +686,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -686,7 +686,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
} }
}else { }else {
// 获取次数对应的删除照片数量 // 获取次数对应的删除照片数量
var freeDeleteCount = AdvManager.shared.advDeleteResouceDic[freeCount]! var freeDeleteCount = ADManager.shared.advDeleteResouceDic[freeCount]!
let tempArray = self.selectedModel let tempArray = self.selectedModel
if freeCount > 1 { if freeCount > 1 {
// 如果是前两次,可以免费删除5张照片 // 如果是前两次,可以免费删除5张照片
...@@ -754,10 +754,15 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -754,10 +754,15 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
} }
if isMore == true { if isMore == true {
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
self.popAdverTisement() // self.popAdverTisement()
// 广告看完再结束 // // 广告看完再结束
AdvManager.shared.finisedCallBack = { // AdvManager.shared.finisedCallBack = {
// self.deleteAction(count: deleteCount,isAfterAdv: true)
// }
ADManager.shared.showRewardedInterstitialAd(from: self.mediaType?.rawValue ?? "") {
self.deleteAction(count: deleteCount,isAfterAdv: true) self.deleteAction(count: deleteCount,isAfterAdv: true)
} showFailBlock: { error in
} }
}else{ }else{
self.deleteAction(count: deleteCount,isAfterAdv: true) self.deleteAction(count: deleteCount,isAfterAdv: true)
...@@ -776,7 +781,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti ...@@ -776,7 +781,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
/// 弹出广告 /// 弹出广告
func popAdverTisement(){ func popAdverTisement(){
AdvManager.shared.showRewardedInterstitialAd(vc: self,from:self.mediaType?.rawValue ?? "") // AdvManager.shared.showRewardedInterstitialAd(vc: self,from:self.mediaType?.rawValue ?? ""
} }
func deleteAction(count:Int,isAfterAdv:Bool){ func deleteAction(count:Int,isAfterAdv:Bool){
......
...@@ -393,7 +393,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -393,7 +393,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
guard let self else {return} guard let self else {return}
// 获取视频的图片 // 获取视频的图片
PhotoAndVideoMananger.mananger.getVideoImageByIdent(ident: ident) { image in PhotoManager.shared.getVideoImageByIdent(ident: ident) { image in
// 点击之后跳转详情页面 // 点击之后跳转详情页面
if self.videoDetailNavView?.startSelectButton.isSelected == false { if self.videoDetailNavView?.startSelectButton.isSelected == false {
let vc = PhotoRemoveViewController(data: self.resourceData,currentIndex: indexPath.row,mediaType: .video) let vc = PhotoRemoveViewController(data: self.resourceData,currentIndex: indexPath.row,mediaType: .video)
...@@ -562,7 +562,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -562,7 +562,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
view.dataSource = self.selectedModel view.dataSource = self.selectedModel
// 获取当前免费次数 // 获取当前免费次数
let freeCount = AdvManager.shared.defaultFreeTimes let freeCount = ADManager.shared.defaultFreeTimes
// 当免费次数用完以后,无论删除多少都需要弹出广告 // 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 { if freeCount <= 0 {
HomePayViewController.show { HomePayViewController.show {
...@@ -577,7 +577,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -577,7 +577,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
} }
}else { }else {
// 获取次数对应的删除照片数量 // 获取次数对应的删除照片数量
var freeDeleteCount = AdvManager.shared.advDeleteResouceDic[freeCount]! var freeDeleteCount = ADManager.shared.advDeleteResouceDic[freeCount]!
let tempArray = self.selectedModel let tempArray = self.selectedModel
if freeCount > 1 { if freeCount > 1 {
// 如果是前两次,可以免费删除5张照片 // 如果是前两次,可以免费删除5张照片
...@@ -639,18 +639,25 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -639,18 +639,25 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
} }
} }
} }
view.deleteButtonClickCallback = {isMore,deleteCount in view.deleteButtonClickCallback = {[weak self] isMore,deleteCount in
guard let self = self else { return }
self.view.hideBlur() self.view.hideBlur()
if deleteCount < 0 { if deleteCount < 0 {
return return
} }
if isMore == true{ if isMore == true{
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
self.popAdverTisement() // self.popAdverTisement()
// 广告看完再结束 // // 广告看完再结束
AdvManager.shared.finisedCallBack = { // AdvManager.shared.finisedCallBack = {
// self.deleteAction(count: deleteCount,isAfterAdv: true)
// }
ADManager.shared.showRewardedInterstitialAd(from: "") {
self.deleteAction(count: deleteCount,isAfterAdv: true) self.deleteAction(count: deleteCount,isAfterAdv: true)
} showFailBlock: { _ in
} }
}else{ }else{
self.deleteAction(count: deleteCount,isAfterAdv: true) self.deleteAction(count: deleteCount,isAfterAdv: true)
} }
...@@ -675,7 +682,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie ...@@ -675,7 +682,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
/// 弹出广告 /// 弹出广告
func popAdverTisement(){ func popAdverTisement(){
AdvManager.shared.showRewardedInterstitialAd(vc: self,from: "video_delete") // AdvManager.shared.showRewardedInterstitialAd(vc: self,from: "video_delete")
} }
func deleteAction(count:Int,isAfterAdv:Bool){ func deleteAction(count:Int,isAfterAdv:Bool){
......
...@@ -21,8 +21,6 @@ class HomeViewController:BaseViewController { ...@@ -21,8 +21,6 @@ class HomeViewController:BaseViewController {
var isAdCallBack = false var isAdCallBack = false
let adManager = AdvManager.shared
fileprivate func junmToModule(_ cIndex: String, _ self: HomeViewController) { fileprivate func junmToModule(_ cIndex: String, _ self: HomeViewController) {
switch cIndex { switch cIndex {
...@@ -185,23 +183,28 @@ class HomeViewController:BaseViewController { ...@@ -185,23 +183,28 @@ class HomeViewController:BaseViewController {
//self.junmToModule(cIndex, self) //self.junmToModule(cIndex, self)
// 先走广告策略 // 先走广告策略
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
self.adManager.finisedCallBack = { // self.adManager.finisedCallBack = {
Print("执行成功",cIndex) // Print("执行成功",cIndex)
if self.adManager.adFromVC == cIndex,self.adManager.isFromHome{ // if self.adManager.adFromVC == cIndex,self.adManager.isFromHome{
self.isAdCallBack = true // self.isAdCallBack = true
// self.junmToModule(cIndex, self)
// }
// }
// self.adManager.failueFinishedCallBack = {
// // 首页特殊要求广告没准备好也需要跳转
// Print("执行失败",cIndex)
// if self.adManager.adFromVC == cIndex,self.adManager.isFromHome{
// self.junmToModule(cIndex, self)
// }
// }
// self.adManager.showInterstitialAd(vc: self,from: cIndex,isHome: true)
// self.junmToModule(cIndex, self)
ADManager.shared.showInterstitialAd(from:cIndex) {
self.junmToModule(cIndex, self) self.junmToModule(cIndex, self)
} } showFailBlock: { error in
}
self.adManager.failueFinishedCallBack = {
// 首页特殊要求广告没准备好也需要跳转
Print("执行失败",cIndex)
if self.adManager.adFromVC == cIndex,self.adManager.isFromHome{
self.junmToModule(cIndex, self) self.junmToModule(cIndex, self)
} }
}
self.adManager.showInterstitialAd(vc: self,from: cIndex,isHome: true)
// self.junmToModule(cIndex, self)
}else{ }else{
self.isAdCallBack = true self.isAdCallBack = true
...@@ -321,7 +324,7 @@ extension HomeViewController { ...@@ -321,7 +324,7 @@ extension HomeViewController {
case .authorized: case .authorized:
// 用户已授权跟踪 // 用户已授权跟踪
print("用户已授权应用进行跟踪") print("用户已授权应用进行跟踪")
Print("idfa",AdvManager.shared.getIDFA()) Print("idfa",ADManager.shared.getIDFA())
case .denied: case .denied:
// 用户拒绝了跟踪请求 // 用户拒绝了跟踪请求
print("用户拒绝了应用的跟踪请求") print("用户拒绝了应用的跟踪请求")
...@@ -347,7 +350,7 @@ extension HomeViewController { ...@@ -347,7 +350,7 @@ extension HomeViewController {
case .authorized: case .authorized:
// 用户已授权跟踪 // 用户已授权跟踪
print("用户已授权应用进行跟踪") print("用户已授权应用进行跟踪")
Print("idfa",AdvManager.shared.getIDFA()) Print("idfa",ADManager.shared.getIDFA())
case .denied: case .denied:
// 用户拒绝了跟踪请求 // 用户拒绝了跟踪请求
print("用户拒绝了应用的跟踪请求") print("用户拒绝了应用的跟踪请求")
......
...@@ -548,7 +548,7 @@ class PhotoRemoveViewController: BaseViewController { ...@@ -548,7 +548,7 @@ class PhotoRemoveViewController: BaseViewController {
} }
} }
}else { }else {
PhotoAndVideoMananger.mananger.asynGetImageFromAssetID(id: dataModel[imageIndex].localIdentifier) { image in PhotoManager.shared.asynGetImageFromAssetID(id: dataModel[imageIndex].localIdentifier) { image in
view.configure(with: image) view.configure(with: image)
} }
} }
......
...@@ -215,11 +215,11 @@ class PhotoSlideViewController: BaseViewController { ...@@ -215,11 +215,11 @@ class PhotoSlideViewController: BaseViewController {
guard dataSource.indices.contains(currentIndex) else { return } guard dataSource.indices.contains(currentIndex) else { return }
// 获取资源 // 获取资源
topView.imageView.image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: dataSource[currentIndex].localIdentifier) topView.imageView.image = PhotoManager.shared.getImageFromAssetID(id: dataSource[currentIndex].localIdentifier)
// 预加载下一张 // 预加载下一张
let next = currentIndex - 1 >= 0 ? currentIndex - 1 : dataSource.count - 1 let next = currentIndex - 1 >= 0 ? currentIndex - 1 : dataSource.count - 1
bottomView.imageView.image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: dataSource[next].localIdentifier) bottomView.imageView.image = PhotoManager.shared.getImageFromAssetID(id: dataSource[next].localIdentifier)
} }
private func handleCardDisappeared() { private func handleCardDisappeared() {
......
...@@ -116,7 +116,7 @@ extension TrashSubView { ...@@ -116,7 +116,7 @@ extension TrashSubView {
view.dataSource = data view.dataSource = data
// 获取当前免费次数 // 获取当前免费次数
let freeCount = AdvManager.shared.defaultFreeTimes let freeCount = ADManager.shared.defaultFreeTimes
Print("免费次数----\(freeCount)") Print("免费次数----\(freeCount)")
// 当免费次数用完以后,无论删除多少都需要弹出广告 // 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 { if freeCount <= 0 {
...@@ -132,7 +132,7 @@ extension TrashSubView { ...@@ -132,7 +132,7 @@ extension TrashSubView {
} }
}else { }else {
// 获取次数对应的删除照片数量 // 获取次数对应的删除照片数量
var freeDeleteCount = AdvManager.shared.advDeleteResouceDic[freeCount]! var freeDeleteCount = ADManager.shared.advDeleteResouceDic[freeCount]!
let tempArray = data let tempArray = data
if freeCount > 1 { if freeCount > 1 {
// 如果是前两次,可以免费删除5张照片 // 如果是前两次,可以免费删除5张照片
...@@ -193,8 +193,8 @@ extension TrashSubView { ...@@ -193,8 +193,8 @@ extension TrashSubView {
} }
} }
} }
view.deleteButtonClickCallback = {isMore,deleteCount in view.deleteButtonClickCallback = {[weak self] isMore,deleteCount in
guard let self = self else { return }
if let vc = self.responderViewController() { if let vc = self.responderViewController() {
vc.view.hideBlur() vc.view.hideBlur()
} }
...@@ -208,15 +208,25 @@ extension TrashSubView { ...@@ -208,15 +208,25 @@ extension TrashSubView {
} }
if isMore == true { if isMore == true {
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
self.popAdverTisement() // self.popAdverTisement()
// 广告看完再结束 // // 广告看完再结束
AdvManager.shared.finisedCallBack = { // AdvManager.shared.finisedCallBack = {
// let tempArray = Array(data.prefix(deleteCount))
// TrashDataManager.clearTrashData(mediaType: self.type,data: tempArray) {
// self.clearTashDataCallBack()
// self.showDeleteSuccess(array: tempArray)
// }
// }
ADManager.shared.showRewardedInterstitialAd(from: ADShowTypeEnum.Trash.name) {
let tempArray = Array(data.prefix(deleteCount)) let tempArray = Array(data.prefix(deleteCount))
TrashDataManager.clearTrashData(mediaType: self.type,data: tempArray) { TrashDataManager.clearTrashData(mediaType: self.type,data: tempArray) {
self.clearTashDataCallBack() self.clearTashDataCallBack()
self.showDeleteSuccess(array: tempArray) self.showDeleteSuccess(array: tempArray)
} }
} showFailBlock: { _ in
} }
}else{ }else{
let tempArray = Array(data.prefix(deleteCount)) let tempArray = Array(data.prefix(deleteCount))
TrashDataManager.clearTrashData(mediaType: self.type,data: tempArray) { TrashDataManager.clearTrashData(mediaType: self.type,data: tempArray) {
...@@ -279,7 +289,7 @@ extension TrashSubView { ...@@ -279,7 +289,7 @@ extension TrashSubView {
/// 弹出广告 /// 弹出广告
func popAdverTisement(){ func popAdverTisement(){
if let vc = self.responderViewController() { if let vc = self.responderViewController() {
AdvManager.shared.showRewardedInterstitialAd(vc: vc,from: "trash") // AdvManager.shared.showRewardedInterstitialAd(vc: vc,from: "trash")
} }
} }
......
...@@ -155,20 +155,22 @@ class PermissionVC:UIViewController { ...@@ -155,20 +155,22 @@ class PermissionVC:UIViewController {
@IBAction func gerstartedClick(_ sender: Any) { @IBAction func gerstartedClick(_ sender: Any) {
PhotoAndVideoMananger.getPrivacy {[weak self] status in // PhotoAndVideoMananger.getPrivacy {[weak self] status in
//
guard let self else {return} // guard let self else {return}
//
if let photoStatus = status as? PrivacyType { // if let photoStatus = status as? PrivacyType {
//
switch photoStatus { // switch photoStatus {
//
// case .authorized,.denied,.restricted:
// self.gotoNext()
// case .notDetermined: break
// }
// }
// }
case .authorized,.denied,.restricted:
self.gotoNext() self.gotoNext()
case .notDetermined: break
}
}
}
} }
...@@ -258,7 +260,7 @@ extension PermissionVC { ...@@ -258,7 +260,7 @@ extension PermissionVC {
case .authorized: case .authorized:
// 用户已授权跟踪 // 用户已授权跟踪
print("用户已授权应用进行跟踪") print("用户已授权应用进行跟踪")
Print("idfa",AdvManager.shared.getIDFA()) Print("idfa",ADManager.shared.getIDFA())
case .denied: case .denied:
// 用户拒绝了跟踪请求 // 用户拒绝了跟踪请求
print("用户拒绝了应用的跟踪请求") print("用户拒绝了应用的跟踪请求")
...@@ -284,7 +286,7 @@ extension PermissionVC { ...@@ -284,7 +286,7 @@ extension PermissionVC {
case .authorized: case .authorized:
// 用户已授权跟踪 // 用户已授权跟踪
print("用户已授权应用进行跟踪") print("用户已授权应用进行跟踪")
Print("idfa",AdvManager.shared.getIDFA()) Print("idfa",ADManager.shared.getIDFA())
case .denied: case .denied:
// 用户拒绝了跟踪请求 // 用户拒绝了跟踪请求
print("用户拒绝了应用的跟踪请求") print("用户拒绝了应用的跟踪请求")
......
...@@ -309,7 +309,6 @@ class SecretViewController: BaseViewController { ...@@ -309,7 +309,6 @@ class SecretViewController: BaseViewController {
popAdvThenDo(idx: idx) popAdvThenDo(idx: idx)
} }
}else { }else {
self.AddAction = SecretActionView() self.AddAction = SecretActionView()
self.view.showBlur() self.view.showBlur()
...@@ -343,7 +342,7 @@ class SecretViewController: BaseViewController { ...@@ -343,7 +342,7 @@ class SecretViewController: BaseViewController {
func popAdverTisement(){ func popAdverTisement(){
AdvManager.shared.showInterstitialAd(vc: self,from:"Secret") // AdvManager.shared.showInterstitialAd(vc: self,from:"Secret")
} }
......
...@@ -192,11 +192,21 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV ...@@ -192,11 +192,21 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV
// callblock() // callblock()
// } // }
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
AdvManager.shared.showInterstitialAd(vc: self,from: "Widgets") //AdvManager.shared.showInterstitialAd(vc: self,from: "Widgets")
} ADManager.shared.showInterstitialAd(from: ADShowTypeEnum.Widgets.name) {[weak self] in
guard let self = self else { return }
let widget = WidgetViewController()
self.navigationController?.pushViewController(widget, animated: true)
} showFailBlock: {[weak self] _ in
guard let self = self else { return }
let widget = WidgetViewController() let widget = WidgetViewController()
self.navigationController?.pushViewController(widget, animated: true) self.navigationController?.pushViewController(widget, animated: true)
}
}else{
let widget = WidgetViewController()
self.navigationController?.pushViewController(widget, animated: true)
}
break break
case settingLabels.FollowonInstagram.rawValue: case settingLabels.FollowonInstagram.rawValue:
guard let url = URL(string: "https://www.instagram.com/phone.manager.app/") else { return } guard let url = URL(string: "https://www.instagram.com/phone.manager.app/") else { return }
...@@ -346,16 +356,22 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV ...@@ -346,16 +356,22 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV
// callblock() // callblock()
// } // }
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
AdvManager.shared.showInterstitialAd(vc: self,from: "emailLoginSignOut") ADManager.shared.showInterstitialAd(from: "emailLoginSignOut") {
let vc:EmailLoginController = EmailLoginController()
vc.state = .home
self.navigationController?.pushViewController(vc, animated: true)
vc.callblock = { [weak self] in
self?.tableView.reloadRows(at: [indexPath], with: .none)
} }
} showFailBlock: { error in
let vc:EmailLoginController = EmailLoginController() let vc:EmailLoginController = EmailLoginController()
vc.state = .home vc.state = .home
self.navigationController?.pushViewController(vc, animated: true) self.navigationController?.pushViewController(vc, animated: true)
vc.callblock = { [weak self] in vc.callblock = { [weak self] in
self?.tableView.reloadRows(at: [indexPath], with: .none) self?.tableView.reloadRows(at: [indexPath], with: .none)
} }
// self.tableView.reloadData() }
}
} }
} }
......
...@@ -202,7 +202,7 @@ extension TrashViewController:UIScrollViewDelegate{ ...@@ -202,7 +202,7 @@ extension TrashViewController:UIScrollViewDelegate{
view.dataSource = data view.dataSource = data
// 获取当前免费次数 // 获取当前免费次数
let freeCount = AdvManager.shared.defaultFreeTimes let freeCount = ADManager.shared.defaultFreeTimes
Print("免费次数----\(freeCount)") Print("免费次数----\(freeCount)")
// 当免费次数用完以后,无论删除多少都需要弹出广告 // 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 { if freeCount <= 0 {
...@@ -218,7 +218,7 @@ extension TrashViewController:UIScrollViewDelegate{ ...@@ -218,7 +218,7 @@ extension TrashViewController:UIScrollViewDelegate{
} }
}else { }else {
// 获取次数对应的删除照片数量 // 获取次数对应的删除照片数量
var freeDeleteCount = AdvManager.shared.advDeleteResouceDic[freeCount]! var freeDeleteCount = ADManager.shared.advDeleteResouceDic[freeCount]!
let tempArray = data let tempArray = data
if freeCount > 1 { if freeCount > 1 {
// 如果是前两次,可以免费删除5张照片 // 如果是前两次,可以免费删除5张照片
...@@ -279,7 +279,8 @@ extension TrashViewController:UIScrollViewDelegate{ ...@@ -279,7 +279,8 @@ extension TrashViewController:UIScrollViewDelegate{
} }
} }
} }
view.deleteButtonClickCallback = {isMore,deleteCount in view.deleteButtonClickCallback = {[weak self] isMore,deleteCount in
guard let self = self else { return }
self.view.hideBlur() self.view.hideBlur()
if deleteCount < 0 { if deleteCount < 0 {
return return
...@@ -291,15 +292,25 @@ extension TrashViewController:UIScrollViewDelegate{ ...@@ -291,15 +292,25 @@ extension TrashViewController:UIScrollViewDelegate{
} }
if isMore == true { if isMore == true {
if IAPManager.share.isSubscribed == false { if IAPManager.share.isSubscribed == false {
self.popAdverTisement() // self.popAdverTisement()
// 广告看完再结束 // 广告看完再结束
AdvManager.shared.finisedCallBack = { // AdvManager.shared.finisedCallBack = {
// let tempArray = Array(data.prefix(deleteCount))
// TrashDataManager.clearTrashData(mediaType: info.0,data: tempArray) {
// info.1.dataSource.removeAll(where: {tempArray.map({$0.localIdentifier}).contains($0.localIdentifier)})
// self.showDeleteSuccess(array: tempArray)
// }
// }
ADManager.shared.showRewardedInterstitialAd(from: ADShowTypeEnum.Trash.name) {
let tempArray = Array(data.prefix(deleteCount)) let tempArray = Array(data.prefix(deleteCount))
TrashDataManager.clearTrashData(mediaType: info.0,data: tempArray) { TrashDataManager.clearTrashData(mediaType: info.0,data: tempArray) {
info.1.dataSource.removeAll(where: {tempArray.map({$0.localIdentifier}).contains($0.localIdentifier)}) info.1.dataSource.removeAll(where: {tempArray.map({$0.localIdentifier}).contains($0.localIdentifier)})
self.showDeleteSuccess(array: tempArray) self.showDeleteSuccess(array: tempArray)
} }
} showFailBlock: { _ in
} }
}else{ }else{
let tempArray = Array(data.prefix(deleteCount)) let tempArray = Array(data.prefix(deleteCount))
TrashDataManager.clearTrashData(mediaType: info.0,data: tempArray) { TrashDataManager.clearTrashData(mediaType: info.0,data: tempArray) {
...@@ -324,7 +335,7 @@ extension TrashViewController:UIScrollViewDelegate{ ...@@ -324,7 +335,7 @@ extension TrashViewController:UIScrollViewDelegate{
/// 弹出广告 /// 弹出广告
func popAdverTisement(){ func popAdverTisement(){
AdvManager.shared.showRewardedInterstitialAd(vc: self,from: "trash") // AdvManager.shared.showRewardedInterstitialAd(vc: self,from: "trash")
} }
// 显示弹出框 // 显示弹出框
......
...@@ -23,7 +23,7 @@ class TrashDataManager { ...@@ -23,7 +23,7 @@ class TrashDataManager {
let trashData = self.getCurrentMediaTypeTrashData(mediaType: mediaType) let trashData = self.getCurrentMediaTypeTrashData(mediaType: mediaType)
if trashData.count > 0 { if trashData.count > 0 {
let identifierArray : [String] = data.count == 0 ? trashData.map({$0.localIdentifier}) : data.map({$0.localIdentifier}) let identifierArray : [String] = data.count == 0 ? trashData.map({$0.localIdentifier}) : data.map({$0.localIdentifier})
PhotoAndVideoMananger.deleteAssets(localIdentifiers: identifierArray) { PhotoManager.shared.deleteAssets(localIdentifiers: identifierArray) {
// 清空单利和数据库的数据 // 清空单利和数据库的数据
if data.count > 0 { if data.count > 0 {
for item in data { for item in data {
......
...@@ -135,7 +135,7 @@ extension EmailCleanListView : UITableViewDataSource,UITableViewDelegate { ...@@ -135,7 +135,7 @@ extension EmailCleanListView : UITableViewDataSource,UITableViewDelegate {
// 广告 // 广告
func popAdverTisement(){ func popAdverTisement(){
AdvManager.shared.showInterstitialAd(vc: UIViewController.topMostViewController() ?? UIViewController(),from: "email") // AdvManager.shared.showInterstitialAd(vc: UIViewController.topMostViewController() ?? UIViewController(),from: "email")
} }
private func selectSet(_ indexPath:IndexPath) -> Void { private func selectSet(_ indexPath:IndexPath) -> Void {
...@@ -154,6 +154,7 @@ extension EmailCleanListView : UITableViewDataSource,UITableViewDelegate { ...@@ -154,6 +154,7 @@ extension EmailCleanListView : UITableViewDataSource,UITableViewDelegate {
} }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: EmailCleanListViewCell.id, for: indexPath) as! EmailCleanListViewCell let cell = tableView.dequeueReusableCell(withIdentifier: EmailCleanListViewCell.id, for: indexPath) as! EmailCleanListViewCell
cell.selectionStyle = .none cell.selectionStyle = .none
let data = datasource[indexPath.row] let data = datasource[indexPath.row]
......
...@@ -184,7 +184,7 @@ extension EmailContentView :UITableViewDelegate,UITableViewDataSource{ ...@@ -184,7 +184,7 @@ extension EmailContentView :UITableViewDelegate,UITableViewDataSource{
// 广告 // 广告
func popAdverTisement(){ func popAdverTisement(){
AdvManager.shared.showInterstitialAd(vc: UIViewController.topMostViewController() ?? UIViewController()) // AdvManager.shared.showInterstitialAd(vc: UIViewController.topMostViewController() ?? UIViewController())
} }
private func Total() -> Void { private func Total() -> Void {
......
//
// ResourceManager.swift
// PhoneManager
//
// Created by edy on 2025/4/1.
//
import Foundation
import Photos
class ResourceManager {
static let manager : ResourceManager = ResourceManager()
func getAllPhotos()-> [String]{
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let videoAssets = PHAsset.fetchAssets(with: .image, options: fetchOptions)
let assetsArray = videoAssets.objects(at: IndexSet(0..<videoAssets.count))
var array : [String] = []
for ass in assetsArray{
array.append(ass.localIdentifier)
}
return array
}
func getAllPhotosByPHAsset()-> [PHAsset]{
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let videoAssets = PHAsset.fetchAssets(with: .image, options: fetchOptions)
let assetsArray = videoAssets.objects(at: IndexSet(0..<videoAssets.count))
return assetsArray
}
/// 获取所有视频
/// - Returns: 视频集合
func getAllVideo() -> [String]{
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let videoAssets = PHAsset.fetchAssets(with: .video, options: fetchOptions)
let assetsArray = videoAssets.objects(at: IndexSet(0..<videoAssets.count))
var array : [String] = []
for ass in assetsArray{
array.append(ass.localIdentifier)
}
return array
}
func getAllVideosByPHAsset()-> [PHAsset]{
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let videoAssets = PHAsset.fetchAssets(with: .video, options: fetchOptions)
let assetsArray = videoAssets.objects(at: IndexSet(0..<videoAssets.count))
return assetsArray
}
}
...@@ -29,7 +29,7 @@ class SystemCommentManager { ...@@ -29,7 +29,7 @@ class SystemCommentManager {
initCommentInfoInDisk() initCommentInfoInDisk()
} }
// 首先是免费三次机会用完之后,第四次点击广告,在结果页点击棒极了(删除成功,且loading页面消失) // 首先是免费三次机会用完之后,第四次点击广告,在结果页点击棒极了(删除成功,且loading页面消失)
if AdvManager.shared.defaultFreeTimes == 0 { if ADManager.shared.defaultFreeTimes == 0 {
// 判断当天有没有被触发过 // 判断当天有没有被触发过
if let isCommentInCurrentDay = UserDefaults.standard.object(forKey: SHOW_COMMENT_IN_CURRENT_DAY){ if let isCommentInCurrentDay = UserDefaults.standard.object(forKey: SHOW_COMMENT_IN_CURRENT_DAY){
let temp : Bool = isCommentInCurrentDay as! Bool let temp : Bool = isCommentInCurrentDay as! Bool
......
...@@ -195,3 +195,12 @@ extension URL { ...@@ -195,3 +195,12 @@ extension URL {
} }
} }
extension Array {
func chunked(into size: Int) -> [[Element]] {
return stride(from: 0, to: count, by: size).map {
Array(self[$0..<Swift.min($0 + size, count)])
}
}
}
...@@ -6,8 +6,7 @@ ...@@ -6,8 +6,7 @@
// //
import Foundation import Foundation
import GoogleMobileAds
import ContactsUI
class Singleton { class Singleton {
// 使用静态常量来保存单例实例 // 使用静态常量来保存单例实例
...@@ -21,31 +20,8 @@ class Singleton { ...@@ -21,31 +20,8 @@ class Singleton {
var keepList : [TrashTypeEnum : [AssetModel]] = [:] var keepList : [TrashTypeEnum : [AssetModel]] = [:]
var photoPermission : PrivacyType? var photoPermission : PrivacyType?
// func startCountdown(completion: @escaping () -> Void) {
//
// if AdvManager.shared.timer != nil {
// return
// }
// let queue = DispatchQueue.global()
// let timer = DispatchSource.makeTimerSource(queue: queue)
// AdvManager.shared.timer = timer
// AdvManager.shared.timer?.schedule(deadline: .now(), repeating: .seconds(1))
// AdvManager.shared.timer?.setEventHandler {
// AdvManager.shared.advTimeAfterInAPP -= 1
// if AdvManager.shared.advTimeAfterInAPP >= 0 {
// } else {
// print("倒计时结束!")
// AdvManager.shared.timer?.cancel()
// completion()
// AdvManager.shared.timer = nil
// }
// }
// timer.resume()
// }
} }
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