Commit b5f7ddad authored by shenyong's avatar shenyong

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

parent 86e200c3
......@@ -816,7 +816,7 @@
CODE_SIGN_ENTITLEMENTS = PhoneManager/PhoneManager.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = 6K23946NQ5;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = PhoneManager/Info.plist;
......@@ -831,7 +831,6 @@
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UIStatusBarStyle = "";
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
......@@ -865,7 +864,7 @@
CODE_SIGN_ENTITLEMENTS = PhoneManager/PhoneManager.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_TEAM = 6K23946NQ5;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = PhoneManager/Info.plist;
......@@ -880,7 +879,6 @@
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UIStatusBarStyle = "";
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
......
......@@ -66,7 +66,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
}
// 初始化广告SDK
AdvManager.shared.initAdertisementSDK()
ADManager.shared.initAdertisementSDK()
FirebaseApp.configure()
PMEmailManager.shareManager.restore()
SettingConfiguration.share.initData()
......@@ -85,6 +85,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
self.reportAdjsutADJAttribution(attribution)
}
PMLoadingHUD.share.config()
UNUserNotificationCenter.current().delegate = self
return true
......@@ -188,6 +189,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
APIReportManager.shared.startReport(type: .app_start)
UserDef.shard.saveFirstStart()
}
ADManager.shared.getAppStoreVersion { value in
if let version = value{
ADManager.shared.onlineVersion = version
}
}
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{
}
private func getbpBody() ->[String:String]{
// var DEBUG = true
// #if DEBUG
// DEBUG = true
// #else
// DEBUG = false
// #endif
let DEBUG = false
let body = [
"\(bundleId)_3": "\(Device.current)", //手机型号
"\(bundleId)_4": "Apple", // 手机厂商
"\(bundleId)_5": UIDevice.current.systemVersion, //系统版本号
"\(bundleId)_8": Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "", // APP版本号
"\(bundleId)_9": DeviceIDManager.shared.deviceID, //UUID
"\(bundleId)_10":AdvManager.shared.getIDFA(), //iafa
"\(bundleId)_10":ADManager.shared.getIDFA(), //iafa
"\(bundleId)_13": "iOS", // platform
"\(bundleId)_14": Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "", //版本号
"\(bundleId)_15": "AppStore", //渠道标识
"\(bundleId)_24": DEBUG ? "debug" : "release", //环境 debug:开发环境 release:正式环境
"\(bundleId)_24": isDebug() ? "debug" : "release", //环境 debug:开发环境 release:正式环境
"\(bundleId)_34": TimeZone.current.identifier, //手机本地时区
"\(bundleId)_35": DeviceIDManager.shared.deviceID //UUID
]
return body
}
// 使用编译时条件的辅助函数
private func isDebug() -> Bool {
#if DEBUG
return true
#else
return false
#endif
}
}
......
......@@ -833,4 +833,112 @@ extension PhotoManager{
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] {
}
}
}
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 {
class AdvManager : NSObject, FullScreenContentDelegate {
// fixme:上线前更改
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 REWARDED_INTERSTITIALAD_KEY : String = "ca-app-pub-3480207748580737/4276457203"
// private static let INTERSTITIALAD_KEY : String = "ca-app-pub-3480207748580737/5836950888"
// info.plist: ca-app-pub-3480207748580737~4236262472
// 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 REWARDED_INTERSTITIALAD_KEY : String = "ca-app-pub-3940256099942544/6978759866"
private static let INTERSTITIALAD_KEY : String = "ca-app-pub-3940256099942544/4411468910"
static let shared : AdvManager = AdvManager()
......@@ -253,9 +253,11 @@ class AdvManager : NSObject, FullScreenContentDelegate {
await self.loadRewardedInterstitialAd()
}
if !isByInter{
showInterstitialAd(vc: vc,isByReward: true)
}else{
showErrMessage(vc: vc)
if let inter = self.interstitial{
showInterstitialAd(vc: vc,isByReward: true)
}else{
showErrMessage(vc: vc)
}
}
return
}
......
......@@ -306,7 +306,7 @@ extension AdvTipDeleteView : UICollectionViewDataSource, UICollectionViewDelegat
// }
// 最多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
}
return cell
......
......@@ -78,9 +78,9 @@ class ChargeInfoViewController:BaseViewController {
self.view.hideBlur()
if isSure {
self.popAdverTisement()
AdvManager.shared.finisedCallBack = {
self.setAnimation()
}
// AdvManager.shared.finisedCallBack = {
// self.setAnimation()
// }
}
}
}
......@@ -239,7 +239,13 @@ class ChargeInfoViewController:BaseViewController {
/// 弹出广告
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 {
var model : AssetModel? {
didSet{
guard let model = self.model else {return}
self.backImageView.image = UIImage()
if self.currentMediaType == .compressPhoto {
let viewModel = CompressViewModel()
viewModel.getImageFromAssetIdentifier(identifier: model.localIdentifier) {[weak self] image in
guard let self else { return}
DispatchQueue.main.async {
self.backImageView.image = image
}
}
}else {
PhotoAndVideoMananger.mananger.getVideoImageByIdent(ident: model) { image in
DispatchQueue.main.async {
self.backImageView.image = image
}
} errorHandler: {
print("获取视频图片资源失败")
}
}
let placeImage = currentMediaType == .compressPhoto ? "videosmoren" : "othermoren"
self.backImageView.asset.load(withLocalIdentifier:model.localIdentifier,placeholder: UIImage.init(named: placeImage))
// self.backImageView.image = UIImage()
// if self.currentMediaType == .compressPhoto {
// let viewModel = CompressViewModel()
// viewModel.getImageFromAssetIdentifier(identifier: model.localIdentifier) {[weak self] image in
// guard let self else { return}
// DispatchQueue.main.async {
// self.backImageView.image = image
// }
// }
// }else {
// PhotoAndVideoMananger.mananger.getVideoImageByIdent(ident: model) { image in
// DispatchQueue.main.async {
// self.backImageView.image = image
// }
// } errorHandler: {
// print("获取视频图片资源失败")
// }
// }
// 这里不再进行计算了 直接按照50%的去计算
let saveSize = model.assetSize/2
let sizeKB : Double = saveSize/1000
......
......@@ -290,12 +290,12 @@ class CompressQualityController : BaseViewController{
alertView.dismiss(animated: true) {
if isSure {
self.popAdverTisement()
AdvManager.shared.finisedCallBack = {
self.jumpToNextPage()
}
AdvManager.shared.failueFinishedCallBack = {
self.navigationController?.popViewController(animated: true)
}
// AdvManager.shared.finisedCallBack = {
// self.jumpToNextPage()
// }
// AdvManager.shared.failueFinishedCallBack = {
// self.navigationController?.popViewController(animated: true)
// }
}
}
}
......@@ -319,7 +319,13 @@ class CompressQualityController : BaseViewController{
}
/// 弹出广告
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 {
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))
view.backgroundColor = .white
view.image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: self.imageIdent)
view.image = PhotoManager.shared.getImageFromAssetID(id: self.imageIdent)
view.contentMode = .scaleAspectFit
view.clipsToBounds = true
......
......@@ -63,14 +63,21 @@ extension MergeButtonView {
self.alertWhenMergeContact()
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()
// 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
guard let weakSelf = self else { return }
weakSelf.alertWhenMergeContact()
} showFailBlock: { _ in
ADManager.shared.showErrMessage()
}
}else {
self.alertWhenMergeContact()
}
......
......@@ -60,13 +60,19 @@ extension MergePreButtonView {
@objc func mergePre(){
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()
// 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
guard let weakSelf = self else { return }
weakSelf.mergePreCallBack()
} showFailBlock: { _ in
ADManager.shared.showErrMessage()
}
}else {
self.mergePreCallBack()
......
......@@ -136,7 +136,7 @@ class HomeInfoViewController:BaseViewController {
view.dataSource = dealArray
// 获取当前免费次数
let freeCount = AdvManager.shared.defaultFreeTimes
let freeCount = ADManager.shared.defaultFreeTimes
// 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 {
HomePayViewController.show {
......@@ -229,13 +229,21 @@ class HomeInfoViewController:BaseViewController {
}
if isMore == true{
if IAPManager.share.isSubscribed == false {
self.popAdverTisement()
// 广告看完再结束
AdvManager.shared.finisedCallBack = {
let currentType = self.type == .SimilarVideos ? ADShowTypeEnum.videoDdelete : ADShowTypeEnum.PhotoDelete
ADManager.shared.showRewardedInterstitialAd(from: currentType.name) {
DispatchQueue.main.async {
deleteOp(imgs: tempArr,isAfterAdv: true)
}
} showFailBlock: { error in
}
// self.popAdverTisement()
// 广告看完再结束
// AdvManager.shared.finisedCallBack = {
// DispatchQueue.main.async {
// deleteOp(imgs: tempArr,isAfterAdv: true)
// }
// }
}else{
deleteOp(imgs: tempArr,isAfterAdv: true)
}
......@@ -293,7 +301,15 @@ class HomeInfoViewController:BaseViewController {
/// 弹出广告
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,必须实现这个必需的构造器
......
......@@ -506,7 +506,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
dataSource.isSeleted = cell.choose
dataSource.id = ident
// 获取image
dataSource.image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: ident.localIdentifier)
dataSource.image = PhotoManager.shared.getImageFromAssetID(id: ident.localIdentifier)
vc.homeDataSource = [dataSource]
vc.backOrgPageCallBack = {index,data in
......@@ -671,7 +671,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
view.dataSource = self.selectedModel
// 获取当前免费次数
let freeCount = AdvManager.shared.defaultFreeTimes
let freeCount = ADManager.shared.defaultFreeTimes
// 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 {
HomePayViewController.show {
......@@ -686,7 +686,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
}
}else {
// 获取次数对应的删除照片数量
var freeDeleteCount = AdvManager.shared.advDeleteResouceDic[freeCount]!
var freeDeleteCount = ADManager.shared.advDeleteResouceDic[freeCount]!
let tempArray = self.selectedModel
if freeCount > 1 {
// 如果是前两次,可以免费删除5张照片
......@@ -754,10 +754,15 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
}
if isMore == true {
if IAPManager.share.isSubscribed == false {
self.popAdverTisement()
// 广告看完再结束
AdvManager.shared.finisedCallBack = {
// self.popAdverTisement()
// // 广告看完再结束
// AdvManager.shared.finisedCallBack = {
// self.deleteAction(count: deleteCount,isAfterAdv: true)
// }
ADManager.shared.showRewardedInterstitialAd(from: self.mediaType?.rawValue ?? "") {
self.deleteAction(count: deleteCount,isAfterAdv: true)
} showFailBlock: { error in
}
}else{
self.deleteAction(count: deleteCount,isAfterAdv: true)
......@@ -776,7 +781,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
/// 弹出广告
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){
......
......@@ -393,7 +393,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
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 {
let vc = PhotoRemoveViewController(data: self.resourceData,currentIndex: indexPath.row,mediaType: .video)
......@@ -562,7 +562,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
view.dataSource = self.selectedModel
// 获取当前免费次数
let freeCount = AdvManager.shared.defaultFreeTimes
let freeCount = ADManager.shared.defaultFreeTimes
// 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 {
HomePayViewController.show {
......@@ -577,7 +577,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
}
}else {
// 获取次数对应的删除照片数量
var freeDeleteCount = AdvManager.shared.advDeleteResouceDic[freeCount]!
var freeDeleteCount = ADManager.shared.advDeleteResouceDic[freeCount]!
let tempArray = self.selectedModel
if freeCount > 1 {
// 如果是前两次,可以免费删除5张照片
......@@ -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()
if deleteCount < 0 {
return
}
if isMore == true{
if IAPManager.share.isSubscribed == false {
self.popAdverTisement()
// 广告看完再结束
AdvManager.shared.finisedCallBack = {
// self.popAdverTisement()
// // 广告看完再结束
// AdvManager.shared.finisedCallBack = {
// self.deleteAction(count: deleteCount,isAfterAdv: true)
// }
ADManager.shared.showRewardedInterstitialAd(from: "") {
self.deleteAction(count: deleteCount,isAfterAdv: true)
} showFailBlock: { _ in
}
}else{
self.deleteAction(count: deleteCount,isAfterAdv: true)
}
......@@ -675,7 +682,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
/// 弹出广告
func popAdverTisement(){
AdvManager.shared.showRewardedInterstitialAd(vc: self,from: "video_delete")
// AdvManager.shared.showRewardedInterstitialAd(vc: self,from: "video_delete")
}
func deleteAction(count:Int,isAfterAdv:Bool){
......
......@@ -20,9 +20,7 @@ class HomeViewController:BaseViewController {
var homeView:HomeView?
var isAdCallBack = false
let adManager = AdvManager.shared
fileprivate func junmToModule(_ cIndex: String, _ self: HomeViewController) {
switch cIndex {
......@@ -185,24 +183,29 @@ class HomeViewController:BaseViewController {
//self.junmToModule(cIndex, self)
// 先走广告策略
if IAPManager.share.isSubscribed == false {
self.adManager.finisedCallBack = {
Print("执行成功",cIndex)
if self.adManager.adFromVC == cIndex,self.adManager.isFromHome{
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.adManager.finisedCallBack = {
// Print("执行成功",cIndex)
// if self.adManager.adFromVC == cIndex,self.adManager.isFromHome{
// 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)
} showFailBlock: { error in
self.junmToModule(cIndex, self)
}
}else{
self.isAdCallBack = true
self.junmToModule(cIndex, self)
......@@ -321,7 +324,7 @@ extension HomeViewController {
case .authorized:
// 用户已授权跟踪
print("用户已授权应用进行跟踪")
Print("idfa",AdvManager.shared.getIDFA())
Print("idfa",ADManager.shared.getIDFA())
case .denied:
// 用户拒绝了跟踪请求
print("用户拒绝了应用的跟踪请求")
......@@ -347,7 +350,7 @@ extension HomeViewController {
case .authorized:
// 用户已授权跟踪
print("用户已授权应用进行跟踪")
Print("idfa",AdvManager.shared.getIDFA())
Print("idfa",ADManager.shared.getIDFA())
case .denied:
// 用户拒绝了跟踪请求
print("用户拒绝了应用的跟踪请求")
......
......@@ -548,7 +548,7 @@ class PhotoRemoveViewController: BaseViewController {
}
}
}else {
PhotoAndVideoMananger.mananger.asynGetImageFromAssetID(id: dataModel[imageIndex].localIdentifier) { image in
PhotoManager.shared.asynGetImageFromAssetID(id: dataModel[imageIndex].localIdentifier) { image in
view.configure(with: image)
}
}
......
......@@ -215,11 +215,11 @@ class PhotoSlideViewController: BaseViewController {
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
bottomView.imageView.image = PhotoAndVideoMananger.mananger.getImageFromAssetID(id: dataSource[next].localIdentifier)
bottomView.imageView.image = PhotoManager.shared.getImageFromAssetID(id: dataSource[next].localIdentifier)
}
private func handleCardDisappeared() {
......
......@@ -116,7 +116,7 @@ extension TrashSubView {
view.dataSource = data
// 获取当前免费次数
let freeCount = AdvManager.shared.defaultFreeTimes
let freeCount = ADManager.shared.defaultFreeTimes
Print("免费次数----\(freeCount)")
// 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 {
......@@ -132,7 +132,7 @@ extension TrashSubView {
}
}else {
// 获取次数对应的删除照片数量
var freeDeleteCount = AdvManager.shared.advDeleteResouceDic[freeCount]!
var freeDeleteCount = ADManager.shared.advDeleteResouceDic[freeCount]!
let tempArray = data
if freeCount > 1 {
// 如果是前两次,可以免费删除5张照片
......@@ -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() {
vc.view.hideBlur()
}
......@@ -208,15 +208,25 @@ extension TrashSubView {
}
if isMore == true {
if IAPManager.share.isSubscribed == false {
self.popAdverTisement()
// 广告看完再结束
AdvManager.shared.finisedCallBack = {
// self.popAdverTisement()
// // 广告看完再结束
// 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))
TrashDataManager.clearTrashData(mediaType: self.type,data: tempArray) {
self.clearTashDataCallBack()
self.showDeleteSuccess(array: tempArray)
}
} showFailBlock: { _ in
}
}else{
let tempArray = Array(data.prefix(deleteCount))
TrashDataManager.clearTrashData(mediaType: self.type,data: tempArray) {
......@@ -279,7 +289,7 @@ extension TrashSubView {
/// 弹出广告
func popAdverTisement(){
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 {
@IBAction func gerstartedClick(_ sender: Any) {
PhotoAndVideoMananger.getPrivacy {[weak self] status in
guard let self else {return}
if let photoStatus = status as? PrivacyType {
switch photoStatus {
case .authorized,.denied,.restricted:
self.gotoNext()
case .notDetermined: break
}
}
}
// PhotoAndVideoMananger.getPrivacy {[weak self] status in
//
// guard let self else {return}
//
// if let photoStatus = status as? PrivacyType {
//
// switch photoStatus {
//
// case .authorized,.denied,.restricted:
// self.gotoNext()
// case .notDetermined: break
// }
// }
// }
self.gotoNext()
}
......@@ -258,7 +260,7 @@ extension PermissionVC {
case .authorized:
// 用户已授权跟踪
print("用户已授权应用进行跟踪")
Print("idfa",AdvManager.shared.getIDFA())
Print("idfa",ADManager.shared.getIDFA())
case .denied:
// 用户拒绝了跟踪请求
print("用户拒绝了应用的跟踪请求")
......@@ -284,7 +286,7 @@ extension PermissionVC {
case .authorized:
// 用户已授权跟踪
print("用户已授权应用进行跟踪")
Print("idfa",AdvManager.shared.getIDFA())
Print("idfa",ADManager.shared.getIDFA())
case .denied:
// 用户拒绝了跟踪请求
print("用户拒绝了应用的跟踪请求")
......
......@@ -308,7 +308,6 @@ class SecretViewController: BaseViewController {
self.AddAction.callback = { idx in
popAdvThenDo(idx: idx)
}
}else {
self.AddAction = SecretActionView()
......@@ -343,7 +342,7 @@ class SecretViewController: BaseViewController {
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
// callblock()
// }
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()
self.navigationController?.pushViewController(widget, animated: true)
}
}else{
let widget = WidgetViewController()
self.navigationController?.pushViewController(widget, animated: true)
}
let widget = WidgetViewController()
self.navigationController?.pushViewController(widget, animated: true)
break
case settingLabels.FollowonInstagram.rawValue:
guard let url = URL(string: "https://www.instagram.com/phone.manager.app/") else { return }
......@@ -346,16 +356,22 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV
// callblock()
// }
if IAPManager.share.isSubscribed == false {
AdvManager.shared.showInterstitialAd(vc: self,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)
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()
vc.state = .home
self.navigationController?.pushViewController(vc, animated: true)
vc.callblock = { [weak self] in
self?.tableView.reloadRows(at: [indexPath], with: .none)
}
}
}
// self.tableView.reloadData()
}
}
......
......@@ -202,7 +202,7 @@ extension TrashViewController:UIScrollViewDelegate{
view.dataSource = data
// 获取当前免费次数
let freeCount = AdvManager.shared.defaultFreeTimes
let freeCount = ADManager.shared.defaultFreeTimes
Print("免费次数----\(freeCount)")
// 当免费次数用完以后,无论删除多少都需要弹出广告
if freeCount <= 0 {
......@@ -218,7 +218,7 @@ extension TrashViewController:UIScrollViewDelegate{
}
}else {
// 获取次数对应的删除照片数量
var freeDeleteCount = AdvManager.shared.advDeleteResouceDic[freeCount]!
var freeDeleteCount = ADManager.shared.advDeleteResouceDic[freeCount]!
let tempArray = data
if freeCount > 1 {
// 如果是前两次,可以免费删除5张照片
......@@ -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()
if deleteCount < 0 {
return
......@@ -291,15 +292,25 @@ extension TrashViewController:UIScrollViewDelegate{
}
if isMore == true {
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))
TrashDataManager.clearTrashData(mediaType: info.0,data: tempArray) {
info.1.dataSource.removeAll(where: {tempArray.map({$0.localIdentifier}).contains($0.localIdentifier)})
self.showDeleteSuccess(array: tempArray)
}
} showFailBlock: { _ in
}
}else{
let tempArray = Array(data.prefix(deleteCount))
TrashDataManager.clearTrashData(mediaType: info.0,data: tempArray) {
......@@ -324,7 +335,7 @@ extension TrashViewController:UIScrollViewDelegate{
/// 弹出广告
func popAdverTisement(){
AdvManager.shared.showRewardedInterstitialAd(vc: self,from: "trash")
// AdvManager.shared.showRewardedInterstitialAd(vc: self,from: "trash")
}
// 显示弹出框
......
......@@ -23,7 +23,7 @@ class TrashDataManager {
let trashData = self.getCurrentMediaTypeTrashData(mediaType: mediaType)
if trashData.count > 0 {
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 {
for item in data {
......
......@@ -135,7 +135,7 @@ extension EmailCleanListView : UITableViewDataSource,UITableViewDelegate {
// 广告
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 {
......@@ -154,6 +154,7 @@ extension EmailCleanListView : UITableViewDataSource,UITableViewDelegate {
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: EmailCleanListViewCell.id, for: indexPath) as! EmailCleanListViewCell
cell.selectionStyle = .none
let data = datasource[indexPath.row]
......
......@@ -184,7 +184,7 @@ extension EmailContentView :UITableViewDelegate,UITableViewDataSource{
// 广告
func popAdverTisement(){
AdvManager.shared.showInterstitialAd(vc: UIViewController.topMostViewController() ?? UIViewController())
// AdvManager.shared.showInterstitialAd(vc: UIViewController.topMostViewController() ?? UIViewController())
}
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 {
initCommentInfoInDisk()
}
// 首先是免费三次机会用完之后,第四次点击广告,在结果页点击棒极了(删除成功,且loading页面消失)
if AdvManager.shared.defaultFreeTimes == 0 {
if ADManager.shared.defaultFreeTimes == 0 {
// 判断当天有没有被触发过
if let isCommentInCurrentDay = UserDefaults.standard.object(forKey: SHOW_COMMENT_IN_CURRENT_DAY){
let temp : Bool = isCommentInCurrentDay as! Bool
......
......@@ -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 @@
//
import Foundation
import GoogleMobileAds
import ContactsUI
class Singleton {
// 使用静态常量来保存单例实例
......@@ -21,31 +20,8 @@ class Singleton {
var keepList : [TrashTypeEnum : [AssetModel]] = [:]
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