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