1.开屏广告

This commit is contained in:
澜声世纪 2025-12-11 11:17:46 +08:00
parent 4c250038e0
commit 67eeef0447
58 changed files with 2653 additions and 52 deletions

View File

@ -36,8 +36,8 @@ target 'SynthReel' do
pod 'Adjust'
# # AdMob SDK
# pod 'Google-Mobile-Ads-SDK'
pod 'Google-Mobile-Ads-SDK'
#
# # AppLovin SDK
# pod 'AppLovinSDK'
pod 'AppLovinSDK'
end

View File

@ -205,6 +205,25 @@
85AE54782EE8106F0058FEA3 /* SRApnsAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AE54772EE8106F0058FEA3 /* SRApnsAlert.swift */; };
85AE547A2EE8154A0058FEA3 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 85AE54792EE8154A0058FEA3 /* GoogleService-Info.plist */; };
85AE549C2EE81E730058FEA3 /* SRAppStartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AE549B2EE81E730058FEA3 /* SRAppStartViewController.swift */; };
85DFB3B12EE957A800CBD0FC /* SRUpdatesAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3B02EE957A800CBD0FC /* SRUpdatesAlert.swift */; };
85DFB3B32EE95EFB00CBD0FC /* SRVersionUpdateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3B22EE95EFB00CBD0FC /* SRVersionUpdateModel.swift */; };
85DFB3B52EE96B8600CBD0FC /* SRLogoutAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3B42EE96B8600CBD0FC /* SRLogoutAlert.swift */; };
85DFB3B72EE9766000CBD0FC /* SRRemoveCollectAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3B62EE9766000CBD0FC /* SRRemoveCollectAlert.swift */; };
85DFB3BB2EE97A1E00CBD0FC /* SRWalletViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3BA2EE97A1E00CBD0FC /* SRWalletViewController.swift */; };
85DFB3BF2EE991D400CBD0FC /* SROpenAdManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3BE2EE991D400CBD0FC /* SROpenAdManager.swift */; };
85DFB3CE2EEA51A900CBD0FC /* VPBannerAdManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3C42EEA51A900CBD0FC /* VPBannerAdManager.swift */; };
85DFB3CF2EEA51A900CBD0FC /* VPAdInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3CA2EEA51A900CBD0FC /* VPAdInfo.swift */; };
85DFB3D02EEA51A900CBD0FC /* VPAdManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3CB2EEA51A900CBD0FC /* VPAdManager.swift */; };
85DFB3D12EEA51A900CBD0FC /* VPGoogleRewardedAd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3C72EEA51A900CBD0FC /* VPGoogleRewardedAd.swift */; };
85DFB3D22EEA51A900CBD0FC /* VPApplovinRewardedAd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3C62EEA51A900CBD0FC /* VPApplovinRewardedAd.swift */; };
85DFB3D32EEA51A900CBD0FC /* VPApplovinBannerAd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3C32EEA51A900CBD0FC /* VPApplovinBannerAd.swift */; };
85DFB3D42EEA51A900CBD0FC /* VPStatAdModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3CC2EEA51A900CBD0FC /* VPStatAdModel.swift */; };
85DFB3D52EEA51A900CBD0FC /* VPAppOpenAdManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3C12EEA51A900CBD0FC /* VPAppOpenAdManager.swift */; };
85DFB3D62EEA51A900CBD0FC /* VPRewardedAdManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3C82EEA51A900CBD0FC /* VPRewardedAdManager.swift */; };
85DFB3D72EEA51A900CBD0FC /* VPApplovinAppOpenAd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3C02EEA51A900CBD0FC /* VPApplovinAppOpenAd.swift */; };
85DFB3D92EEA523B00CBD0FC /* SRAdManger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3D82EEA523B00CBD0FC /* SRAdManger.swift */; };
85DFB3DD2EEA5D5A00CBD0FC /* SRAdmobOpenAd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3DC2EEA5D5A00CBD0FC /* SRAdmobOpenAd.swift */; };
85DFB3DF2EEA671C00CBD0FC /* SRAppOpenAdViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85DFB3DE2EEA671C00CBD0FC /* SRAppOpenAdViewController.swift */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@ -534,6 +553,25 @@
85AE54822EE818180058FEA3 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
85AE549A2EE8183A0058FEA3 /* SynthReel.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SynthReel.entitlements; sourceTree = "<group>"; };
85AE549B2EE81E730058FEA3 /* SRAppStartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRAppStartViewController.swift; sourceTree = "<group>"; };
85DFB3B02EE957A800CBD0FC /* SRUpdatesAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUpdatesAlert.swift; sourceTree = "<group>"; };
85DFB3B22EE95EFB00CBD0FC /* SRVersionUpdateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRVersionUpdateModel.swift; sourceTree = "<group>"; };
85DFB3B42EE96B8600CBD0FC /* SRLogoutAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRLogoutAlert.swift; sourceTree = "<group>"; };
85DFB3B62EE9766000CBD0FC /* SRRemoveCollectAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRRemoveCollectAlert.swift; sourceTree = "<group>"; };
85DFB3BA2EE97A1E00CBD0FC /* SRWalletViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRWalletViewController.swift; sourceTree = "<group>"; };
85DFB3BE2EE991D400CBD0FC /* SROpenAdManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SROpenAdManager.swift; sourceTree = "<group>"; };
85DFB3C02EEA51A900CBD0FC /* VPApplovinAppOpenAd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPApplovinAppOpenAd.swift; sourceTree = "<group>"; };
85DFB3C12EEA51A900CBD0FC /* VPAppOpenAdManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPAppOpenAdManager.swift; sourceTree = "<group>"; };
85DFB3C32EEA51A900CBD0FC /* VPApplovinBannerAd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPApplovinBannerAd.swift; sourceTree = "<group>"; };
85DFB3C42EEA51A900CBD0FC /* VPBannerAdManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPBannerAdManager.swift; sourceTree = "<group>"; };
85DFB3C62EEA51A900CBD0FC /* VPApplovinRewardedAd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPApplovinRewardedAd.swift; sourceTree = "<group>"; };
85DFB3C72EEA51A900CBD0FC /* VPGoogleRewardedAd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPGoogleRewardedAd.swift; sourceTree = "<group>"; };
85DFB3C82EEA51A900CBD0FC /* VPRewardedAdManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPRewardedAdManager.swift; sourceTree = "<group>"; };
85DFB3CA2EEA51A900CBD0FC /* VPAdInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPAdInfo.swift; sourceTree = "<group>"; };
85DFB3CB2EEA51A900CBD0FC /* VPAdManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPAdManager.swift; sourceTree = "<group>"; };
85DFB3CC2EEA51A900CBD0FC /* VPStatAdModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPStatAdModel.swift; sourceTree = "<group>"; };
85DFB3D82EEA523B00CBD0FC /* SRAdManger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRAdManger.swift; sourceTree = "<group>"; };
85DFB3DC2EEA5D5A00CBD0FC /* SRAdmobOpenAd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRAdmobOpenAd.swift; sourceTree = "<group>"; };
85DFB3DE2EEA671C00CBD0FC /* SRAppOpenAdViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRAppOpenAdViewController.swift; sourceTree = "<group>"; };
AA88214030574193B51DE563 /* Pods-SynthReel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SynthReel.release.xcconfig"; path = "Target Support Files/Pods-SynthReel/Pods-SynthReel.release.xcconfig"; sourceTree = "<group>"; };
F9255BF4D4B1CFDDB5CFFB43 /* Pods_SynthReel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SynthReel.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
@ -604,6 +642,7 @@
03B1A8442EC5CBBB006C353F /* SRNavigationController.swift */,
03B1A8462EC5CBCF006C353F /* SRViewController.swift */,
85AE549B2EE81E730058FEA3 /* SRAppStartViewController.swift */,
85DFB3DE2EEA671C00CBD0FC /* SRAppOpenAdViewController.swift */,
);
path = ViewController;
sourceTree = "<group>";
@ -835,6 +874,8 @@
03E9A7D22EC47204000D1067 /* Base */ = {
isa = PBXGroup;
children = (
85DFB3CD2EEA51A900CBD0FC /* AdManager */,
85DFB3BC2EE9919000CBD0FC /* Admanger */,
85AE54742EE80D7A0058FEA3 /* Model */,
3754ACE22ED93E04009EBCAD /* webview */,
03B1A8412EC5CB4F006C353F /* ViewController */,
@ -850,6 +891,7 @@
03E9A7D32EC4720F000D1067 /* Class */ = {
isa = PBXGroup;
children = (
85DFB3B82EE979FE00CBD0FC /* wallet */,
3754ACFF2EDA8A43009EBCAD /* Login */,
3754ACF92ED9A34E009EBCAD /* Store */,
3754ACDD2ED93C14009EBCAD /* Coinpack */,
@ -1020,6 +1062,9 @@
children = (
3754ACD02ED81F55009EBCAD /* SRBaseAlert.swift */,
85AE54772EE8106F0058FEA3 /* SRApnsAlert.swift */,
85DFB3B02EE957A800CBD0FC /* SRUpdatesAlert.swift */,
85DFB3B42EE96B8600CBD0FC /* SRLogoutAlert.swift */,
85DFB3B62EE9766000CBD0FC /* SRRemoveCollectAlert.swift */,
);
path = Alert;
sourceTree = "<group>";
@ -1586,10 +1631,102 @@
isa = PBXGroup;
children = (
85AE54752EE80D900058FEA3 /* SROpenAppModel.swift */,
85DFB3B22EE95EFB00CBD0FC /* SRVersionUpdateModel.swift */,
);
path = Model;
sourceTree = "<group>";
};
85DFB3B82EE979FE00CBD0FC /* wallet */ = {
isa = PBXGroup;
children = (
85DFB3B92EE97A0700CBD0FC /* VC */,
);
path = wallet;
sourceTree = "<group>";
};
85DFB3B92EE97A0700CBD0FC /* VC */ = {
isa = PBXGroup;
children = (
85DFB3BA2EE97A1E00CBD0FC /* SRWalletViewController.swift */,
);
path = VC;
sourceTree = "<group>";
};
85DFB3BC2EE9919000CBD0FC /* Admanger */ = {
isa = PBXGroup;
children = (
85DFB3DB2EEA563700CBD0FC /* RewardAd */,
85DFB3DA2EEA562700CBD0FC /* BannerAd */,
85DFB3BD2EE991B400CBD0FC /* OpenAd */,
85DFB3D82EEA523B00CBD0FC /* SRAdManger.swift */,
);
path = Admanger;
sourceTree = "<group>";
};
85DFB3BD2EE991B400CBD0FC /* OpenAd */ = {
isa = PBXGroup;
children = (
85DFB3BE2EE991D400CBD0FC /* SROpenAdManager.swift */,
);
path = OpenAd;
sourceTree = "<group>";
};
85DFB3C22EEA51A900CBD0FC /* AppOpen */ = {
isa = PBXGroup;
children = (
85DFB3C02EEA51A900CBD0FC /* VPApplovinAppOpenAd.swift */,
85DFB3C12EEA51A900CBD0FC /* VPAppOpenAdManager.swift */,
);
path = AppOpen;
sourceTree = "<group>";
};
85DFB3C52EEA51A900CBD0FC /* Banner */ = {
isa = PBXGroup;
children = (
85DFB3C32EEA51A900CBD0FC /* VPApplovinBannerAd.swift */,
85DFB3C42EEA51A900CBD0FC /* VPBannerAdManager.swift */,
);
path = Banner;
sourceTree = "<group>";
};
85DFB3C92EEA51A900CBD0FC /* Rewarded */ = {
isa = PBXGroup;
children = (
85DFB3C62EEA51A900CBD0FC /* VPApplovinRewardedAd.swift */,
85DFB3C72EEA51A900CBD0FC /* VPGoogleRewardedAd.swift */,
85DFB3C82EEA51A900CBD0FC /* VPRewardedAdManager.swift */,
);
path = Rewarded;
sourceTree = "<group>";
};
85DFB3CD2EEA51A900CBD0FC /* AdManager */ = {
isa = PBXGroup;
children = (
85DFB3C22EEA51A900CBD0FC /* AppOpen */,
85DFB3C52EEA51A900CBD0FC /* Banner */,
85DFB3C92EEA51A900CBD0FC /* Rewarded */,
85DFB3CA2EEA51A900CBD0FC /* VPAdInfo.swift */,
85DFB3CB2EEA51A900CBD0FC /* VPAdManager.swift */,
85DFB3CC2EEA51A900CBD0FC /* VPStatAdModel.swift */,
);
path = AdManager;
sourceTree = "<group>";
};
85DFB3DA2EEA562700CBD0FC /* BannerAd */ = {
isa = PBXGroup;
children = (
85DFB3DC2EEA5D5A00CBD0FC /* SRAdmobOpenAd.swift */,
);
path = BannerAd;
sourceTree = "<group>";
};
85DFB3DB2EEA563700CBD0FC /* RewardAd */ = {
isa = PBXGroup;
children = (
);
path = RewardAd;
sourceTree = "<group>";
};
8CAFCEC2C631CAE75726D90C /* Pods */ = {
isa = PBXGroup;
children = (
@ -1622,6 +1759,7 @@
03E9A7A52EC4716A000D1067 /* Resources */,
92A47CFFAED31670C9452A17 /* [CP] Embed Pods Frameworks */,
85AE54992EE818190058FEA3 /* Embed Foundation Extensions */,
E78E68FAEB858A89EA05FB90 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@ -1729,6 +1867,23 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
E78E68FAEB858A89EA05FB90 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@ -1740,6 +1895,7 @@
85AE54682EE7F7940058FEA3 /* SRCoinPackCanReceiveModel.swift in Sources */,
03E9A7EA2EC4995D000D1067 /* SRKeychain.swift in Sources */,
03E9A7D92EC47B90000D1067 /* SRNetworkReachableManager.swift in Sources */,
85DFB3B32EE95EFB00CBD0FC /* SRVersionUpdateModel.swift in Sources */,
3754ACF82ED9A32C009EBCAD /* SRCoinPackHeaderView.swift in Sources */,
3754ACD72ED82774009EBCAD /* SRDetailRecommendCell.swift in Sources */,
370D2F2D2ED5AA9700571E77 /* SRViralHitCell.swift in Sources */,
@ -1750,6 +1906,7 @@
03B1A8E12EC6D6D3006C353F /* SRHomeMenuDataSource.swift in Sources */,
03E9A7F82EC4AA54000D1067 /* SRUserDefaultsKey.swift in Sources */,
3754B0312EE2C9D4009EBCAD /* SRVideoRechargeView.swift in Sources */,
85DFB3BB2EE97A1E00CBD0FC /* SRWalletViewController.swift in Sources */,
3754AF1C2EDEF112009EBCAD /* SRStoreCoinsView.swift in Sources */,
03B1A8452EC5CBBB006C353F /* SRNavigationController.swift in Sources */,
85AE54712EE80AFE0058FEA3 /* adjustManger.swift in Sources */,
@ -1760,6 +1917,17 @@
3754B0112EE1248D009EBCAD /* SRCoinsPackBuyView.swift in Sources */,
03B1A9462ECC5679006C353F /* SRSearchResultCell.swift in Sources */,
03B1A9502ECEB4E6006C353F /* SRRecommendPlayerViewController.swift in Sources */,
85DFB3CE2EEA51A900CBD0FC /* VPBannerAdManager.swift in Sources */,
85DFB3CF2EEA51A900CBD0FC /* VPAdInfo.swift in Sources */,
85DFB3D02EEA51A900CBD0FC /* VPAdManager.swift in Sources */,
85DFB3DD2EEA5D5A00CBD0FC /* SRAdmobOpenAd.swift in Sources */,
85DFB3D12EEA51A900CBD0FC /* VPGoogleRewardedAd.swift in Sources */,
85DFB3D22EEA51A900CBD0FC /* VPApplovinRewardedAd.swift in Sources */,
85DFB3D32EEA51A900CBD0FC /* VPApplovinBannerAd.swift in Sources */,
85DFB3D42EEA51A900CBD0FC /* VPStatAdModel.swift in Sources */,
85DFB3D52EEA51A900CBD0FC /* VPAppOpenAdManager.swift in Sources */,
85DFB3D62EEA51A900CBD0FC /* VPRewardedAdManager.swift in Sources */,
85DFB3D72EEA51A900CBD0FC /* VPApplovinAppOpenAd.swift in Sources */,
03B1A83E2EC5C91E006C353F /* SRTool.swift in Sources */,
03B1A9172ECAF14F006C353F /* SRHomeHotView.swift in Sources */,
03B1A8FD2EC81C62006C353F /* SRHomeBannerCell.swift in Sources */,
@ -1781,6 +1949,7 @@
3754B0152EE12521009EBCAD /* SRCoinPackConfirmView.swift in Sources */,
370D2F2F2ED5AB2500571E77 /* SRViralHitController.swift in Sources */,
3754ACDA2ED8374D009EBCAD /* SRPagerViewTransformer.swift in Sources */,
85DFB3BF2EE991D400CBD0FC /* SROpenAdManager.swift in Sources */,
3754AF282EDEF3CC009EBCAD /* SRPackCoinViewCell.swift in Sources */,
3754ACFE2ED9A3A0009EBCAD /* SRCoinsPackReceiveModel.swift in Sources */,
3754ACF22ED975B9009EBCAD /* SRRewardController.swift in Sources */,
@ -1793,7 +1962,9 @@
03B1A8F32EC809C5006C353F /* SRHomeHeaderView.swift in Sources */,
03B1A9482ECC6669006C353F /* SRProgressView.swift in Sources */,
370D2F1A2ED45CCA00571E77 /* SRUserSettingCell.swift in Sources */,
85DFB3B72EE9766000CBD0FC /* SRRemoveCollectAlert.swift in Sources */,
03B1A91D2ECB2424006C353F /* UIScrollView+SRAdd.swift in Sources */,
85DFB3D92EEA523B00CBD0FC /* SRAdManger.swift in Sources */,
3754ACE62ED93E7C009EBCAD /* SRWebView.swift in Sources */,
3754ACEE2ED945A1009EBCAD /* Dictionary+SRAdd.swift in Sources */,
03E9A7C92EC47177000D1067 /* AppDelegate.swift in Sources */,
@ -1822,6 +1993,7 @@
03B1A9152ECAEE63006C353F /* SRHomeViralHitsCell.swift in Sources */,
85AE546E2EE809850058FEA3 /* AppDelegate+SRAPNS.swift in Sources */,
03B1A8472EC5CBCF006C353F /* SRViewController.swift in Sources */,
85DFB3B52EE96B8600CBD0FC /* SRLogoutAlert.swift in Sources */,
3754AF192EDEF0AF009EBCAD /* SRStoreController.swift in Sources */,
370D2F052ED3FEE700571E77 /* SRHistoryCell.swift in Sources */,
3754AF202EDEF133009EBCAD /* SRStoreVipView.swift in Sources */,
@ -1838,6 +2010,7 @@
3754ACEC2ED943AB009EBCAD /* SRAppWebViewController.swift in Sources */,
03B1A9442ECC4ED9006C353F /* SRSearchResultView.swift in Sources */,
3754ACBF2ED5B839009EBCAD /* SRNavgationTitleView.swift in Sources */,
85DFB3B12EE957A800CBD0FC /* SRUpdatesAlert.swift in Sources */,
3754B00B2EE12040009EBCAD /* SRCoinsPackClaimListView.swift in Sources */,
03B1A8FF2EC81C92006C353F /* SRImageView.swift in Sources */,
3754B00F2EE120C5009EBCAD /* SRCoinsPackClaimListCell.swift in Sources */,
@ -1874,6 +2047,7 @@
3754AF042EDED773009EBCAD /* SRIapManager.swift in Sources */,
03B1A92E2ECC0D7E006C353F /* SRShortDetailControlView.swift in Sources */,
03B1A9382ECC210D006C353F /* SRSearchRecordCell.swift in Sources */,
85DFB3DF2EEA671C00CBD0FC /* SRAppOpenAdViewController.swift in Sources */,
03E9A7D72EC47A23000D1067 /* SRResponseCryptor.swift in Sources */,
03B1A8502EC5DB2E006C353F /* SRHomeViewController.swift in Sources */,
03B1A8E52EC715E1006C353F /* SRHomeApi.swift in Sources */,
@ -1968,7 +2142,7 @@
CODE_SIGN_ENTITLEMENTS = SynthReel/SynthReel.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1.1;
CURRENT_PROJECT_VERSION = 1.2;
DEVELOPMENT_TEAM = 9JR2Y32ZU3;
EXCLUDED_ARCHS = "";
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
@ -2012,7 +2186,7 @@
CODE_SIGN_ENTITLEMENTS = SynthReel/SynthReel.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1.1;
CURRENT_PROJECT_VERSION = 1.2;
DEVELOPMENT_TEAM = 9JR2Y32ZU3;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = SynthReel/Source/Info.plist;

View File

@ -124,4 +124,17 @@ struct SRUserApi {
}
}
}
static func requestVersionUpdateData() async -> SRVersionUpdateModel?{
await withCheckedContinuation { continuation in
var param = SRNetwork.Parameters(path: "/customer/versionControl")
param.method = .get
SRNetwork.request(parameters: param) { (response: SRNetwork.Response<SRVersionUpdateModel>) in
continuation.resume(returning: response.data)
}
}
}
}

View File

@ -0,0 +1,225 @@
////
//// VPAppOpenAdManager.swift
//// Veloria
////
//// Created by on 2025/7/15.
////
//
//import UIKit
//
//
//@objc protocol VPAppOpenAdManagerDelegate: NSObjectProtocol {
//
// ///广
// @objc optional func appOpenAdManagerDidLoadFinish(adManager: VPAppOpenAdManager)
// ///广
// @objc optional func appOpenAdManager(adManager: VPAppOpenAdManager, didLoadFail error: Error)
// ///广
// @objc optional func appOpenAdManager(adManager: VPAppOpenAdManager, didDisplayFail error: Error)
// ///广
// @objc optional func appOpenAdManagerDidShow(adManager: VPAppOpenAdManager)
// ///广
// @objc optional func appOpenAdManagerDidDismiss(adManager: VPAppOpenAdManager)
// ///广
// @objc optional func appOpenAdManagerDidClick(adManager: VPAppOpenAdManager)
// ///
// @objc optional func appOpenAdManager(adManager: VPAppOpenAdManager, didOtherFail error: Error)
//
//}
//
//
//@objc protocol VPAppOpenAdDelegate: NSObjectProtocol {
//
// ///广
// @objc optional func appOpenAd(ad: VPAppOpenAd, didLoadFail error: Error)
// ///广
// @objc optional func appOpenAdDidLoadFinish(ad: VPAppOpenAd)
// ///广
// @objc optional func appOpenAd(ad: VPAppOpenAd, didDisplayFail error: Error)
// ///广
// @objc optional func appOpenAdDidShow(ad: VPAppOpenAd)
// ///广
// @objc optional func appOpenAdDidDismiss(ad: VPAppOpenAd)
// ///广
// @objc optional func appOpenAdDidClick(ad: VPAppOpenAd)
//}
//
//@objc protocol VPAppOpenAd: NSObjectProtocol {
//
// weak var delegate: VPAppOpenAdDelegate? { get set }
//
// var adPlatformKey: String { get }
//
// var adUnitID: String { get }
//
// var isReady: Bool { get }
//
// func loadAd()
// func showAd()
//
//}
//
//class VPAppOpenAdManager: NSObject {
//
// static let manager = VPAppOpenAdManager()
//
// weak var delegate: VPAppOpenAdManagerDelegate?
//
// private(set) var appOpenAd: VPAppOpenAd? {
// didSet {
// oldValue?.delegate = nil
// appOpenAd?.delegate = self
// }
// }
//
// private var isLoading = false
// private var isShowing = false
// ///
// private var needAutoShow = false
//
// private var timeOutTimer: Timer?
//
// private var adsDate: Date?
//
// deinit {
// NotificationCenter.default.removeObserver(self)
// }
//
// override init() {
// super.init()
// NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil)
// }
//
// func showAdIfAvailable() {
//
// if self.appOpenAd?.isReady == true {
// self.showAd()
// } else {
// self.timeOutTimer = Timer.scheduledTimer(timeInterval: 5, target: (self), selector: #selector(handleTimeOutTimer), userInfo: nil, repeats: false)
//
// self.needAutoShow = true
// self.loadAd()
// }
// }
//
// func loadAd() {
// guard !isLoading else { return }
//
// self.isLoading = true
// appOpenAd = VPApplovinAppOpenAd()
// appOpenAd?.loadAd()
// }
//
// func showAd() {
// guard self.appOpenAd?.isReady == true else { return }
// guard !self.isShowing else { return }
//
//
// self.isShowing = true
// self.appOpenAd?.showAd()
// }
//
// @objc private func handleTimeOutTimer() {
// self.needAutoShow = false
// cleanTimer()
//
// let error = NSError(domain: "time-out", code: -1)
// requestStatAd(type: "load_failed", errorMsg: error.localizedDescription)
// self.delegate?.appOpenAdManager?(adManager: self, didOtherFail: error)
// }
//
// private func cleanTimer() {
// self.timeOutTimer?.invalidate()
// self.timeOutTimer = nil
// }
//
// private func clean() {
// appOpenAd = nil
// delegate = nil
// isShowing = false
// self.adsDate = nil
// }
//}
//
////MARK: -------------- VPAppOpenAdDelegate --------------
//extension VPAppOpenAdManager: VPAppOpenAdDelegate {
//
// ///广
// func appOpenAd(ad: VPAppOpenAd, didLoadFail error: Error) {
// cleanTimer()
// isLoading = false
// requestStatAd(type: "load_failed", errorMsg: error.localizedDescription)
//
// self.delegate?.appOpenAdManager?(adManager: self, didLoadFail: error)
//
// clean()
// }
// ///广
// func appOpenAdDidLoadFinish(ad: VPAppOpenAd) {
// cleanTimer()
// self.isLoading = false
// self.delegate?.appOpenAdManagerDidLoadFinish?(adManager: self)
//
// if needAutoShow {
// self.needAutoShow = false
// self.showAd()
// }
//
// }
// ///广
// func appOpenAd(ad: VPAppOpenAd, didDisplayFail error: Error) {
// requestStatAd(type: "show_failed", errorMsg: error.localizedDescription)
// self.delegate?.appOpenAdManager?(adManager: self, didDisplayFail: error)
// clean()
// }
// ///广
// func appOpenAdDidShow(ad: VPAppOpenAd) {
// adsDate = Date()
// requestStatAd(type: "start", errorMsg: nil)
// self.delegate?.appOpenAdManagerDidShow?(adManager: self)
// }
// ///广
// func appOpenAdDidDismiss(ad: VPAppOpenAd) {
// requestStatAd(type: "close", errorMsg: nil)
// self.delegate?.appOpenAdManagerDidDismiss?(adManager: self)
// clean()
// }
// ///广
// func appOpenAdDidClick(ad: VPAppOpenAd) {
// requestStatAd(type: "click", errorMsg: nil)
// self.delegate?.appOpenAdManagerDidClick?(adManager: self)
// }
//}
//
//
//extension VPAppOpenAdManager {
//
// private func requestStatAd(type: String, errorMsg: String?) {
// guard let appOpenAd = self.appOpenAd else { return }
//
// var seconds = 0
// if let adsDate = self.adsDate {
// if type == "click" || type == "close" {
// seconds = Int(Date().timeIntervalSince(adsDate))
// }
// }
//
//
// let model = VPStatAdModel()
// model.type = type
// model.view_seconds = seconds
// model.ads_id = appOpenAd.adUnitID
// model.ad_platform_key = VPAdPlatformKey(rawValue: appOpenAd.adPlatformKey)
// model.error_msg = errorMsg
// model.scene = .splash
//
//// VPStatAPI.requestStatAd(model: model)
// }
//
//
// @objc private func didEnterBackgroundNotification() {
// guard self.isShowing else { return }
//
// self.requestStatAd(type: "Interrupt", errorMsg: nil)
// }
//}

View File

@ -0,0 +1,84 @@
////
//// VPApplovinAppOpenAd.swift
//// Veloria
////
//// Created by on 2025/7/15.
////
//
//import UIKit
//#if canImport(AppLovinSDK)
//import AppLovinSDK
//#endif
//
//class VPApplovinAppOpenAd: NSObject, VPAppOpenAd {
//
//
//
// private lazy var appOpenAd = MAAppOpenAd(adUnitIdentifier: adUnitID)
//
// weak var delegate: (any VPAppOpenAdDelegate)?
//
// var adPlatformKey: String {
// return VPAdPlatformKey.applovin.rawValue
// }
//
// var adUnitID: String {
// return VPAdManager.applovin_appOpenAdUnitID
// }
//
// var isReady: Bool {
// if ALSdk.shared().isInitialized && appOpenAd.isReady {
// return true
// } else {
// return false
// }
// }
//
// func loadAd() {
//
// VPAdManager.initialize_applovinSdk { [weak self] in
// guard let self = self else { return }
// appOpenAd.delegate = self
// appOpenAd.load()
// }
// }
//
// func showAd() {
// guard isReady else { return }
//
// appOpenAd.show()
// }
//}
//
//
//extension VPApplovinAppOpenAd: MAAdDelegate {
// func didLoad(_ ad: MAAd) {
// self.delegate?.appOpenAdDidLoadFinish?(ad: self)
// }
//
// func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError) {
// let nsError = NSError(domain: error.message, code: error.code.rawValue)
// self.delegate?.appOpenAd?(ad: self, didLoadFail: nsError)
// }
//
// func didDisplay(_ ad: MAAd) {
// self.delegate?.appOpenAdDidShow?(ad: self)
// }
//
// func didHide(_ ad: MAAd) {
// self.delegate?.appOpenAdDidDismiss?(ad: self)
// }
//
// func didClick(_ ad: MAAd) {
// self.delegate?.appOpenAdDidClick?(ad: self)
// }
//
// func didFail(toDisplay ad: MAAd, withError error: MAError) {
// let nsError = NSError(domain: error.message, code: error.code.rawValue)
// self.delegate?.appOpenAd?(ad: self, didDisplayFail: nsError)
// }
//
//
//
//}
//

View File

@ -0,0 +1,88 @@
////
//// VPApplovinBannerAd.swift
//// Veloria
////
//// Created by on 2025/7/17.
////
//
//import UIKit
//import AppLovinSDK
//
//class VPApplovinBannerAd: NSObject, VPBannerAd {
//
// let size = CGSize.init(width: UIScreen.width, height: 59)
//
// var delegate: (any VPBannerAdDelegate)?
//
// ///
// private var isLoaded = false
//
// private(set) lazy var _adView: MAAdView = {
// let view = MAAdView(adUnitIdentifier: adUnitID)
// view.frame = .init(x: 0, y: 0, width: size.width, height: size.height)
// view.delegate = self
// return view
// }()
//
// var adView: UIView {
// return _adView
// }
//
// var adPlatformKey: String {
// return VPAdPlatformKey.applovin.rawValue
// }
//
// var adUnitID: String {
// return VPAdManager.applovin_bannerAdUnitID
// }
//
// func loadAd() {
// _adView.loadAd()
// }
//}
//
////MARK: -------------- MAAdViewAdDelegate --------------
//extension VPApplovinBannerAd: MAAdViewAdDelegate {
// func didExpand(_ ad: MAAd) {
//
// }
//
// func didCollapse(_ ad: MAAd) {
//
// }
//
// func didLoad(_ ad: MAAd) {
// if !isLoaded {
// isLoaded = true
// self.delegate?.bannerAdDidLoadFinish?(bannerAd: self)
// }
// }
//
// func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError) {
// if !isLoaded {
// isLoaded = true
// let nsError = NSError(domain: error.message, code: error.code.rawValue)
// self.delegate?.bannerAd?(bannerAd: self, didLoadFail: nsError)
// }
// }
//
// func didDisplay(_ ad: MAAd) {
// self.delegate?.bannerAdDidShow?(bannerAd: self)
// }
//
// func didHide(_ ad: MAAd) {
// self.delegate?.bannerAdDidDismiss?(bannerAd: self)
// }
//
// func didClick(_ ad: MAAd) {
// self.delegate?.bannerAdDidClick?(ad: self)
// }
//
// func didFail(toDisplay ad: MAAd, withError error: MAError) {
//
// }
//
//
//
//}
//

View File

@ -0,0 +1,131 @@
////
//// VPBannerAdManager.swift
//// Veloria
////
//// Created by on 2025/7/15.
////
//
//import UIKit
//#if canImport(AppLovinSDK)
//import AppLovinSDK
//#endif
//
//
//@objc protocol VPBannerAdDelegate: NSObjectProtocol {
// ///广
// @objc optional func bannerAd(bannerAd: VPBannerAd, didLoadFail error: Error)
// ///广
// @objc optional func bannerAdDidLoadFinish(bannerAd: VPBannerAd)
// ///广
// @objc optional func bannerAdDidShow(bannerAd: VPBannerAd)
// ///广
// @objc optional func bannerAdDidDismiss(bannerAd: VPBannerAd)
// ///广
// @objc optional func bannerAdDidClick(ad: VPBannerAd)
//}
//
//@objc protocol VPBannerAd: NSObjectProtocol {
//
// weak var delegate: VPBannerAdDelegate? { get set }
//
// var adView: UIView { get }
//
// var adPlatformKey: String { get }
//
// var adUnitID: String { get }
//
// func loadAd()
//
//}
//
//class VPBannerAdManager: NSObject {
//
// let size = CGSize.init(width: UIScreen.width, height: 59)
//
// var videoInfo: VPVideoInfoModel?
//
// private var adsDate: Date?
//
// private(set) lazy var bannerAd: VPBannerAd = {
// let ad = VPApplovinBannerAd()
// ad.delegate = self
// return ad
// }()
//
// var adView: UIView {
// return bannerAd.adView
// }
//
// deinit {
// NotificationCenter.default.removeObserver(self)
// }
//
// override init() {
// super.init()
// NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil)
//
// bannerAd.loadAd()
// }
//
//
//}
//
////MARK: -------------- VPBannerAdDelegate --------------
//extension VPBannerAdManager: VPBannerAdDelegate {
//
// ///广
// func bannerAd(bannerAd: VPBannerAd, didLoadFail error: Error) {
// requestStatAd(type: "load_failed", errorMsg: error.localizedDescription)
// }
// ///广
// func bannerAdDidLoadFinish(bannerAd: VPBannerAd) {
// adsDate = Date()
// requestStatAd(type: "start", errorMsg: nil)
// }
// ///广
// func bannerAdDidShow(bannerAd: VPBannerAd) {
//
// }
// ///广
// func bannerAdDidDismiss(bannerAd: VPBannerAd) {
// requestStatAd(type: "close", errorMsg: nil)
// }
// ///广
// func bannerAdDidClick(ad: VPBannerAd) {
// requestStatAd(type: "click", errorMsg: nil)
// }
//
//}
//
//extension VPBannerAdManager {
//
// func requestStatAd(type: String, errorMsg: String?) {
//
// var seconds = 0
// if let adsDate = self.adsDate {
// if type == "click" || type == "close" {
// seconds = Int(Date().timeIntervalSince(adsDate))
// }
// }
//
// if type == "close" && self.adsDate == nil { return }
//
// let model = VPStatAdModel()
// model.view_seconds = seconds
// model.type = type
// model.ads_id = bannerAd.adUnitID
// model.ad_platform_key = VPAdPlatformKey(rawValue: bannerAd.adPlatformKey)
// model.error_msg = errorMsg
// model.scene = .banner
// model.short_play_id = self.videoInfo?.short_play_id
// model.short_play_video_id = self.videoInfo?.short_play_video_id
//
// VPStatAPI.requestStatAd(model: model)
// }
//
//
// @objc private func didEnterBackgroundNotification() {
//
// self.requestStatAd(type: "Interrupt", errorMsg: nil)
// }
//}

View File

@ -0,0 +1,91 @@
////
//// VPApplovinRewardedAd.swift
//// Veloria
////
//// Created by on 2025/7/15.
////
//
//import UIKit
//#if canImport(AppLovinSDK)
//import AppLovinSDK
//#endif
//
//class VPApplovinRewardedAd: NSObject, VPRewardedAd {
//
//
//#if canImport(AppLovinSDK)
// private var rewardedAd: MARewardedAd?
//#endif
//
// weak var delegate: (any VPRewardedAdDelegate)?
//
// var adInfo: VPAdInfo? = nil
//
// var isReady: Bool {
//#if canImport(AppLovinSDK)
// return rewardedAd?.isReady ?? false
//#else
// return false
//#endif
// }
//
// func loadAd(adInfo: VPAdInfo) {
// self.adInfo = adInfo
//#if canImport(AppLovinSDK)
// rewardedAd = MARewardedAd.shared(withAdUnitIdentifier: adInfo.ads_id ?? "")
// rewardedAd?.delegate = self
// rewardedAd?.load()
//#endif
// }
//
// func showAd() {
//#if canImport(AppLovinSDK)
// if isReady {
// rewardedAd?.show()
// }
//#endif
// }
//
//
//}
//
//#if canImport(AppLovinSDK)
////MARK: -------------- MARewardedAdDelegate --------------
//extension VPApplovinRewardedAd: MARewardedAdDelegate {
//
// func didLoad(_ ad: MAAd) {
// self.delegate?.rewardedAdDidLoadFinish?(ad: self)
// }
//
// func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError) {
//
// let nsError = NSError(domain: error.message, code: error.code.rawValue)
// self.delegate?.rewardedAd?(ad: self, didLoadFail: nsError)
// }
//
// func didDisplay(_ ad: MAAd) {
// self.delegate?.rewardedAdDidShow?(ad: self)
// }
//
// func didHide(_ ad: MAAd) {
// self.delegate?.rewardedAdDidDismiss?(ad: self)
// }
//
// func didClick(_ ad: MAAd) {
// self.delegate?.rewardedAdDidClick?(ad: self)
// }
//
// func didFail(toDisplay ad: MAAd, withError error: MAError) {
// let nsError = NSError(domain: error.message, code: error.code.rawValue)
// self.delegate?.rewardedAd?(ad: self, didDisplayFail: nsError)
// }
//
// func didRewardUser(for ad: MAAd, with reward: MAReward) {
// if let adInfo = self.adInfo {
// self.delegate?.rewardedAd?(ad: self, userDidEarnReward: adInfo)
// }
// }
//}
//#endif
//
//

View File

@ -0,0 +1,101 @@
////
//// VPGoogleRewardedAd.swift
//// Veloria
////
//// Created by on 2025/7/14.
////
//
//import UIKit
//#if canImport(GoogleMobileAds)
//import GoogleMobileAds
//#endif
//
//class VPGoogleRewardedAd: NSObject, VPRewardedAd {
//
//
//
//#if canImport(GoogleMobileAds)
// private var rewardedAd: RewardedAd?
//#endif
//
// weak var delegate: VPRewardedAdDelegate?
//
// var adInfo: VPAdInfo?
//
// var isReady: Bool {
//#if canImport(GoogleMobileAds)
// if rewardedAd != nil {
// return true
// } else {
// return false
// }
//#else
// return false
//#endif
// }
//
// func loadAd(adInfo: VPAdInfo) {
//#if canImport(GoogleMobileAds)
// self.adInfo = adInfo
//#if DEBUG
// adInfo.ads_id = VPAdManager.google_rewardedAdUnitID
//#endif
// let adUnitID = adInfo.ads_id ?? ""
// let request = Request()
//
// RewardedAd.load(with: adUnitID, request: request) { [weak self] rewardedAd, error in
// guard let self = self else { return }
// if let error = error {
// self.delegate?.rewardedAd?(ad: self, didLoadFail: error)
// return
// }
// self.rewardedAd = rewardedAd
// self.rewardedAd?.fullScreenContentDelegate = self
// self.delegate?.rewardedAdDidLoadFinish?(ad: self)
// }
//#endif
// }
//
// func showAd() {
//#if canImport(GoogleMobileAds)
// guard let rewardedAd = rewardedAd else { return }
//
// rewardedAd.present(from: nil) { [weak self] in
// guard let self = self else { return }
// guard let adInfo = self.adInfo else { return }
// self.delegate?.rewardedAd?(ad: self, userDidEarnReward: adInfo)
// }
//#endif
// }
//
//
//
//}
//
////MARK: -------------- FullScreenContentDelegate --------------
//#if canImport(GoogleMobileAds)
//extension VPGoogleRewardedAd: FullScreenContentDelegate {
//
// /// Tells the delegate that the ad failed to present full screen content.
// func ad(_ ad: FullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
// self.delegate?.rewardedAd?(ad: self, didDisplayFail: error)
// }
//
// /// Tells the delegate that the ad will present full screen content.
// func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
// print("====Ad will present full screen content.")
// self.delegate?.rewardedAdDidShow?(ad: self)
// }
//
// /// Tells the delegate that the ad dismissed full screen content.
// func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
// print("====Ad did dismiss full screen content.")
// self.delegate?.rewardedAdDidDismiss?(ad: self)
// }
//
// func adDidRecordClick(_ ad: any FullScreenPresentingAd) {
// self.delegate?.rewardedAdDidClick?(ad: self)
// }
//
//}
//#endif

View File

@ -0,0 +1,292 @@
////
//// VPRewardedAdManager.swift
//// Veloria
////
//// Created by on 2025/7/14.
////
//
//import UIKit
//
//
//@objc protocol VPRewardedAdManagerDelegate: NSObjectProtocol {
//
// ///
// @objc optional func rewardedAdManager(adManager: VPRewardedAdManager, userDidEarnReward adInfo: VPAdInfo)
// ///广
// @objc optional func rewardedAdManagerDidLoadFinish(adManager: VPRewardedAdManager)
// ///广
// @objc optional func rewardedAdManager(adManager: VPRewardedAdManager, didLoadFail error: Error)
// ///广
// @objc optional func rewardedAdManager(adManager: VPRewardedAdManager, didDisplayFail error: Error)
// ///广
// @objc optional func rewardedAdManagerDidShow(adManager: VPRewardedAdManager)
// ///广
// @objc optional func rewardedAdManager(adManager: VPRewardedAdManager, didDismiss adInfo: VPAdInfo)
// ///广
// @objc optional func rewardedAdManagerDidClick(adManager: VPRewardedAdManager)
// ///
// @objc optional func rewardedAdManager(adManager: VPRewardedAdManager, didOtherFail error: Error)
//
//}
//
//@objc protocol VPRewardedAdDelegate: NSObjectProtocol {
//
// ///
// @objc optional func rewardedAd(ad: VPRewardedAd, userDidEarnReward adInfo: VPAdInfo)
// ///广
// @objc optional func rewardedAd(ad: VPRewardedAd, didLoadFail error: Error)
// ///广
// @objc optional func rewardedAdDidLoadFinish(ad: VPRewardedAd)
// ///广
// @objc optional func rewardedAd(ad: VPRewardedAd, didDisplayFail error: Error)
// ///广
// @objc optional func rewardedAdDidShow(ad: VPRewardedAd)
// ///广
// @objc optional func rewardedAdDidDismiss(ad: VPRewardedAd)
// ///广
// @objc optional func rewardedAdDidClick(ad: VPRewardedAd)
//}
//
//@objc protocol VPRewardedAd: NSObjectProtocol {
//
// weak var delegate: VPRewardedAdDelegate? { get set }
// var adInfo: VPAdInfo? { get set }
// var isReady: Bool { get }
//
// func loadAd(adInfo: VPAdInfo)
// func showAd()
//
//}
//
//class VPRewardedAdManager: NSObject {
//
// static let manager = VPRewardedAdManager()
//
// private weak var delegate: VPRewardedAdManagerDelegate?
//
// ///广
// private var isLoadingAd = false
// ///广
// private(set) var isEnable = true
//
// private var adInfo: VPAdInfo?
//
// private var adsDate: Date?
// ///
// var statScene: VPStatAdModel.AdScene?
// var videoInfo: VPVideoInfoModel?
//
// var rewardedAd: VPRewardedAd? {
// didSet {
// rewardedAd?.delegate = self
// }
// }
//
// var isReady: Bool {
// return rewardedAd?.isReady ?? false
// }
//
// deinit {
// NotificationCenter.default.removeObserver(self)
// }
//
// override init() {
// super.init()
// NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil)
// }
//
// func loadAd() {
// if isReady || isLoadingAd { return }
//
// self.isLoadingAd = true
//
// self.getAdInfo { [weak self] adInfo in
// guard let self = self else { return }
//
// switch adInfo.platform_key {
// case .google:
// let ad = VPGoogleRewardedAd()
// self.rewardedAd = ad
// ad.loadAd(adInfo: adInfo)
//
// case .applovin:
// let ad = VPApplovinRewardedAd()
// self.rewardedAd = ad
// ad.loadAd(adInfo: adInfo)
//
// default:
// self.adInfo = nil
// break
// }
// }
//
// }
//
// func showAd(delegate: VPRewardedAdManagerDelegate? = nil) {
// if isEnable && !isLoadingAd && !isReady {//广广广
// loadAd()
// }
//
// if !isEnable || !isReady {
// VPToast.show(text: "veloria_no_ads_tip".localized)
// let error = NSError(domain: "veloria_no_ads_tip".localized, code: -1)
// self.delegate?.rewardedAdManager?(adManager: self, didOtherFail: error)
// return
// }
//
// guard let rewardedAd = self.rewardedAd else { return }
// self.delegate = delegate
//
// rewardedAd.showAd()
// }
//
// private func clean() {
// self.rewardedAd = nil
// self.statScene = nil
// self.videoInfo = nil
// self.delegate = nil
// }
//}
//
////MARK: -------------- VPRewardedAdDelegate --------------
//extension VPRewardedAdManager: VPRewardedAdDelegate {
//
// ///
// func rewardedAd(ad: VPRewardedAd, userDidEarnReward adInfo: VPAdInfo) {
// self.requestStatAd(type: "reward", errorMsg: nil)
// self.delegate?.rewardedAdManager?(adManager: self, userDidEarnReward: adInfo)
// }
// ///广
// func rewardedAd(ad: VPRewardedAd, didLoadFail error: Error) {
// isEnable = false
// isLoadingAd = false
//
// self.requestStatAd(type: "load_failed", errorMsg: error.localizedDescription)
// self.delegate?.rewardedAdManager?(adManager: self, didLoadFail: error)
//
// self.clean()
// }
// ///广
// func rewardedAdDidLoadFinish(ad: VPRewardedAd) {
// isLoadingAd = false
//
// self.delegate?.rewardedAdManagerDidLoadFinish?(adManager: self)
// }
// ///广
// func rewardedAd(ad: VPRewardedAd, didDisplayFail error: Error) {
//
// self.requestStatAd(type: "show_failed", errorMsg: error.localizedDescription)
// self.delegate?.rewardedAdManager?(adManager: self, didDisplayFail: error)
//
// self.isEnable = false
// self.clean()
//
// /*
// if self.adInfo?.platform_key != .google {
// let adInfo = VPAdInfo()
// adInfo.platform_key = .google
// adInfo.ads_id = VPAdManager.google_rewardedAdUnitID
//
// let ad = VPGoogleRewardedAd()
// self.rewardedAd = ad
// ad.loadAd(adInfo: adInfo)
//
// } else {
// self.isEnable = false
// }
// */
//
// }
// ///广
// func rewardedAdDidShow(ad: VPRewardedAd) {
// self.adsDate = Date()
//
// self.requestStatAd(type: "start", errorMsg: nil)
// self.delegate?.rewardedAdManagerDidShow?(adManager: self)
// }
// ///广
// func rewardedAdDidDismiss(ad: VPRewardedAd) {
//
//
// var seconds = 0
// if let adsDate = self.adsDate {
// seconds = Int(Date().timeIntervalSince(adsDate))
// }
//
//
// self.requestStatAd(type: "close", seconds: seconds, errorMsg: nil) { [weak self] in
// guard let self = self else { return }
// if let adInfo = ad.adInfo {
// self.delegate?.rewardedAdManager?(adManager: self, didDismiss: adInfo)
// }
//
// self.clean()
// //广
// self.loadAd()
// }
//
// }
//
// ///广
// func rewardedAdDidClick(ad: VPRewardedAd) {
//
// var seconds = 0
// if let adsDate = self.adsDate {
// seconds = Int(Date().timeIntervalSince(adsDate))
// }
// self.requestStatAd(type: "click", seconds: seconds, errorMsg: nil)
//
// self.delegate?.rewardedAdManagerDidClick?(adManager: self)
// }
//
//}
//
//
//extension VPRewardedAdManager {
// private func requestStatAd(type: String, seconds: Int = 0, errorMsg: String?, completer: (() -> Void)? = nil) {
// guard let adInfo = adInfo else { return }
//
// let model = VPStatAdModel()
// model.type = type
// model.ads_id = adInfo.ads_id
// model.view_seconds = seconds
// model.ad_platform_key = adInfo.platform_key
// model.error_msg = errorMsg
// model.scene = self.statScene
// model.short_play_id = self.videoInfo?.short_play_id
// model.short_play_video_id = self.videoInfo?.short_play_video_id
//
// VPStatAPI.requestStatAd(model: model) { finish in
// completer?()
// }
// }
//
// @objc private func didEnterBackgroundNotification() {
// if self.statScene == nil { return }
//
// self.requestStatAd(type: "Interrupt", seconds: 0, errorMsg: nil)
// }
//
//
// private func getAdInfo(completer: ((_ adInfo: VPAdInfo) -> Void)?) {
//
// if let adInfo = self.adInfo {
// completer?(adInfo)
// }
// VPAdAPI.requestShowAdInfo { [weak self] adInfo in
// guard let self = self else { return }
//
// if let adInfo = adInfo {
// self.adInfo = adInfo
// completer?(adInfo)
// } else {
// let adInfo = VPAdInfo.createNormalAdInfo()
// self.adInfo = adInfo
// completer?(adInfo)
// }
//
// }
// }
//}
//
//

View File

@ -0,0 +1,40 @@
//
// VPAdInfo.swift
// Veloria
//
// Created by on 2025/7/14.
//
import UIKit
import SmartCodable
enum VPAdPlatformKey: String, SmartCaseDefaultable {
case google = "google"
case applovin = "applovin"
}
struct VPAdDataModel: SmartCodable {
var ad: VPAdInfo?
}
class VPAdInfo:NSObject, SmartCodable {
required override init() {
super.init()
}
var id: String?
var platform_name: String?
var ads_id: String?
var status: String?
var platform_key: VPAdPlatformKey?
static func createNormalAdInfo() -> VPAdInfo {
var adInfo = VPAdInfo()
adInfo.platform_key = .applovin
adInfo.ads_id = VPAdManager.applovin_rewardedAdUnitID
return adInfo
}
}

View File

@ -0,0 +1,100 @@
//
// VPAdManager.swift
// Veloria
//
// Created by on 2025/7/14.
//
import UIKit
#if canImport(GoogleMobileAds)
import GoogleMobileAds
#endif
#if canImport(AppLovinSDK)
import AppLovinSDK
#endif
class VPAdManager: NSObject {
static var completer: (() -> Void)?
static func start() {
#if canImport(GoogleMobileAds)
MobileAds.shared.start()
#endif
initialize_applovinSdk()
}
///AppLovinSDK
static func initialize_applovinSdk(completer: (() -> Void)? = nil) {
if completer != nil {
self.completer = completer
}
#if canImport(AppLovinSDK)
if !ALSdk.shared().isInitialized {
//
let initConfig = ALSdkInitializationConfiguration(sdkKey: "XW2aulJv9urKD4MIIFT1xcSCuyTHaDZ9qUbDqygnTLS04GkdX7WMQJviGP5vDRWGsk4OJJIyLGRV3mbLqOWx0W") { builder in
builder.mediationProvider = ALMediationProviderMAX
//#if DEBUG
// builder.testDeviceAdvertisingIdentifiers = [JXUUID.idfa()]
//#endif
}
ALSdk.shared().initialize(with: initConfig) { sdkConfig in
// Start loading ads
self.completer?()
}
} else {
self.completer?()
}
#endif
}
}
//MARK: -------------- ID --------------
extension VPAdManager {
///广ID
static var google_rewardedAdUnitID: String {
#if DEBUG
return "ca-app-pub-3940256099942544/1712485313"
#else
return ""
#endif
}
///广ID
static var google_appOpenAdUnitID: String {
#if DEBUG
return "ca-app-pub-3940256099942544/5575463023"
#else
return ""
#endif
}
///广ID
static var google_bannerAdUnitID: String {
#if DEBUG
return "ca-app-pub-3940256099942544/2435281174"
#else
return ""
#endif
}
///广ID
static var applovin_rewardedAdUnitID: String {
return "39bf981e27728eae"
}
///广ID
static var applovin_appOpenAdUnitID: String {
return "d587df0fd75ff03b"
}
///广ID
static var applovin_bannerAdUnitID: String {
return "1eb6278843149711"
}
}

View File

@ -0,0 +1,33 @@
//
// VPStatAdModel.swift
// Veloria
//
// Created by on 2025/7/14.
//
import UIKit
import SmartCodable
class VPStatAdModel: NSObject, SmartCodable {
required override init() {
super.init()
}
enum AdScene: String, SmartCaseDefaultable {
case detail = "detail"
case me = "me"
case reward = "reward"
case splash = "splash"
case banner = "banner"
}
var type: String? //start click error click show_failed load_failed Interrupt(退) close
var ads_id: String?
var view_seconds: Int?
var ad_platform_key: VPAdPlatformKey?
var scene: AdScene? // splash reward banner detail me turntable
var short_play_id: String?
var short_play_video_id: String?
var error_msg: String?
}

View File

@ -0,0 +1,137 @@
//
// SRAdmobOpenAd.swift
// SynthReel
//
// Created by on 2025/12/11.
// Copyright © 2025 SR. All rights reserved.
//
import UIKit
#if canImport(GoogleMobileAds)
import GoogleMobileAds
#endif
class SRAdmobOpenAd: NSObject, SRAppOpenAd {
#if canImport(GoogleMobileAds)
private var appOpenAd: AppOpenAd?
#endif
weak var delegate: SRAppOpenAdDelegate?
var adInfo: VPAdInfo?
var isShowingAd: Bool = false
// SRAppOpenAd adPlatformKey
var adPlatformKey: String {
return "AdMob" // 广
}
var isReady: Bool {
#if canImport(GoogleMobileAds)
return appOpenAd != nil
#else
return false
#endif
}
// SRAppOpenAd adUnitID
var adUnitID: String {
return adInfo?.ads_id ?? ""
}
// 广
func loadAd() {
#if canImport(GoogleMobileAds)
guard let adInfo = self.adInfo else { return }
let adUnitID = adInfo.ads_id ?? ""
let request = Request()
AppOpenAd.load(with: adUnitID, request: request) { [weak self] appOpenAd, error in
guard let self = self else { return }
if let error = error {
self.delegate?.appOpenAd?(ad: self, didLoadFail: error)
return
}
self.appOpenAd = appOpenAd
appOpenAd?.fullScreenContentDelegate = self
if let error = error {
self.delegate?.appOpenAd?(ad: self, didLoadFail: error)
} else {
//
self.delegate?.appOpenAdDidLoadFinish?(ad: self)
}
}
#endif
}
// 广
func showAd() {
#if canImport(GoogleMobileAds)
guard let appOpenAd = appOpenAd else {
print("App open ad is not ready yet.")
return
}
if isShowingAd {
return print("App open ad is already showing.")
}
appOpenAd.present(from: nil)
isShowingAd = true
#endif
}
}
// MARK: - FullScreenContentDelegate
#if canImport(GoogleMobileAds)
extension SRAdmobOpenAd: FullScreenContentDelegate {
func adDidRecordImpression(_ ad: FullScreenPresentingAd) {
print("App open ad recorded an impression.")
delegate?.appOpenAdDidShow?(ad: self)
}
func adDidRecordClick(_ ad: FullScreenPresentingAd) {
print("App open ad recorded a click.")
delegate?.appOpenAdDidClick?(ad: self)
}
func adWillDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
print("App open ad will be dismissed.")
}
func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
print("App open ad will be presented.")
delegate?.appOpenAdDidShow?(ad: self)
}
func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
print("App open ad was dismissed.")
//
delegate?.appOpenAdDidDismiss?(ad: self)
appOpenAd = nil
isShowingAd = false
// 广
loadAd()
}
func ad(_ ad: FullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
print("App open ad failed to present with error: \(error.localizedDescription)")
appOpenAd = nil
isShowingAd = false
delegate?.appOpenAd?(ad: self, didDisplayFail: error)
// 广
loadAd()
}
}
#endif

View File

@ -0,0 +1,227 @@
////
//// SROpenAdManager.swift
//// SynthReel
////
//// Created by on 2025/12/10.
//// Copyright © 2025 SR. All rights reserved.
////
//
import UIKit
import Foundation
import GoogleMobileAds
@objc protocol SRAppOpenAdManagerDelegate: NSObjectProtocol {
///广
@objc optional func appOpenAdManagerDidLoadFinish(adManager: SRAppOpenAdDelegate)
///广
@objc optional func appOpenAdManager(adManager: SRAppOpenAdDelegate, didLoadFail error: Error)
///广
@objc optional func appOpenAdManager(adManager: SRAppOpenAdDelegate, didDisplayFail error: Error)
///广
@objc optional func appOpenAdManagerDidShow(adManager: SRAppOpenAdDelegate)
///广
@objc optional func appOpenAdManagerDidDismiss(adManager: SRAppOpenAdDelegate)
///广
@objc optional func appOpenAdManagerDidClick(adManager: SRAppOpenAdDelegate)
///
@objc optional func appOpenAdManager(adManager: SRAppOpenAdDelegate, didOtherFail error: Error)
}
@objc protocol SRAppOpenAdDelegate: NSObjectProtocol {
///广
@objc optional func appOpenAd(ad: SRAppOpenAd, didLoadFail error: Error)
///广
@objc optional func appOpenAdDidLoadFinish(ad: SRAppOpenAd)
///广
@objc optional func appOpenAd(ad: SRAppOpenAd, didDisplayFail error: Error)
///广
@objc optional func appOpenAdDidShow(ad: SRAppOpenAd)
///广
@objc optional func appOpenAdDidDismiss(ad: SRAppOpenAd)
///广
@objc optional func appOpenAdDidClick(ad: SRAppOpenAd)
}
@objc protocol SRAppOpenAd: NSObjectProtocol {
weak var delegate: SRAppOpenAdDelegate? { get set }
var adPlatformKey: String { get }
var adUnitID: String { get }
var isReady: Bool { get }
func loadAd()
func showAd()
}
class SRAppOpenAdManager: NSObject {
static let manager = SRAppOpenAdManager()
weak var delegate: SRAppOpenAdManagerDelegate?
private(set) var appOpenAd: SRAppOpenAd? {
didSet {
oldValue?.delegate = nil
appOpenAd?.delegate = self
}
}
private var isLoading = false
private var isShowing = false
///
private var needAutoShow = false
private var timeOutTimer: Timer?
private var adsDate: Date?
deinit {
NotificationCenter.default.removeObserver(self)
}
override init() {
super.init()
NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil)
}
func showAdIfAvailable() {
if self.appOpenAd?.isReady == true {
self.showAd()
} else {
self.timeOutTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(handleTimeOutTimer), userInfo: nil, repeats: false)
self.needAutoShow = true
self.loadAd()
}
}
func loadAd() {
guard !isLoading else { return }
self.isLoading = true
appOpenAd = SRAdmobOpenAd()
appOpenAd?.loadAd()
}
func showAd() {
guard self.appOpenAd?.isReady == true else { return }
guard !self.isShowing else { return }
self.isShowing = true
self.appOpenAd?.showAd()
}
@objc private func handleTimeOutTimer() {
self.needAutoShow = false
cleanTimer()
let error = NSError(domain: "time-out", code: -1)
requestStatAd(type: "load_failed", errorMsg: error.localizedDescription)
self.delegate?.appOpenAdManager?(adManager: self, didOtherFail: error)
}
private func cleanTimer() {
self.timeOutTimer?.invalidate()
self.timeOutTimer = nil
}
private func clean() {
appOpenAd = nil
delegate = nil
isShowing = false
self.adsDate = nil
}
}
//MARK: -------------- VPAppOpenAdDelegate --------------
extension SRAppOpenAdManager: SRAppOpenAdDelegate {
///广
func appOpenAd(ad: SRAppOpenAd, didLoadFail error: Error) {
cleanTimer()
isLoading = false
requestStatAd(type: "load_failed", errorMsg: error.localizedDescription)
self.delegate?.appOpenAdManager?(adManager: self, didLoadFail: error)
clean()
}
///广
func appOpenAdDidLoadFinish(ad: SRAppOpenAd) {
cleanTimer()
self.isLoading = false
self.delegate?.appOpenAdManagerDidLoadFinish?(adManager: self)
if needAutoShow {
self.needAutoShow = false
self.showAd()
}
}
///广
func appOpenAd(ad: SRAppOpenAd, didDisplayFail error: Error) {
requestStatAd(type: "show_failed", errorMsg: error.localizedDescription)
self.delegate?.appOpenAdManager?(adManager: self, didDisplayFail: error)
clean()
}
///广
func appOpenAdDidShow(ad: SRAppOpenAd) {
adsDate = Date()
requestStatAd(type: "start", errorMsg: nil)
self.delegate?.appOpenAdManagerDidShow?(adManager: self)
}
///广
func appOpenAdDidDismiss(ad: SRAppOpenAd) {
requestStatAd(type: "close", errorMsg: nil)
self.delegate?.appOpenAdManagerDidDismiss?(adManager: self)
clean()
}
///广
func appOpenAdDidClick(ad: SRAppOpenAd) {
requestStatAd(type: "click", errorMsg: nil)
self.delegate?.appOpenAdManagerDidClick?(adManager: self)
}
}
extension SRAppOpenAdManager {
private func requestStatAd(type: String, errorMsg: String?) {
guard let appOpenAd = self.appOpenAd else { return }
var seconds = 0
if let adsDate = self.adsDate {
if type == "click" || type == "close" {
seconds = Int(Date().timeIntervalSince(adsDate))
}
}
let model = VPStatAdModel()
model.type = type
model.view_seconds = seconds
model.ads_id = appOpenAd.adUnitID
model.ad_platform_key = VPAdPlatformKey(rawValue: appOpenAd.adPlatformKey)
model.error_msg = errorMsg
model.scene = .splash
// VPStatAPI.requestStatAd(model: model)
}
@objc private func didEnterBackgroundNotification() {
guard self.isShowing else { return }
self.requestStatAd(type: "Interrupt", errorMsg: nil)
}
}

View File

@ -0,0 +1,101 @@
//
// SRAdManger.swift
// SynthReel
//
// Created by on 2025/12/11.
// Copyright © 2025 SR. All rights reserved.
//
import UIKit
#if canImport(GoogleMobileAds)
import GoogleMobileAds
#endif
#if canImport(AppLovinSDK)
import AppLovinSDK
#endif
class SRAdManger: NSObject {
static var completer: (() -> Void)?
static func start() {
#if canImport(GoogleMobileAds)
MobileAds.shared.start()
#endif
initialize_applovinSdk()
}
///AppLovinSDK
static func initialize_applovinSdk(completer: (() -> Void)? = nil) {
if completer != nil {
self.completer = completer
}
#if canImport(AppLovinSDK)
if !ALSdk.shared().isInitialized {
//
let initConfig = ALSdkInitializationConfiguration(sdkKey: "XW2aulJv9urKD4MIIFT1xcSCuyTHaDZ9qUbDqygnTLS04GkdX7WMQJviGP5vDRWGsk4OJJIyLGRV3mbLqOWx0W") { builder in
builder.mediationProvider = ALMediationProviderMAX
//#if DEBUG
// builder.testDeviceAdvertisingIdentifiers = [JXUUID.idfa()]
//#endif
}
ALSdk.shared().initialize(with: initConfig) { sdkConfig in
// Start loading ads
self.completer?()
}
} else {
self.completer?()
}
#endif
}
}
//MARK: -------------- ID --------------
extension SRAdManger {
///广ID
static var google_rewardedAdUnitID: String {
#if DEBUG
return "ca-app-pub-3940256099942544/1712485313"
#else
return "ca-app-pub-6275401933109862/2121481439"
#endif
}
///广ID
static var google_appOpenAdUnitID: String {
#if DEBUG
return "ca-app-pub-3940256099942544/5575463023"
#else
return "ca-app-pub-6275401933109862/7130265535"
#endif
}
///广ID
static var google_bannerAdUnitID: String {
#if DEBUG
return "ca-app-pub-3940256099942544/2435281174"
#else
return "ca-app-pub-6275401933109862/7971191024"
#endif
}
///广ID
static var applovin_rewardedAdUnitID: String {
return "3708ac6b6026e375"
}
// ///广ID
// static var applovin_appOpenAdUnitID: String {
// return "d587df0fd75ff03b"
// }
// ///广ID
// static var applovin_bannerAdUnitID: String {
// return "1eb6278843149711"
// }
}

View File

@ -0,0 +1,39 @@
//
// SRVersionUpdateModel.swift
// SynthReel
//
// Created by on 2025/12/10.
// Copyright © 2025 SR. All rights reserved.
//
import UIKit
import SmartCodable
struct SRVersionUpdateModel: SmartCodable {
var version_code: String?
var des: String?
var version_name: String?
var force: Bool?
func canUpdate() -> Bool {
guard let version = version_code else { return false }
let result = kSRAPPVersion.compare(version, options: .numeric)
if result == .orderedAscending {
return true
} else {
return false
}
}
static func mappingForKey() -> [SmartKeyTransformer]? {
return [
CodingKeys.des <--- ["description"]
]
}
}

View File

@ -49,11 +49,15 @@ class SRNetwork: NSObject {
static func _request<T>(parameters: SRNetwork.Parameters, completion: ((_ response: SRNetwork.Response<T>) -> Void)?) -> Cancellable {
if parameters.isLoding {
SRHud.show()
DispatchQueue.main.async {
SRHud.show()
}
}
return provider.request(.request(parameters: parameters)) { result in
if parameters.isLoding {
SRHud.dismiss()
DispatchQueue.main.async {
SRHud.dismiss()
}
}
guard let completion = completion else {return}
_resultDispose(parameters: parameters, result: result, completion: completion)

View File

@ -26,7 +26,7 @@ class SRNavgationTitleView: UIView {
private let titleLabel: UILabel = {
let label = UILabel()
label.font = .font(ofSize: 18, weight: .bold)
label.font = .font(ofSize: 18, weight: .bold).withBoldItalic()
label.textAlignment = .center
label.textColor = .white
return label

View File

@ -0,0 +1,53 @@
//
// SRAppOpenAdViewController.swift
// SynthReel
//
// Created by on 2025/12/11.
// Copyright © 2025 SR. All rights reserved.
//
import UIKit
class SRAppOpenAdViewController: SRViewController {
var didEndBlock: (() -> Void)?
private(set) lazy var lanuchVC: UIViewController? = {
let vc = SRTool.lanuchViewController
return vc
}()
override func viewDidLoad() {
super.viewDidLoad()
if let vc = lanuchVC {
addChild(vc)
view.addSubview(vc.view)
}
let manager = SRAppOpenAdManager.manager
manager.delegate = self
manager.showAdIfAvailable()
}
}
//MARK: -------------- VPAppOpenAdManagerDelegate --------------
extension SRAppOpenAdViewController: SRAppOpenAdManagerDelegate {
func appOpenAdManagerDidDismiss(adManager: SRAppOpenAdDelegate) {
self.didEndBlock?()
}
func appOpenAdManager(adManager: SRAppOpenAdDelegate, didLoadFail error: any Error) {
self.didEndBlock?()
}
func appOpenAdManager(adManager: SRAppOpenAdDelegate, didDisplayFail error: any Error) {
self.didEndBlock?()
}
func appOpenAdManager(adManager: SRAppOpenAdDelegate, didOtherFail error: any Error) {
self.didEndBlock?()
}
}

View File

@ -32,6 +32,9 @@ class SRTabBarController: ESTabBarController {
self.tabBar.standardAppearance = appearance
self.tabBar.scrollEdgeAppearance = appearance
self.tabBar.isTranslucent = false
// SRTool.checkUpdates()
}

View File

@ -35,22 +35,24 @@ class SRFavoritesCell: UICollectionViewCell {
let videoId = (self.model)?.short_play_video_id
let isCollect = false
// Task {
// await SRShortApi.requestShortCollect(shortId: shortId, videoId: videoId, isCollect: isCollect)
// }
Task {
let success = await SRShortApi.requestShortCollect(
shortId: shortId,
videoId: videoId,
isCollect: isCollect
)
if success {
self.onCollectChanged?(self)
} else {
print("收藏失败")
let view = SRRemoveCollectAlert()
view.clickHighlightButton = {
Task {
let success = await SRShortApi.requestShortCollect(
shortId: shortId,
videoId: videoId,
isCollect: isCollect
)
if success {
self.onCollectChanged?(self)
} else {
print("收藏失败")
}
}
}
view.show()
}))
button.setImage(UIImage(named: "collect_icon_01_selected"), for: .normal)
button.setImage(UIImage(named: "collect_icon_01_selected"), for: .selected)

View File

@ -105,10 +105,29 @@ class SRShortDetailControlView: JXPlayerListControlView {
guard let shortId = self.shortModel?.short_play_id else { return }
let videoId = (self.model as? SRVideoInfoModel)?.short_play_video_id
let isCollect = !(self.shortModel?.is_collect ?? false)
Task {
await SRShortApi.requestShortCollect(shortId: shortId, videoId: videoId, isCollect: isCollect)
if !isCollect {
let view = SRRemoveCollectAlert()
view.clickHighlightButton = {
Task {
let success = await SRShortApi.requestShortCollect(
shortId: shortId,
videoId: videoId,
isCollect: isCollect
)
if success {
} else {
print("收藏失败")
}
}
}
view.show()
}else{
Task {
await SRShortApi.requestShortCollect(shortId: shortId, videoId: videoId, isCollect: isCollect)
}
}
}))
button.setImage(UIImage(named: "collect_icon_01"), for: .normal)
button.setImage(UIImage(named: "collect_icon_01_selected"), for: .selected)

View File

@ -99,22 +99,23 @@ extension SRVideoLockView {
addSubview(unlockStackView)
unlockStackView.addArrangedSubview(unlockButton)
unlockStackView.addArrangedSubview(adlockButton)
// unlockStackView.addArrangedSubview(adlockButton)
unlockStackView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(45)
make.right.equalToSuperview().offset(-45)
make.height.equalTo(43 * 2 + 30) // +
// make.height.equalTo(43 * 2 + 30) // +
make.centerY.equalToSuperview() //
make.height.equalTo(43)
}
unlockButton.snp.makeConstraints { make in
make.height.equalTo(43)
}
adlockButton.snp.makeConstraints { make in
make.height.equalTo(43)
}
// adlockButton.snp.makeConstraints { make in
// make.height.equalTo(43)
// }
}
}

View File

@ -32,10 +32,14 @@ class SRAboutUsController: SRViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.title = "About".localized
sr_setupLayout()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.isNavigationBarHidden = false
navigationController?.sr_setNavigationTitle("About".localized, for: self)
}
}

View File

@ -71,6 +71,7 @@ extension SRUserListViewController {
var arr = [
SRUserSettingModel(type: .feedback, name: "synthreel_feedback".localized, icon: UIImage(named: "icon_feedback")),
SRUserSettingModel(type: .deleteAccount, name: "synthreel_delet_account".localized, icon: UIImage(named: "icon_delet")),
SRUserSettingModel(type: .orderRecord, name: "synthreel_order_Record".localized, icon: UIImage(named: "icon_order")),
SRUserSettingModel(type: .about, name: "synthreel_about_us".localized, icon: UIImage(named: "icon_about")),
SRUserSettingModel(type: .privacyPolicy, name: "synthreel_privacy_policy".localized, icon: UIImage(named: "icon_privacy")),
SRUserSettingModel(type: .userAgreement, name: "synthreel_user_agreement".localized, icon: UIImage(named: "icon_user")),
@ -116,6 +117,10 @@ extension SRUserListViewController: UITableViewDelegate, UITableViewDataSource {
case .logout:
logout()
break
case .orderRecord:
let vc = SRWalletViewController()
self.navigationController?.pushViewController(vc, animated: true)
break
case .deleteAccount:
deleteAccount()
break
@ -138,9 +143,13 @@ extension SRUserListViewController: UITableViewDelegate, UITableViewDataSource {
}
func logout(){
Task{
await SRLogin.manager.logout(completer: nil)
let view = SRLogoutAlert();
view.clickHighlightButton = {
Task{
await SRLogin.manager.logout(completer: nil)
}
}
view.show()
}
func deleteAccount() {

View File

@ -18,6 +18,7 @@ struct SRUserSettingModel {
case userAgreement
case visitWebsite
case login
case orderRecord
case logout
// ///
case consumptionRecords

View File

@ -0,0 +1,29 @@
//
// SRWalletViewController.swift
// SynthReel
//
// Created by on 2025/12/10.
// Copyright © 2025 SR. All rights reserved.
//
import UIKit
class SRWalletViewController: SRViewController {
override func viewDidLoad() {
super.viewDidLoad()
sr_setupLayout()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.isNavigationBarHidden = false
navigationController?.sr_setNavigationTitle("synthreel_my_wallet".localized, for: self)
}
}
extension SRWalletViewController {
func sr_setupLayout() {
}
}

View File

@ -57,7 +57,6 @@ extension SceneDelegate {
// if date.fa_isToday { return }
// UserDefaults.standard.set(Date(), forKey: kFAApnsAlertDefaultsKey)
// #endif
// let view = SRApnsAlert()
// view.show()
}

View File

@ -12,6 +12,8 @@ class SRApnsAlert: SRBaseAlert {
private lazy var imageView = UIImageView(image: UIImage(named: "alertBg"))
private lazy var iconimageView = UIImageView(image: UIImage(named: "通知"))
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
@ -34,22 +36,19 @@ class SRApnsAlert: SRBaseAlert {
private lazy var laterButton: UIButton = {
let button = UIButton(type: .custom)
button.layer.cornerRadius = 18
button.layer.masksToBounds = true
button.layer.borderWidth = 1
button.layer.borderColor = UIColor.white.cgColor
button.setTitle("fableon_open_notification_later".localized, for: .normal)
button.setBackgroundImage(.laterbg ,for: .normal)
button.setTitle("synthreel_open_notification_later".localized, for: .normal)
button.setTitleColor(.white, for: .normal)
button.titleLabel?.font = .font(ofSize: 14, weight: .semibold)
button.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
return button
}()
override init(frame: CGRect) {
override init(frame: CGRect) {
super.init(frame: frame)
highlightButton.setTitle("fableon_open".localized, for: .normal)
fa_setupLayout()
highlightButton.setTitle("synthreel_allow".localized, for: .normal)
closeButton.isHidden = true
sr_setupLayout()
}
@MainActor required init?(coder: NSCoder) {
@ -71,35 +70,43 @@ class SRApnsAlert: SRBaseAlert {
extension SRApnsAlert {
private func fa_setupLayout() {
containerView.addSubview(imageView)
private func sr_setupLayout() {
contentView.addSubview(imageView)
imageView.addSubview(titleLabel)
imageView.addSubview(iconimageView)
imageView.addSubview(textLabel)
imageView.addSubview(laterButton)
imageView.addSubview(highlightButton)
imageView.isUserInteractionEnabled = true
imageView.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.top.equalToSuperview().offset(-62)
make.edges.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.right.lessThanOrEqualToSuperview().offset(-10)
make.top.equalTo(imageView.snp.bottom).offset(10)
make.top.equalTo(10)
make.height.equalTo(18)
}
iconimageView.snp.makeConstraints { make in
make.top.equalTo(iconimageView.snp.bottom).offset(38)
make.centerX.equalToSuperview()
make.size.equalTo(CGSizeMake(85, 85))
}
textLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.right.lessThanOrEqualToSuperview().offset(-20)
make.top.equalTo(titleLabel.snp.bottom).offset(12)
make.top.equalTo(iconimageView.snp.bottom).offset(12)
}
laterButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(23)
make.top.equalTo(textLabel.snp.bottom).offset(21)
make.bottom.equalToSuperview().offset(-20)
make.height.equalTo(36)
make.height.equalTo(48)
}
highlightButton.snp.makeConstraints { make in

View File

@ -42,8 +42,6 @@ class SRBaseAlert: UIView {
lazy var highlightButton: UIButton = {
let button = UIButton(type: .custom)
button.layer.cornerRadius = 16
button.layer.masksToBounds = true
button.setTitleColor(.srGreen, for: .normal)
button.setBackgroundImage(.suerButtonBg, for: .normal)
button.titleLabel?.font = .font(ofSize: 14, weight: .semibold)

View File

@ -0,0 +1,117 @@
//
// SRLogoutAlert.swift
// SynthReel
//
// Created by on 2025/12/10.
// Copyright © 2025 SR. All rights reserved.
//
import UIKit
class SRLogoutAlert: SRBaseAlert {
private lazy var imageView = UIImageView(image: UIImage(named: "alertBg"))
private lazy var iconimageView = UIImageView(image: UIImage(named: "通知"))
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.numberOfLines = 0
label.font = .font(ofSize: 18, weight: .semibold)
label.textColor = .white
label.text = "logout_alert_title".localized
return label
}()
private lazy var textLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.numberOfLines = 0
label.font = .font(ofSize: 12, weight: .regular)
label.textColor = .white
label.text = "logout_alert_text".localized
return label
}()
private lazy var laterButton: UIButton = {
let button = UIButton(type: .custom)
button.setBackgroundImage(.laterbg ,for: .normal)
button.setTitle("synthreel_cancel".localized, for: .normal)
button.setTitleColor(.white, for: .normal)
button.titleLabel?.font = .font(ofSize: 14, weight: .semibold)
button.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
return button
}()
override init(frame: CGRect) {
super.init(frame: frame)
highlightButton.setTitle("synthreel_logout".localized, for: .normal)
closeButton.isHidden = true
sr_setupLayout()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func handleHighlightButton() {
super.handleHighlightButton()
}
override func dismiss() {
super.dismiss()
adjustManger.manager.apnsFinish()
}
}
extension SRLogoutAlert {
private func sr_setupLayout() {
contentView.addSubview(imageView)
imageView.addSubview(titleLabel)
imageView.addSubview(iconimageView)
imageView.addSubview(textLabel)
imageView.addSubview(laterButton)
imageView.addSubview(highlightButton)
imageView.isUserInteractionEnabled = true
imageView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.right.lessThanOrEqualToSuperview().offset(-10)
make.top.equalTo(10)
make.height.equalTo(18)
}
iconimageView.snp.makeConstraints { make in
make.top.equalTo(iconimageView.snp.bottom).offset(38)
make.centerX.equalToSuperview()
make.size.equalTo(CGSizeMake(85, 85))
}
textLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.right.lessThanOrEqualToSuperview().offset(-20)
make.top.equalTo(iconimageView.snp.bottom).offset(12)
}
laterButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(23)
make.top.equalTo(textLabel.snp.bottom).offset(21)
make.bottom.equalToSuperview().offset(-20)
make.height.equalTo(48)
}
highlightButton.snp.makeConstraints { make in
make.width.height.top.equalTo(laterButton)
make.left.equalTo(laterButton.snp.right).offset(11)
make.right.equalToSuperview().offset(-23)
}
}
}

View File

@ -0,0 +1,117 @@
//
// SRRemoveCollectAlert.swift
// SynthReel
//
// Created by on 2025/12/10.
// Copyright © 2025 SR. All rights reserved.
//
import UIKit
class SRRemoveCollectAlert: SRBaseAlert {
private lazy var imageView = UIImageView(image: UIImage(named: "alertBg"))
private lazy var iconimageView = UIImageView(image: UIImage(named: "收藏"))
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.numberOfLines = 0
label.font = .font(ofSize: 18, weight: .semibold)
label.textColor = .white
label.text = "remove_collect_alert_title".localized
return label
}()
private lazy var textLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.numberOfLines = 0
label.font = .font(ofSize: 12, weight: .regular)
label.textColor = .white
label.text = "remove_collect_alert_text".localized
return label
}()
private lazy var laterButton: UIButton = {
let button = UIButton(type: .custom)
button.setBackgroundImage(.laterbg ,for: .normal)
button.setTitle("synthreel_cancel".localized, for: .normal)
button.setTitleColor(.white, for: .normal)
button.titleLabel?.font = .font(ofSize: 14, weight: .semibold)
button.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
return button
}()
override init(frame: CGRect) {
super.init(frame: frame)
highlightButton.setTitle("synthreel_remove".localized, for: .normal)
highlightButton.setImage(., for: .normal)
closeButton.isHidden = true
sr_setupLayout()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func handleHighlightButton() {
super.handleHighlightButton()
}
override func dismiss() {
super.dismiss()
adjustManger.manager.apnsFinish()
}
}
extension SRRemoveCollectAlert {
private func sr_setupLayout() {
contentView.addSubview(imageView)
imageView.addSubview(titleLabel)
imageView.addSubview(iconimageView)
imageView.addSubview(textLabel)
imageView.addSubview(laterButton)
imageView.addSubview(highlightButton)
imageView.isUserInteractionEnabled = true
imageView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.right.lessThanOrEqualToSuperview().offset(-10)
make.top.equalTo(10)
make.height.equalTo(18)
}
iconimageView.snp.makeConstraints { make in
make.top.equalTo(iconimageView.snp.bottom).offset(38)
make.centerX.equalToSuperview()
make.size.equalTo(CGSizeMake(85, 85))
}
textLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.right.lessThanOrEqualToSuperview().offset(-20)
make.top.equalTo(iconimageView.snp.bottom).offset(12)
}
laterButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(23)
make.top.equalTo(textLabel.snp.bottom).offset(21)
make.bottom.equalToSuperview().offset(-20)
make.height.equalTo(48)
}
highlightButton.snp.makeConstraints { make in
make.width.height.top.equalTo(laterButton)
make.left.equalTo(laterButton.snp.right).offset(11)
make.right.equalToSuperview().offset(-23)
}
}
}

View File

@ -0,0 +1,107 @@
//
// SRUpdatesAlert.swift
// SynthReel
//
// Created by on 2025/12/10.
// Copyright © 2025 SR. All rights reserved.
//
import UIKit
class SRUpdatesAlert: SRBaseAlert {
var model: SRVersionUpdateModel? {
didSet {
versionLabel.text = model?.des?.localized
closeButton.isHidden = model?.force ?? false
}
}
private lazy var imageView = UIImageView(image: UIImage(named: "alertBg"))
private lazy var iconimageView = UIImageView(image: UIImage(named: "升级"))
private lazy var titleLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.numberOfLines = 0
label.font = .font(ofSize: 18, weight: .semibold)
label.textColor = .white
label.text = "updates_alert_title".localized
return label
}()
private lazy var versionLabel: UILabel = {
let label = UILabel()
label.textAlignment = .left
label.numberOfLines = 0
label.font = .font(ofSize: 15, weight: .regular)
label.textColor = .white
return label
}()
override init(frame: CGRect) {
super.init(frame: frame)
highlightButton.setTitle("synthreel_update_now".localized, for: .normal)
sr_setupLayout()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func handleHighlightButton() {
super.handleHighlightButton()
guard let url = URL(string: "https://apps.apple.com/app/id6755756350") else { return }
let application = UIApplication.shared
if application.canOpenURL(url) {
application.open(url)
}
}
override func dismiss() {
super.dismiss()
adjustManger.manager.apnsFinish()
}
}
extension SRUpdatesAlert {
private func sr_setupLayout() {
contentView.addSubview(imageView)
imageView.addSubview(titleLabel)
imageView.addSubview(versionLabel)
imageView.addSubview(iconimageView)
imageView.addSubview(highlightButton)
imageView.isUserInteractionEnabled = true
imageView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.centerX.equalToSuperview()
make.right.lessThanOrEqualToSuperview().offset(-10)
make.top.equalTo(10)
make.height.equalTo(18)
}
iconimageView.snp.makeConstraints { make in
make.top.equalTo(titleLabel.snp.bottom).offset(38)
make.centerX.equalToSuperview()
make.size.equalTo(CGSizeMake(85, 85))
}
versionLabel.snp.makeConstraints { make in
make.top.equalTo(iconimageView.snp.bottom).offset(10)
make.left.right.equalToSuperview().inset(20)
}
highlightButton.snp.makeConstraints { make in
make.top.equalTo(versionLabel.snp.bottom).offset(15)
make.height.equalTo(48)
make.left.right.equalToSuperview().inset(30)
make.right.equalToSuperview().offset(-23)
}
}
}

View File

@ -100,3 +100,56 @@ extension SRTool {
}
}
}
//MARK:
extension SRTool {
static weak var updateAlert: UIView?
static func checkUpdates() {
guard self.self.updateAlert == nil else { return }
Task {
let model = await SRUserApi.requestVersionUpdateData()
guard let model = model else {
adjustManger.manager.upgradeAlertFinish = true
await SRTool.sceneDelegate?.retryHandleOpenAppMessage()
return
}
await MainActor.run {
self.showUpdatesAlert(model)
}
}
}
static func showUpdatesAlert(_ model: SRVersionUpdateModel) {
guard self.self.updateAlert == nil else { return }
//#if !DEBUG
// if model.force != true {
// if let date = UserDefaults.standard.object(forKey: kFAVersionUpdateAlertDefaultsKey) as? Date {
// if date.fa_isToday {
// FAAdjustStateManager.manager.upgradeAlertFinish = true
// FATool.sceneDelegate?.retryHandleOpenAppMessage()
// return
// }
// }
// UserDefaults.standard.set(Date(), forKey: kFAVersionUpdateAlertDefaultsKey)
// }
//#endif // !DEBUG
// if model.canUpdate() {
//
// Task {
// await SRStatAPI.requestEventStat(orderCode: nil, shortPlayId: nil, videoId: nil, eventKey: .forceUpdate, errorMsg: nil, otherParamenters: [
// "is_force" : model.force == true ? "true" : "false"
// ])
// }
// let view = SRUpdatesAlert()
// view.model = model
// view.show()
// self.updateAlert = view
// } else {
// adjustManger.manager.upgradeAlertFinish = true
// SRTool.sceneDelegate?.retryHandleOpenAppMessage()
// }
}
}

View File

@ -7,11 +7,33 @@
{
"filename" : "recordBottomBg@2x.png",
"idiom" : "universal",
"resizing" : {
"cap-insets" : {
"left" : 235,
"right" : 252
},
"center" : {
"mode" : "tile",
"width" : 1
},
"mode" : "3-part-horizontal"
},
"scale" : "2x"
},
{
"filename" : "recordBottomBg@3x.png",
"idiom" : "universal",
"resizing" : {
"cap-insets" : {
"left" : 230,
"right" : 306
},
"center" : {
"mode" : "tile",
"width" : 1
},
"mode" : "3-part-horizontal"
},
"scale" : "3x"
}
],

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "icon_order@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "icon_order@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 852 B

View File

@ -7,11 +7,33 @@
{
"filename" : "suerButtonBg@2x.png",
"idiom" : "universal",
"resizing" : {
"cap-insets" : {
"left" : 99,
"right" : 96
},
"center" : {
"mode" : "tile",
"width" : 1
},
"mode" : "3-part-horizontal"
},
"scale" : "2x"
},
{
"filename" : "suerButtonBg@3x.png",
"idiom" : "universal",
"resizing" : {
"cap-insets" : {
"left" : 133,
"right" : 136
},
"center" : {
"mode" : "tile",
"width" : 1
},
"mode" : "3-part-horizontal"
},
"scale" : "3x"
}
],

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "laterbg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "laterbg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "删除@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "删除@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -7,11 +7,33 @@
{
"filename" : "弹窗按钮背景@2x.png",
"idiom" : "universal",
"resizing" : {
"cap-insets" : {
"left" : 94,
"right" : 92
},
"center" : {
"mode" : "tile",
"width" : 1
},
"mode" : "3-part-horizontal"
},
"scale" : "2x"
},
{
"filename" : "弹窗按钮背景@3x.png",
"idiom" : "universal",
"resizing" : {
"cap-insets" : {
"left" : 136,
"right" : 141
},
"center" : {
"mode" : "tile",
"width" : 1
},
"mode" : "3-part-horizontal"
},
"scale" : "3x"
}
],

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "收藏@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "收藏@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -25,6 +25,8 @@
<string>1203129771732470</string>
<key>NSUserTrackingUsageDescription</key>
<string>We will use your advertising identifier (IDFA) to provide a personalized advertising experience.</string>
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-6275401933109862~8769451155</string>
<key>FacebookClientToken</key>
<string>3e671125d76ef8555893cd453337ccfc</string>
<key>UIApplicationSceneManifest</key>

View File

@ -28,6 +28,7 @@
"synthreel_user_agreement" = "User Agreement";
"synthreel_delet_account" = "Delet Account";
"synthreel_visit_website" = "visit website";
"synthreel_order_Record" = "Order Record";
"Viral Hits" = "Viral Hits";
"Live Trending Rankings" = "Live Trending Rankings";
"empty_title_01" = "No search results";
@ -102,7 +103,19 @@
"pay_error_6" = "You have unfinished in-app purchases, please restore them first.";
"synthreel_open_notification_later" = "later";
"synthreel_allow" = "Allow";
"coins_pack_alert_title" = "Daily Reward is waiting!";
"synthreel_claim_now" = "Claim Now";
"synthreel_daily_coins" = "Daily Coins";
"apns_alert_title" = "Dont miss updates!";
"apns_alert_text" = "Get new episode alerts & rewards.";
"updates_alert_title" = "Discover a new version";
"synthreel_update_now" = "Upgrade now";
"logout_alert_title" = "Leaving so soon?";
"logout_alert_text" = "Your progress will be saved.";
"synthreel_logout" = "Log out";
"synthreel_cancel" = "Cancel";
"remove_collect_alert_title" = "Remove from your list?";
"remove_collect_alert_text" = "This drama will be removed from your saved list.";
"synthreel_remove" = "Remove";
"synthreel_my_wallet" = "My Wallet";

View File

@ -8,5 +8,9 @@
<array>
<string>Default</string>
</array>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:synthreel.go.link</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,27 @@
{
"buildCommand" : {
"command" : "build",
"skipDependencies" : false,
"style" : "buildOnly"
},
"configuredTargets" : [
],
"continueBuildingAfterErrors" : false,
"dependencyScope" : "workspace",
"enableIndexBuildArena" : false,
"hideShellScriptEnvironment" : false,
"parameters" : {
"action" : "build",
"overrides" : {
}
},
"qos" : "utility",
"schemeCommand" : "launch",
"showNonLoggedProgress" : true,
"useDryRun" : false,
"useImplicitDependencies" : false,
"useLegacyBuildLocations" : false,
"useParallelTargets" : true
}

View File

@ -0,0 +1 @@
{"client":{"name":"basic","version":0,"file-system":"device-agnostic","perform-ownership-analysis":"no"},"targets":{"":["<all>"]},"commands":{"<all>":{"tool":"phony","inputs":["<WorkspaceHeaderMapVFSFilesWritten>"],"outputs":["<all>"]},"P0:::Gate WorkspaceHeaderMapVFSFilesWritten":{"tool":"phony","inputs":[],"outputs":["<WorkspaceHeaderMapVFSFilesWritten>"]}}}

View File

@ -0,0 +1 @@
Target dependency graph (0 target)