Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
P
PhoneManager
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Yang
PhoneManager
Commits
b53d6043
Commit
b53d6043
authored
May 23, 2025
by
shenyong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix bugs
parent
f5281983
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
246 additions
and
184 deletions
+246
-184
project.pbxproj
PhoneManager.xcodeproj/project.pbxproj
+2
-2
AdvManager.swift
...Manager/Class/Page/Advertisement/Manager/AdvManager.swift
+87
-58
ChargeInfoViewController.swift
...ass/Page/Charge/Controller/ChargeInfoViewController.swift
+1
-1
CompressQualityController.swift
.../Page/Compress/Controller/CompressQualityController.swift
+1
-1
MergeButtonView.swift
...Manager/Class/Page/Contact/View/Dup/MergeButtonView.swift
+3
-7
MergePreButtonView.swift
...ager/Class/Page/Contact/View/Dup/MergePreButtonView.swift
+3
-7
HomeInfoViewController.swift
...r/Class/Page/Home/Controller/HomeInfoViewController.swift
+1
-1
HomePhotosDetailViewController.swift
...Page/Home/Controller/HomePhotosDetailViewController.swift
+1
-1
HomeVideoDetailController.swift
...lass/Page/Home/Controller/HomeVideoDetailController.swift
+1
-1
HomeViewController.swift
...nager/Class/Page/Home/Controller/HomeViewController.swift
+12
-18
HomeView.swift
PhoneManager/Class/Page/Home/View/HomeView.swift
+1
-0
TrashSubView.swift
PhoneManager/Class/Page/Home/View/TrashSubView.swift
+1
-1
HomeViewModel.swift
PhoneManager/Class/Page/Home/ViewModel/HomeViewModel.swift
+14
-3
MaintaiBottomView.xib
PhoneManager/Class/Page/Keep/View/MaintaiBottomView.xib
+5
-5
PMLoadingView.swift
PhoneManager/Class/Page/Public/Loading/PMLoadingView.swift
+1
-1
SecretViewController.swift
PhoneManager/Class/Page/Secret/SecretViewController.swift
+45
-20
SecretActionView.swift
PhoneManager/Class/Page/Secret/View/SecretActionView.swift
+3
-1
SettingViewController.swift
.../Page/Settings/ViewController/SettingViewController.swift
+42
-34
TrashViewController.swift
...ger/Class/Page/Trash/Controller/TrashViewController.swift
+1
-1
Singleton.swift
PhoneManager/Class/Tool/Singleton/Singleton.swift
+21
-21
No files found.
PhoneManager.xcodeproj/project.pbxproj
View file @
b53d6043
...
...
@@ -821,7 +821,7 @@
"$(inherited)"
,
"@executable_path/Frameworks"
,
);
MARKETING_VERSION
=
1.1
.0
;
MARKETING_VERSION
=
2.2
.0
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.app.phonemanager
;
PRODUCT_NAME
=
"$(TARGET_NAME)"
;
PROVISIONING_PROFILE_SPECIFIER
=
""
;
...
...
@@ -870,7 +870,7 @@
"$(inherited)"
,
"@executable_path/Frameworks"
,
);
MARKETING_VERSION
=
1.1
.0
;
MARKETING_VERSION
=
2.2
.0
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.app.phonemanager
;
PRODUCT_NAME
=
"$(TARGET_NAME)"
;
PROVISIONING_PROFILE_SPECIFIER
=
""
;
...
...
PhoneManager/Class/Page/Advertisement/Manager/AdvManager.swift
View file @
b53d6043
...
...
@@ -12,6 +12,7 @@ import AppTrackingTransparency
import
AdSupport
import
AppLovinSDK
import
FBAudienceNetwork
import
SVProgressHUD
enum
AdvertisementType
{
case
rewardedInterstitialType
...
...
@@ -33,9 +34,13 @@ class AdvManager : NSObject, FullScreenContentDelegate {
var
adFromName
:
String
=
""
var
adFromVC
:
String
=
""
// 看完广告的回调
var
finisedCallBack
:()
->
Void
=
{}
var
serctCallBack
:()
->
Void
=
{}
// 广告都没播放成功回调
var
failueFinishedCallBack
:
()
->
Void
=
{}
...
...
@@ -45,10 +50,16 @@ class AdvManager : NSObject, FullScreenContentDelegate {
// 插页广告
var
interstitial
:
InterstitialAd
?
var
currentAdvType
:
AdvertisementType
=
.
rewardedInterstitialType
var
currentTimes
:
Int
=
3
/// 记录激励上次展示广告的时间
private
var
rewardlastAdShowTime
:
Date
?
/// 记录插屏上次展示广告的时间
private
var
interstitiallastAdShowTime
:
Date
?
var
isFromHome
=
false
/// 默认每日免费删除次数
var
defaultFreeTimes
:
Int
{
get
{
...
...
@@ -80,11 +91,8 @@ class AdvManager : NSObject, FullScreenContentDelegate {
/// 广告策略 第一次可删除5张,第二次可删除5张,第三次可删除4张
let
advDeleteResouceDic
:
[
Int
:
Int
]
=
[
3
:
5
,
2
:
5
,
1
:
4
,
0
:
0
]
// 进入页面之后30秒
var
advTimeAfterInAPP
:
Int
=
30
var
timer
:
DispatchSourceTimer
?
var
interstitialOnceAgin
=
false
var
rewardOnceAgin
=
false
/// 能请求广告
var
canRequestAds
:
Bool
{
...
...
@@ -156,6 +164,12 @@ class AdvManager : NSObject, FullScreenContentDelegate {
]
)
}
catch
{
if
rewardOnceAgin
==
false
{
rewardOnceAgin
=
true
Task
{
await
loadRewardedInterstitialAd
()
}
}
print
(
"Failed to load rewarded interstitial ad with error:
\(
error
.
localizedDescription
)
"
)
APIReportManager
.
shared
.
startReport
(
type
:
.
ad_pull
,
...
...
@@ -204,6 +218,12 @@ class AdvManager : NSObject, FullScreenContentDelegate {
]
)
}
catch
{
if
interstitialOnceAgin
==
false
{
interstitialOnceAgin
=
true
Task
{
await
loadInterstitial
()
}
}
print
(
"Failed to load interstitial ad with error:
\(
error
.
localizedDescription
)
"
)
APIReportManager
.
shared
.
startReport
(
type
:
.
ad_pull
,
...
...
@@ -218,21 +238,23 @@ class AdvManager : NSObject, FullScreenContentDelegate {
/// 开始显示
/// - Parameter completed: 准备完成后回调
func
showRewardedInterstitialAd
(
vc
:
UIViewController
,
from
:
String
=
""
)
{
func
showRewardedInterstitialAd
(
vc
:
UIViewController
,
from
:
String
=
""
,
isByInter
:
Bool
=
false
)
{
// 检查是否在上次广告展示后的 30 秒内
if
let
lastAdShowTime
=
rewardlastAdShowTime
{
let
timeSinceLastAd
=
Date
()
.
timeIntervalSince
(
lastAdShowTime
)
if
timeSinceLastAd
<
30
{
showErrMessage
(
vc
:
vc
)
return
}
}
guard
let
ad
=
self
.
rewardedInterstitialAd
else
{
Task
{
// 同时重新load两个广告内容
await
self
.
loadInterstitial
()
await
self
.
loadRewardedInterstitialAd
()
}
// 这里如果还没有,则弹出框
let
alert
=
UIAlertController
(
title
:
nil
,
message
:
"Ad wasn't ready"
,
preferredStyle
:
.
alert
)
vc
.
present
(
alert
,
animated
:
true
,
completion
:
nil
)
// 1 秒后关闭弹窗
DispatchQueue
.
main
.
asyncAfter
(
deadline
:
.
now
()
+
1
)
{
alert
.
dismiss
(
animated
:
true
)
{
self
.
failueFinishedCallBack
()
}
if
!
isByInter
{
showInterstitialAd
(
vc
:
vc
,
isByReward
:
true
)
}
else
{
showErrMessage
(
vc
:
vc
)
}
return
}
...
...
@@ -240,23 +262,40 @@ class AdvManager : NSObject, FullScreenContentDelegate {
APIReportManager
.
shared
.
startReport
(
type
:
.
ad_prepare_show
,
ext
:
[
"ad_type"
:
"rewardAd"
,
"from"
:
self
.
adFromName
])
ad
.
present
(
from
:
vc
)
{}
ad
.
present
(
from
:
nil
)
{}
}
/// 开始显示
/// - Parameter completed: 准备完成后回调
func
showInterstitialAd
(
vc
:
UIViewController
,
from
:
String
=
""
)
{
func
showInterstitialAd
(
vc
:
UIViewController
,
from
:
String
=
""
,
isByReward
:
Bool
=
false
,
needAlert
:
Bool
=
false
,
isHome
:
Bool
=
false
)
{
isFromHome
=
isHome
adFromVC
=
from
if
let
lastAdShowTime
=
interstitiallastAdShowTime
{
let
timeSinceLastAd
=
Date
()
.
timeIntervalSince
(
lastAdShowTime
)
if
timeSinceLastAd
<
30
{
if
needAlert
{
showErrMessage
(
vc
:
vc
)
}
else
{
finisedCallBack
()
}
return
}
}
guard
let
ad
=
self
.
interstitial
else
{
self
.
currentAdvType
=
.
rewardedInterstitialType
self
.
showRewardedInterstitialAd
(
vc
:
vc
)
Task
{
await
loadInterstitial
()
}
if
!
isByReward
{
showRewardedInterstitialAd
(
vc
:
vc
,
from
:
from
,
isByInter
:
true
)
}
return
}
self
.
currentAdvType
=
.
interstitialType
self
.
adFromName
=
from
APIReportManager
.
shared
.
startReport
(
type
:
.
ad_prepare_show
,
ext
:
[
"ad_type"
:
"interAd"
,
"from"
:
adFromName
])
ad
.
present
(
from
:
vc
)
ad
.
present
(
from
:
nil
)
}
...
...
@@ -266,7 +305,11 @@ class AdvManager : NSObject, FullScreenContentDelegate {
var
ad_type
=
"interAd"
if
let
_
=
ad
as?
RewardedInterstitialAd
{
ad_type
=
"rewardAd"
rewardlastAdShowTime
=
Date
()
}
else
{
interstitiallastAdShowTime
=
Date
()
}
APIReportManager
.
shared
.
startReport
(
type
:
.
ad_show
,
ext
:
[
"ad_type"
:
ad_type
,
"from"
:
adFromName
])
...
...
@@ -283,33 +326,32 @@ class AdvManager : NSObject, FullScreenContentDelegate {
APIReportManager
.
shared
.
startReport
(
type
:
.
ad_show_error
,
ext
:
[
"ad_type"
:
ad_type
,
"from"
:
adFromName
,
"reason"
:
error
.
localizedDescription
])
interstitiallastAdShowTime
=
nil
rewardlastAdShowTime
=
nil
self
.
rewardedInterstitialAd
=
nil
self
.
interstitial
=
nil
}
func
adDidDismissFullScreenContent
(
_
ad
:
FullScreenPresentingAd
)
{
print
(
"Ad did dismiss full screen content."
)
if
self
.
currentAdvType
==
.
interstitialType
{
// 如果播放的是插页广告,播放完成应该再缓存一份
self
.
interstitial
=
nil
if
let
_
=
ad
as?
RewardedInterstitialAd
{
self
.
rewardedInterstitialAd
=
nil
Task
{
await
self
.
load
Interstitial
()
await
self
.
load
RewardedInterstitialAd
()
}
}
else
{
// 如果播放的是插页激励,则应该同时缓存两个(因为只有在插页广告没有的情况下才会到插页激励广告)
self
.
rewardedInterstitialAd
=
nil
self
.
interstitial
=
nil
Task
{
await
self
.
loadInterstitial
()
await
self
.
loadRewardedInterstitialAd
()
}
}
// 更新值
updateAdvStrategyValue
()
finisedCallBack
()
}
func
adDidRecordClick
(
_
ad
:
any
FullScreenPresentingAd
)
{
print
(
"点击广告"
)
...
...
@@ -320,32 +362,19 @@ class AdvManager : NSObject, FullScreenContentDelegate {
ext
:
pram
)
}
/// 广告结束之后重置策略信息
func
updateAdvStrategyValue
()
{
AdvManager
.
shared
.
timer
=
nil
AdvManager
.
shared
.
advTimeAfterInAPP
=
30
Singleton
.
shared
.
startCountdown
{}
}
func
ad
(
_
ad
:
FullScreenPresentingAd
,
didReceivePaidEvent
adValue
:
AdValue
)
{
let
valueMicros
=
adValue
.
value
let
currencyCode
=
adValue
.
currencyCode
let
precision
=
adValue
.
precision
// 获取基础广告信息
var
pram
=
loadedAdNetworkResponseInfo
(
ad
:
ad
)
// 添加价值相关信息到 pram 字典中
pram
[
"value"
]
=
"
\(
valueMicros
)
"
pram
[
"currency"
]
=
currencyCode
pram
[
"precision"
]
=
"
\(
precision
.
rawValue
)
"
print
(
"广告价值和来源"
,
pram
)
// 使用 APIReportManager 上报广告价值
APIReportManager
()
.
startReport
(
type
:
.
ad_price
,
ext
:
pram
)
func
showErrMessage
(
vc
:
UIViewController
){
// 这里如果还没有,则弹出框
let
alert
=
UIAlertController
(
title
:
nil
,
message
:
"Ad wasn't ready"
,
preferredStyle
:
.
alert
)
GETCURRENTNAV
()?
.
present
(
alert
,
animated
:
true
,
completion
:
nil
)
// 1 秒后关闭弹窗
DispatchQueue
.
main
.
asyncAfter
(
deadline
:
.
now
()
+
1
)
{
alert
.
dismiss
(
animated
:
true
)
{
self
.
failueFinishedCallBack
()
}
}
// SVProgressHUD.showInfo(withStatus: "Ad wasn't ready")
}
}
...
...
PhoneManager/Class/Page/Charge/Controller/ChargeInfoViewController.swift
View file @
b53d6043
...
...
@@ -238,7 +238,7 @@ class ChargeInfoViewController:BaseViewController {
/// 弹出广告
func
popAdverTisement
(){
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
,
from
:
"charge"
)
AdvManager
.
shared
.
show
Rewarded
InterstitialAd
(
vc
:
self
,
from
:
"charge"
)
}
}
PhoneManager/Class/Page/Compress/Controller/CompressQualityController.swift
View file @
b53d6043
...
...
@@ -316,7 +316,7 @@ class CompressQualityController : BaseViewController{
}
/// 弹出广告
func
popAdverTisement
(){
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
,
from
:
"compress"
)
AdvManager
.
shared
.
show
Rewarded
InterstitialAd
(
vc
:
self
,
from
:
"compress"
)
}
}
PhoneManager/Class/Page/Contact/View/Dup/MergeButtonView.swift
View file @
b53d6043
...
...
@@ -63,13 +63,9 @@ extension MergeButtonView {
self
.
alertWhenMergeContact
()
if
IAPManager
.
share
.
isSubscribed
==
false
{
// 添加的时候需要先弹出广告
if
AdvManager
.
shared
.
advTimeAfterInAPP
<=
0
{
if
let
vc
=
self
.
responderViewController
()
{
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
vc
,
from
:
"merge"
)
AdvManager
.
shared
.
finisedCallBack
=
{
self
.
alertWhenMergeContact
()
}
}
else
{
if
let
vc
=
self
.
responderViewController
()
{
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
vc
,
from
:
"merge"
,
needAlert
:
true
)
AdvManager
.
shared
.
finisedCallBack
=
{
self
.
alertWhenMergeContact
()
}
}
else
{
...
...
PhoneManager/Class/Page/Contact/View/Dup/MergePreButtonView.swift
View file @
b53d6043
...
...
@@ -60,13 +60,9 @@ extension MergePreButtonView {
@objc
func
mergePre
(){
if
IAPManager
.
share
.
isSubscribed
==
false
{
// 添加的时候需要先弹出广告
if
AdvManager
.
shared
.
advTimeAfterInAPP
<=
0
{
if
let
vc
=
self
.
responderViewController
()
{
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
vc
)
AdvManager
.
shared
.
finisedCallBack
=
{
self
.
mergePreCallBack
()
}
}
else
{
if
let
vc
=
self
.
responderViewController
()
{
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
vc
,
needAlert
:
true
)
AdvManager
.
shared
.
finisedCallBack
=
{
self
.
mergePreCallBack
()
}
}
else
{
...
...
PhoneManager/Class/Page/Home/Controller/HomeInfoViewController.swift
View file @
b53d6043
...
...
@@ -310,7 +310,7 @@ class HomeInfoViewController:BaseViewController {
/// 弹出广告
func
popAdverTisement
(){
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
)
AdvManager
.
shared
.
show
Rewarded
InterstitialAd
(
vc
:
self
)
}
// 由于继承自 UIViewController,必须实现这个必需的构造器
...
...
PhoneManager/Class/Page/Home/Controller/HomePhotosDetailViewController.swift
View file @
b53d6043
...
...
@@ -776,7 +776,7 @@ extension HomePhotosDetailViewController:WaterfallMutiSectionDelegate,UICollecti
/// 弹出广告
func
popAdverTisement
(){
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
,
from
:
self
.
mediaType
?
.
rawValue
??
""
)
AdvManager
.
shared
.
show
Rewarded
InterstitialAd
(
vc
:
self
,
from
:
self
.
mediaType
?
.
rawValue
??
""
)
}
func
deleteAction
(
count
:
Int
,
isAfterAdv
:
Bool
){
...
...
PhoneManager/Class/Page/Home/Controller/HomeVideoDetailController.swift
View file @
b53d6043
...
...
@@ -669,7 +669,7 @@ extension HomeVideoDetailController:WaterfallMutiSectionDelegate,UICollectionVie
/// 弹出广告
func
popAdverTisement
(){
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
,
from
:
"video_delete"
)
AdvManager
.
shared
.
show
Rewarded
InterstitialAd
(
vc
:
self
,
from
:
"video_delete"
)
}
func
deleteAction
(
count
:
Int
,
isAfterAdv
:
Bool
){
...
...
PhoneManager/Class/Page/Home/Controller/HomeViewController.swift
View file @
b53d6043
...
...
@@ -19,7 +19,7 @@ class HomeViewController:BaseViewController {
var
homeView
:
HomeView
?
let
adManager
=
AdvManager
.
shared
fileprivate
func
junmToModule
(
_
cIndex
:
String
,
_
self
:
HomeViewController
)
{
switch
cIndex
{
...
...
@@ -180,22 +180,20 @@ class HomeViewController:BaseViewController {
if
let
cIndex
=
index
as?
String
{
// 先走广告策略
if
AdvManager
.
shared
.
advTimeAfterInAPP
<=
0
{
if
IAPManager
.
share
.
isSubscribed
==
false
{
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
,
from
:
cIndex
)
}
else
{
junmToModule
(
cIndex
,
self
)
}
}
else
{
junmToModule
(
cIndex
,
self
)
if
IAPManager
.
share
.
isSubscribed
==
false
{
self
.
adManager
.
showInterstitialAd
(
vc
:
self
,
from
:
cIndex
,
isHome
:
true
)
}
AdvManager
.
shared
.
finisedCallBack
=
{
self
.
junmToModule
(
cIndex
,
self
)
// junmToModule(cIndex, self)
self
.
adManager
.
finisedCallBack
=
{
if
self
.
adManager
.
isFromHome
{
self
.
junmToModule
(
cIndex
,
self
)
}
}
AdvManager
.
shared
.
failueFinishedCallBack
=
{
self
.
adManager
.
failueFinishedCallBack
=
{
// 首页特殊要求广告没准备好也需要跳转
self
.
junmToModule
(
cIndex
,
self
)
if
self
.
adManager
.
isFromHome
{
self
.
junmToModule
(
cIndex
,
self
)
}
}
}
}
...
...
@@ -289,11 +287,7 @@ class HomeViewController:BaseViewController {
override
func
viewDidAppear
(
_
animated
:
Bool
)
{
super
.
viewDidAppear
(
animated
)
self
.
barHidden
=
false
// 开启定时器
Singleton
.
shared
.
startCountdown
{}
if
!
isShowCharge
{
NotificationManager
()
.
configNotifications
()
return
...
...
PhoneManager/Class/Page/Home/View/HomeView.swift
View file @
b53d6043
...
...
@@ -103,6 +103,7 @@ class HomeView:UIView {
NotificationCenter
.
default
.
addObserver
(
forName
:
Notification
.
Name
(
"applicationDidBecomeActive"
),
object
:
nil
,
queue
:
nil
)
{[
weak
self
]
_
in
guard
let
weakSelf
=
self
else
{
return
}
weakSelf
.
homeHeader
?
.
progressBar
.
chaoticProgress
=
CGFloat
(
weakSelf
.
viewModel
.
totalSize
)
weakSelf
.
collectionView
.
reloadData
()
}
}
...
...
PhoneManager/Class/Page/Home/View/TrashSubView.swift
View file @
b53d6043
...
...
@@ -259,7 +259,7 @@ extension TrashSubView {
/// 弹出广告
func
popAdverTisement
(){
if
let
vc
=
self
.
responderViewController
()
{
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
vc
,
from
:
"trash"
)
AdvManager
.
shared
.
show
Rewarded
InterstitialAd
(
vc
:
vc
,
from
:
"trash"
)
}
}
...
...
PhoneManager/Class/Page/Home/ViewModel/HomeViewModel.swift
View file @
b53d6043
...
...
@@ -183,7 +183,7 @@ class HomeViewModel {
}
completionHandler
:
{[
weak
self
]
totalGroup
in
guard
let
weakSelf
=
self
else
{
return
}
print
(
"获取相似截图完成"
,
totalGroup
.
count
)
weakSelf
.
photoManager
.
similarScreenShotModels
=
totalGroup
weakSelf
.
photoManager
.
similarScreenShotModels
=
weakSelf
.
sortGroupsByTime
(
totalGroup
)
weakSelf
.
filterResource
()
weakSelf
.
homeDataChanged
?(
1
,
type
.
index
,
false
)
}
...
...
@@ -203,7 +203,7 @@ class HomeViewModel {
}
completionHandler
:
{[
weak
self
]
totalGroup
in
print
(
"获取相似视频完成"
,
totalGroup
.
count
)
guard
let
weakSelf
=
self
else
{
return
}
weakSelf
.
photoManager
.
similarVideoModels
=
totalGroup
weakSelf
.
photoManager
.
similarVideoModels
=
weakSelf
.
sortGroupsByTime
(
totalGroup
)
weakSelf
.
filterResource
()
weakSelf
.
homeDataChanged
?(
1
,
type
.
index
,
false
)
}
...
...
@@ -242,7 +242,7 @@ class HomeViewModel {
}
else
{
print
(
"在后台线程执行"
)
}
weakSelf
.
photoManager
.
duplicateModels
=
totalGroup
weakSelf
.
photoManager
.
duplicateModels
=
weakSelf
.
sortGroupsByTime
(
totalGroup
)
weakSelf
.
filterResource
()
// weakSelf.reloadCellHeight?()
weakSelf
.
homeDataChanged
?(
0
,
type
.
index
,
true
)
...
...
@@ -256,5 +256,16 @@ class HomeViewModel {
func
filterResource
(){
photoManager
.
filterResource
()
}
func
sortGroupsByTime
(
_
groups
:
[[
AssetModel
]])
->
[[
AssetModel
]]
{
return
groups
.
sorted
{
group1
,
group2
in
guard
let
firstAsset1
=
group1
.
first
,
let
firstAsset2
=
group2
.
first
else
{
return
false
}
return
firstAsset1
.
createDate
>
firstAsset2
.
createDate
}
}
}
PhoneManager/Class/Page/Keep/View/MaintaiBottomView.xib
View file @
b53d6043
<?xml version="1.0" encoding="UTF-8"?>
<document
type=
"com.apple.InterfaceBuilder3.CocoaTouch.XIB"
version=
"3.0"
toolsVersion=
"23
727
"
targetRuntime=
"iOS.CocoaTouch"
propertyAccessControl=
"none"
useAutolayout=
"YES"
useTraitCollections=
"YES"
useSafeAreas=
"YES"
colorMatched=
"YES"
>
<document
type=
"com.apple.InterfaceBuilder3.CocoaTouch.XIB"
version=
"3.0"
toolsVersion=
"23
504
"
targetRuntime=
"iOS.CocoaTouch"
propertyAccessControl=
"none"
useAutolayout=
"YES"
useTraitCollections=
"YES"
useSafeAreas=
"YES"
colorMatched=
"YES"
>
<device
id=
"retina6_12"
orientation=
"portrait"
appearance=
"light"
/>
<dependencies>
<deployment
identifier=
"iOS"
/>
<plugIn
identifier=
"com.apple.InterfaceBuilder.IBCocoaTouchPlugin"
version=
"23
721
"
/>
<plugIn
identifier=
"com.apple.InterfaceBuilder.IBCocoaTouchPlugin"
version=
"23
506
"
/>
<capability
name=
"Safe area layout guides"
minToolsVersion=
"9.0"
/>
<capability
name=
"documents saved in the Xcode 8 format"
minToolsVersion=
"8.0"
/>
</dependencies>
...
...
@@ -27,15 +27,15 @@
<nil
key=
"highlightedColor"
/>
</label>
<button
opaque=
"NO"
contentMode=
"scaleToFill"
contentHorizontalAlignment=
"center"
contentVerticalAlignment=
"center"
lineBreakMode=
"middleTruncation"
translatesAutoresizingMaskIntoConstraints=
"NO"
id=
"XE9-Mv-kN1"
>
<rect
key=
"frame"
x=
"2
30"
y=
"20"
width=
"174
"
height=
"40"
/>
<rect
key=
"frame"
x=
"2
54"
y=
"20"
width=
"150
"
height=
"40"
/>
<color
key=
"backgroundColor"
red=
"0.0"
green=
"0.50980392159999999"
blue=
"1"
alpha=
"1"
colorSpace=
"custom"
customColorSpace=
"sRGB"
/>
<constraints>
<constraint
firstAttribute=
"width"
constant=
"1
74
"
id=
"EG9-xJ-hJZ"
/>
<constraint
firstAttribute=
"width"
constant=
"1
50
"
id=
"EG9-xJ-hJZ"
/>
<constraint
firstAttribute=
"height"
constant=
"40"
id=
"ddO-RT-eKr"
/>
</constraints>
<fontDescription
key=
"fontDescription"
type=
"system"
weight=
"semibold"
pointSize=
"16"
/>
<inset
key=
"imageEdgeInsets"
minX=
"0.0"
minY=
"0.0"
maxX=
"2.2250738585072014e-308"
maxY=
"0.0"
/>
<state
key=
"normal"
title=
"
Un-keep Selected
"
/>
<state
key=
"normal"
title=
"
Not keep All
"
/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute
type=
"number"
keyPath=
"Radius"
>
<real
key=
"value"
value=
"10"
/>
...
...
PhoneManager/Class/Page/Public/Loading/PMLoadingView.swift
View file @
b53d6043
...
...
@@ -112,7 +112,7 @@ class PMLoadingView: UIView {
title
.
snp
.
makeConstraints
{
make
in
make
.
centerX
.
equalToSuperview
()
make
.
top
.
equalTo
(
animationView
.
snp
.
bottom
)
.
offset
(
-
8
0
)
make
.
top
.
equalTo
(
animationView
.
snp
.
bottom
)
.
offset
(
-
5
0
)
}
subtitle
.
snp
.
makeConstraints
{
make
in
...
...
PhoneManager/Class/Page/Secret/SecretViewController.swift
View file @
b53d6043
...
...
@@ -78,6 +78,7 @@ class SecretViewController: BaseViewController {
alert
.
show
()
}
}
override
func
viewWillAppear
(
_
animated
:
Bool
)
{
super
.
viewWillAppear
(
animated
)
...
...
@@ -263,9 +264,32 @@ class SecretViewController: BaseViewController {
if
idx
<
0
{
if
IAPManager
.
share
.
isSubscribed
==
false
{
// 添加的时候需要先弹出广告
if
AdvManager
.
shared
.
advTimeAfterInAPP
<=
0
{
popAdverTisement
()
AdvManager
.
shared
.
finisedCallBack
=
{
// if AdvManager.shared.advTimeAfterInAPP <= 0{
// popAdverTisement()
// AdvManager.shared.finisedCallBack = {
// self.AddAction = SecretActionView()
// self.AddAction.show();
// self.view.showBlur()
// self.AddAction.callback = { idx in
// popAdvThenDo(idx: idx)
// }
// }
// }else {
// self.AddAction = SecretActionView()
// self.view.showBlur()
// self.AddAction.show();
// self.AddAction.callback = { idx in
// popAdvThenDo(idx: idx)
// }
// }
// self.AddAction = SecretActionView()
// self.AddAction.show();
// self.view.showBlur()
// self.AddAction.callback = { idx in
// popAdvThenDo(idx: idx)
// }
AdvManager
.
shared
.
finisedCallBack
=
{
if
AdvManager
.
shared
.
adFromVC
==
"Secret"
{
self
.
AddAction
=
SecretActionView
()
self
.
AddAction
.
show
();
self
.
view
.
showBlur
()
...
...
@@ -273,14 +297,10 @@ class SecretViewController: BaseViewController {
popAdvThenDo
(
idx
:
idx
)
}
}
}
else
{
self
.
AddAction
=
SecretActionView
()
self
.
view
.
showBlur
()
self
.
AddAction
.
show
();
self
.
AddAction
.
callback
=
{
idx
in
popAdvThenDo
(
idx
:
idx
)
}
}
popAdverTisement
()
}
else
{
self
.
AddAction
=
SecretActionView
()
...
...
@@ -314,21 +334,25 @@ class SecretViewController: BaseViewController {
}
func
popAdverTisement
(){
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
,
from
:
"Secret"
)
}
// 临时方法
func
popAdvThenDo
(
idx
:
Int
){
if
AdvManager
.
shared
.
advTimeAfterInAPP
<=
0
{
popAdverTisement
()
AdvManager
.
shared
.
finisedCallBack
=
{
self
.
view
.
hideBlur
()
self
.
AddImagePicker
(
idx
)
}
}
else
{
self
.
view
.
hideBlur
()
self
.
AddImagePicker
(
idx
)
}
self
.
view
.
hideBlur
()
self
.
AddImagePicker
(
idx
)
// if AdvManager.shared.advTimeAfterInAPP <= 0{
// popAdverTisement()
// AdvManager.shared.finisedCallBack = {
// self.view.hideBlur()
// self.AddImagePicker(idx)
// }
// }else {
// self.view.hideBlur()
// self.AddImagePicker(idx)
// }
}
}
return
b
...
...
@@ -362,6 +386,7 @@ class SecretViewController: BaseViewController {
}()
deinit
{
Print
(
"释放SecretViewController"
)
SecretImageCache
.
share
.
removeAllImage
()
}
...
...
PhoneManager/Class/Page/Secret/View/SecretActionView.swift
View file @
b53d6043
...
...
@@ -110,9 +110,11 @@ class SecretActionView: UIViewController ,UIViewControllerTransitioningDelegate
func
show
()
->
Void
{
guard
let
rt
=
cWindow
?
.
rootViewController
else
{
return
}
//
guard let rt = cWindow?.rootViewController else { return }
self
.
modalTransitionStyle
=
.
crossDissolve
self
.
modalPresentationStyle
=
.
overFullScreen
guard
let
rt
=
UIViewController
.
topMostViewController
()
else
{
return
}
rt
.
present
(
self
,
animated
:
true
)
}
...
...
PhoneManager/Class/Page/Settings/ViewController/SettingViewController.swift
View file @
b53d6043
...
...
@@ -176,23 +176,27 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV
vibrate
()
break
case
settingLabels
.
Widgets
.
rawValue
:
let
callblock
:(()
->
Void
)
=
{[
weak
self
]
in
guard
let
self
=
self
else
{
return
}
let
widget
=
WidgetViewController
()
self
.
navigationController
?
.
pushViewController
(
widget
,
animated
:
true
)
}
if
AdvManager
.
shared
.
advTimeAfterInAPP
<=
0
{
if
IAPManager
.
share
.
isSubscribed
==
false
{
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
,
from
:
"Widgets"
)
}
else
{
callblock
()
}
}
else
{
callblock
()
}
AdvManager
.
shared
.
finisedCallBack
=
{
callblock
()
// let callblock:(()->Void) = {[weak self] in
// guard let self = self else { return }
// let widget = WidgetViewController()
// self.navigationController?.pushViewController(widget, animated: true)
// }
// if IAPManager.share.isSubscribed == false {
//// AdvManager.shared.showInterstitialAd(vc: self,from: "Widgets")
//// let widget = WidgetViewController()
//// self.navigationController?.pushViewController(widget, animated: true)
// }else{
// callblock()
// }
// AdvManager.shared.finisedCallBack = {
// callblock()
// }
if
IAPManager
.
share
.
isSubscribed
==
false
{
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
,
from
:
"Widgets"
)
}
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
}
...
...
@@ -326,25 +330,29 @@ class SettingViewController : BaseViewController , UITableViewDelegate, UITableV
}
alert
.
show
()
}
else
{
let
callblock
:(()
->
Void
)
=
{
[
weak
self
]
in
guard
let
self
=
self
else
{
return
}
let
vc
:
EmailLoginController
=
EmailLoginController
()
vc
.
state
=
.
home
self
.
navigationController
?
.
pushViewController
(
vc
,
animated
:
true
)
self
.
tableView
.
reloadData
()
}
if
AdvManager
.
shared
.
advTimeAfterInAPP
<=
0
{
if
IAPManager
.
share
.
isSubscribed
==
false
{
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
,
from
:
"emailLoginSignOut"
)
}
else
{
callblock
()
}
}
else
{
callblock
()
}
AdvManager
.
shared
.
finisedCallBack
=
{
callblock
()
// let callblock:(()->Void) = { [weak self] in
// guard let self = self else { return }
// let vc:EmailLoginController = EmailLoginController()
// vc.state = .home
// self.navigationController?.pushViewController(vc, animated: true)
// self.tableView.reloadData()
// }
// if IAPManager.share.isSubscribed == false {
// AdvManager.shared.showInterstitialAd(vc: self,from: "emailLoginSignOut")
// }else{
// callblock()
// }
// AdvManager.shared.finisedCallBack = {
// 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
)
self
.
tableView
.
reloadData
()
}
}
...
...
PhoneManager/Class/Page/Trash/Controller/TrashViewController.swift
View file @
b53d6043
...
...
@@ -321,7 +321,7 @@ extension TrashViewController:UIScrollViewDelegate{
/// 弹出广告
func
popAdverTisement
(){
AdvManager
.
shared
.
showInterstitialAd
(
vc
:
self
,
from
:
"trash"
)
AdvManager
.
shared
.
show
Rewarded
InterstitialAd
(
vc
:
self
,
from
:
"trash"
)
}
// 显示弹出框
...
...
PhoneManager/Class/Tool/Singleton/Singleton.swift
View file @
b53d6043
...
...
@@ -24,27 +24,27 @@ class Singleton {
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
()
}
//
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()
//
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment