From 3023c4e85607008ae2be523982a0b35525732699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9E?= Date: Fri, 7 Jun 2024 13:38:31 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HiBit.xcodeproj/project.pbxproj | 274 ++- .../IDEFindNavigatorScopes.plist | 5 + HiBit/Basics/PrefixHeader.pch | 91 + HiBit/Project/Publics/Color/HBColor.h | 26 + HiBit/Project/Publics/Color/HBColor.m | 53 + .../Project/Publics/CommonKeys/HBCommonKeys.h | 40 + .../Project/Publics/CommonKeys/HBCommonKeys.m | 32 + .../Project/Publics/CommonKeys/HBThirdKeys.h | 20 + .../Project/Publics/CommonKeys/HBThirdKeys.m | 20 + .../Controllers/HBNavigationController.h | 17 + .../Controllers/HBNavigationController.m | 42 + .../Publics/Controllers/HBTabBarController.h | 16 + .../Publics/Controllers/HBTabBarController.m | 97 + .../Publics/Controllers/HBViewController.h | 21 + .../Publics/Controllers/HBViewController.m | 49 + HiBit/Project/Publics/Defines/HBDefines.h | 19 + .../Controllers/HBMultiLanguageController.h | 22 + .../Controllers/HBMultiLanguageController.m | 246 ++ .../Manager/HBMultiLanguageManager.h | 74 + .../Manager/HBMultiLanguageManager.m | 168 ++ .../Sources/MultiLanguage.xcstrings | 2001 +++++++++++++++++ .../Publics/Views/HBCollectionViewCell.h | 16 + .../Publics/Views/HBCollectionViewCell.m | 12 + .../Publics/Views/HBRefreshAutoNormalFooter.h | 16 + .../Publics/Views/HBRefreshAutoNormalFooter.m | 19 + .../Publics/Views/HBRefreshNormalHeader.h | 16 + .../Publics/Views/HBRefreshNormalHeader.m | 64 + HiBit/Project/Publics/Views/HBTableView.h | 16 + HiBit/Project/Publics/Views/HBTableView.m | 12 + HiBit/Project/Publics/Views/HBTextField.h | 16 + HiBit/Project/Publics/Views/HBTextField.m | 21 + HiBit/Project/Publics/Views/HBView.h | 16 + HiBit/Project/Publics/Views/HBView.m | 13 + HiBit/Project/Services/HBApiParams.h | 35 + HiBit/Project/Services/HBApiParams.m | 321 +++ .../Services/HBNetWorkingUtility+Services.h | 135 ++ .../Services/HBNetWorkingUtility+Services.m | 226 ++ HiBit/Project/Services/HBNetWorkingUtility.h | 136 ++ HiBit/Project/Services/HBNetWorkingUtility.m | 253 +++ .../Services/HBNetWorkingUtilityResult.h | 29 + .../Services/HBNetWorkingUtilityResult.m | 54 + .../NSNotificationCenter+Extension.h | 23 + .../NSNotificationCenter+Extension.m | 35 + .../NSUserDefaults/NSUserDefaults+Extesion.h | 2 + .../NSUserDefaults/NSUserDefaults+Extesion.m | 4 +- HiBit/Utils/HBAlertView/HBAlertView.h | 45 + HiBit/Utils/HBAlertView/HBAlertView.m | 306 +++ HiBit/Utils/HtyoNetWorking/HtyoNetWorking.h | 2 +- HiBit/Utils/HtyoNetWorking/HtyoNetWorking.m | 2 +- HiBit/Utils/RSButton/RSButton.h | 42 + HiBit/Utils/RSButton/RSButton.m | 265 +++ 51 files changed, 5467 insertions(+), 18 deletions(-) create mode 100644 HiBit.xcworkspace/xcuserdata/loser.xcuserdatad/IDEFindNavigatorScopes.plist create mode 100644 HiBit/Project/Publics/Color/HBColor.h create mode 100644 HiBit/Project/Publics/Color/HBColor.m create mode 100644 HiBit/Project/Publics/CommonKeys/HBCommonKeys.h create mode 100644 HiBit/Project/Publics/CommonKeys/HBCommonKeys.m create mode 100644 HiBit/Project/Publics/CommonKeys/HBThirdKeys.h create mode 100644 HiBit/Project/Publics/CommonKeys/HBThirdKeys.m create mode 100644 HiBit/Project/Publics/Controllers/HBNavigationController.h create mode 100644 HiBit/Project/Publics/Controllers/HBNavigationController.m create mode 100644 HiBit/Project/Publics/Controllers/HBTabBarController.h create mode 100644 HiBit/Project/Publics/Controllers/HBTabBarController.m create mode 100644 HiBit/Project/Publics/Controllers/HBViewController.h create mode 100644 HiBit/Project/Publics/Controllers/HBViewController.m create mode 100644 HiBit/Project/Publics/Defines/HBDefines.h create mode 100644 HiBit/Project/Publics/MultiLanguage/Controllers/HBMultiLanguageController.h create mode 100644 HiBit/Project/Publics/MultiLanguage/Controllers/HBMultiLanguageController.m create mode 100644 HiBit/Project/Publics/MultiLanguage/Manager/HBMultiLanguageManager.h create mode 100644 HiBit/Project/Publics/MultiLanguage/Manager/HBMultiLanguageManager.m create mode 100644 HiBit/Project/Publics/MultiLanguage/Sources/MultiLanguage.xcstrings create mode 100644 HiBit/Project/Publics/Views/HBCollectionViewCell.h create mode 100644 HiBit/Project/Publics/Views/HBCollectionViewCell.m create mode 100644 HiBit/Project/Publics/Views/HBRefreshAutoNormalFooter.h create mode 100644 HiBit/Project/Publics/Views/HBRefreshAutoNormalFooter.m create mode 100644 HiBit/Project/Publics/Views/HBRefreshNormalHeader.h create mode 100644 HiBit/Project/Publics/Views/HBRefreshNormalHeader.m create mode 100644 HiBit/Project/Publics/Views/HBTableView.h create mode 100644 HiBit/Project/Publics/Views/HBTableView.m create mode 100644 HiBit/Project/Publics/Views/HBTextField.h create mode 100644 HiBit/Project/Publics/Views/HBTextField.m create mode 100644 HiBit/Project/Publics/Views/HBView.h create mode 100644 HiBit/Project/Publics/Views/HBView.m create mode 100644 HiBit/Project/Services/HBApiParams.h create mode 100644 HiBit/Project/Services/HBApiParams.m create mode 100644 HiBit/Project/Services/HBNetWorkingUtility+Services.h create mode 100644 HiBit/Project/Services/HBNetWorkingUtility+Services.m create mode 100644 HiBit/Project/Services/HBNetWorkingUtility.h create mode 100644 HiBit/Project/Services/HBNetWorkingUtility.m create mode 100644 HiBit/Project/Services/HBNetWorkingUtilityResult.h create mode 100644 HiBit/Project/Services/HBNetWorkingUtilityResult.m create mode 100644 HiBit/Utils/Category/NSNotificationCenter/NSNotificationCenter+Extension.h create mode 100644 HiBit/Utils/Category/NSNotificationCenter/NSNotificationCenter+Extension.m create mode 100644 HiBit/Utils/HBAlertView/HBAlertView.h create mode 100644 HiBit/Utils/HBAlertView/HBAlertView.m create mode 100644 HiBit/Utils/RSButton/RSButton.h create mode 100644 HiBit/Utils/RSButton/RSButton.m diff --git a/HiBit.xcodeproj/project.pbxproj b/HiBit.xcodeproj/project.pbxproj index 844d42e..2dc7d7c 100644 --- a/HiBit.xcodeproj/project.pbxproj +++ b/HiBit.xcodeproj/project.pbxproj @@ -82,7 +82,29 @@ 916353392C12B6D400593047 /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 916352E72C12B6D400593047 /* SVRadialGradientLayer.m */; }; 9163533A2C12B6D400593047 /* HUDManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 916352EA2C12B6D400593047 /* HUDManager.m */; }; 9163533D2C12B6D400593047 /* KxMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 916352F02C12B6D400593047 /* KxMenu.m */; }; - 9163533E2C12B6D400593047 /* HtyoNetWorking.m in Sources */ = {isa = PBXBuildFile; fileRef = 916352F32C12B6D400593047 /* HtyoNetWorking.m */; }; + 9163534B2C12C15300593047 /* HBApiParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353422C12C15300593047 /* HBApiParams.m */; }; + 9163534C2C12C15300593047 /* HBNetWorkingUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353442C12C15300593047 /* HBNetWorkingUtility.m */; }; + 9163534D2C12C15300593047 /* HBNetWorkingUtilityResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353462C12C15300593047 /* HBNetWorkingUtilityResult.m */; }; + 9163534E2C12C15300593047 /* HBNetWorkingUtility+Services.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353492C12C15300593047 /* HBNetWorkingUtility+Services.m */; }; + 916353862C12C20B00593047 /* HBColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353502C12C20B00593047 /* HBColor.m */; }; + 916353872C12C20B00593047 /* HBCommonKeys.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353532C12C20B00593047 /* HBCommonKeys.m */; }; + 916353882C12C20B00593047 /* HBThirdKeys.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353552C12C20B00593047 /* HBThirdKeys.m */; }; + 916353892C12C20B00593047 /* HBNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353582C12C20B00593047 /* HBNavigationController.m */; }; + 9163538A2C12C20B00593047 /* HBTabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9163535A2C12C20B00593047 /* HBTabBarController.m */; }; + 9163538B2C12C20B00593047 /* HBViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9163535C2C12C20B00593047 /* HBViewController.m */; }; + 9163538C2C12C20B00593047 /* HBMultiLanguageController.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353622C12C20B00593047 /* HBMultiLanguageController.m */; }; + 9163538D2C12C20B00593047 /* HBMultiLanguageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353652C12C20B00593047 /* HBMultiLanguageManager.m */; }; + 9163538E2C12C20B00593047 /* MultiLanguage.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 916353672C12C20B00593047 /* MultiLanguage.xcstrings */; }; + 916353932C12C20B00593047 /* HBAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353752C12C20B00593047 /* HBAlertView.m */; }; + 916353942C12C20B00593047 /* HBCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353772C12C20B00593047 /* HBCollectionViewCell.m */; }; + 916353952C12C20B00593047 /* HBRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353792C12C20B00593047 /* HBRefreshAutoNormalFooter.m */; }; + 916353962C12C20B00593047 /* HBRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 9163537B2C12C20B00593047 /* HBRefreshNormalHeader.m */; }; + 916353972C12C20B00593047 /* HBTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9163537D2C12C20B00593047 /* HBTableView.m */; }; + 916353982C12C20B00593047 /* HBTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 9163537F2C12C20B00593047 /* HBTextField.m */; }; + 916353992C12C20B00593047 /* HBView.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353812C12C20B00593047 /* HBView.m */; }; + 9163539A2C12C20B00593047 /* RSButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353832C12C20B00593047 /* RSButton.m */; }; + 916353A22C12C3DC00593047 /* HtyoNetWorking.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353A02C12C3DC00593047 /* HtyoNetWorking.m */; }; + 916353A82C12C6AF00593047 /* NSNotificationCenter+Extension.m in Sources */ = {isa = PBXBuildFile; fileRef = 916353A72C12C6AF00593047 /* NSNotificationCenter+Extension.m */; }; C8AC2283D47E2B99FF559E75 /* libPods-HiBit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 141F02EF5C0783797594009A /* libPods-HiBit.a */; }; /* End PBXBuildFile section */ @@ -242,8 +264,52 @@ 916352EA2C12B6D400593047 /* HUDManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HUDManager.m; sourceTree = ""; }; 916352EF2C12B6D400593047 /* KxMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KxMenu.h; sourceTree = ""; }; 916352F02C12B6D400593047 /* KxMenu.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KxMenu.m; sourceTree = ""; }; - 916352F22C12B6D400593047 /* HtyoNetWorking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HtyoNetWorking.h; sourceTree = ""; }; - 916352F32C12B6D400593047 /* HtyoNetWorking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HtyoNetWorking.m; sourceTree = ""; }; + 916353412C12C15300593047 /* HBApiParams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBApiParams.h; sourceTree = ""; }; + 916353422C12C15300593047 /* HBApiParams.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBApiParams.m; sourceTree = ""; }; + 916353432C12C15300593047 /* HBNetWorkingUtility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBNetWorkingUtility.h; sourceTree = ""; }; + 916353442C12C15300593047 /* HBNetWorkingUtility.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBNetWorkingUtility.m; sourceTree = ""; }; + 916353452C12C15300593047 /* HBNetWorkingUtilityResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBNetWorkingUtilityResult.h; sourceTree = ""; }; + 916353462C12C15300593047 /* HBNetWorkingUtilityResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBNetWorkingUtilityResult.m; sourceTree = ""; }; + 916353482C12C15300593047 /* HBNetWorkingUtility+Services.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "HBNetWorkingUtility+Services.h"; sourceTree = ""; }; + 916353492C12C15300593047 /* HBNetWorkingUtility+Services.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "HBNetWorkingUtility+Services.m"; sourceTree = ""; }; + 9163534F2C12C20B00593047 /* HBColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBColor.h; sourceTree = ""; }; + 916353502C12C20B00593047 /* HBColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBColor.m; sourceTree = ""; }; + 916353522C12C20B00593047 /* HBCommonKeys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBCommonKeys.h; sourceTree = ""; }; + 916353532C12C20B00593047 /* HBCommonKeys.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBCommonKeys.m; sourceTree = ""; }; + 916353542C12C20B00593047 /* HBThirdKeys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBThirdKeys.h; sourceTree = ""; }; + 916353552C12C20B00593047 /* HBThirdKeys.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBThirdKeys.m; sourceTree = ""; }; + 916353572C12C20B00593047 /* HBNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBNavigationController.h; sourceTree = ""; }; + 916353582C12C20B00593047 /* HBNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBNavigationController.m; sourceTree = ""; }; + 916353592C12C20B00593047 /* HBTabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBTabBarController.h; sourceTree = ""; }; + 9163535A2C12C20B00593047 /* HBTabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBTabBarController.m; sourceTree = ""; }; + 9163535B2C12C20B00593047 /* HBViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBViewController.h; sourceTree = ""; }; + 9163535C2C12C20B00593047 /* HBViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBViewController.m; sourceTree = ""; }; + 9163535E2C12C20B00593047 /* HBDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBDefines.h; sourceTree = ""; }; + 916353612C12C20B00593047 /* HBMultiLanguageController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBMultiLanguageController.h; sourceTree = ""; }; + 916353622C12C20B00593047 /* HBMultiLanguageController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBMultiLanguageController.m; sourceTree = ""; }; + 916353642C12C20B00593047 /* HBMultiLanguageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBMultiLanguageManager.h; sourceTree = ""; }; + 916353652C12C20B00593047 /* HBMultiLanguageManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBMultiLanguageManager.m; sourceTree = ""; }; + 916353672C12C20B00593047 /* MultiLanguage.xcstrings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json.xcstrings; path = MultiLanguage.xcstrings; sourceTree = ""; }; + 916353742C12C20B00593047 /* HBAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBAlertView.h; sourceTree = ""; }; + 916353752C12C20B00593047 /* HBAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBAlertView.m; sourceTree = ""; }; + 916353762C12C20B00593047 /* HBCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBCollectionViewCell.h; sourceTree = ""; }; + 916353772C12C20B00593047 /* HBCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBCollectionViewCell.m; sourceTree = ""; }; + 916353782C12C20B00593047 /* HBRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBRefreshAutoNormalFooter.h; sourceTree = ""; }; + 916353792C12C20B00593047 /* HBRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBRefreshAutoNormalFooter.m; sourceTree = ""; }; + 9163537A2C12C20B00593047 /* HBRefreshNormalHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBRefreshNormalHeader.h; sourceTree = ""; }; + 9163537B2C12C20B00593047 /* HBRefreshNormalHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBRefreshNormalHeader.m; sourceTree = ""; }; + 9163537C2C12C20B00593047 /* HBTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBTableView.h; sourceTree = ""; }; + 9163537D2C12C20B00593047 /* HBTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBTableView.m; sourceTree = ""; }; + 9163537E2C12C20B00593047 /* HBTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBTextField.h; sourceTree = ""; }; + 9163537F2C12C20B00593047 /* HBTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBTextField.m; sourceTree = ""; }; + 916353802C12C20B00593047 /* HBView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBView.h; sourceTree = ""; }; + 916353812C12C20B00593047 /* HBView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBView.m; sourceTree = ""; }; + 916353822C12C20B00593047 /* RSButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSButton.h; sourceTree = ""; }; + 916353832C12C20B00593047 /* RSButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RSButton.m; sourceTree = ""; }; + 9163539F2C12C3DC00593047 /* HtyoNetWorking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HtyoNetWorking.h; sourceTree = ""; }; + 916353A02C12C3DC00593047 /* HtyoNetWorking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HtyoNetWorking.m; sourceTree = ""; }; + 916353A62C12C6AF00593047 /* NSNotificationCenter+Extension.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSNotificationCenter+Extension.h"; sourceTree = ""; }; + 916353A72C12C6AF00593047 /* NSNotificationCenter+Extension.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSNotificationCenter+Extension.m"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -290,7 +356,7 @@ children = ( 9163513B2C12B0A200593047 /* Basics */, 9163513D2C12B11A00593047 /* AppDelegate */, - 9163533F2C12C01E00593047 /* Services */, + 916353402C12C10100593047 /* Project */, 916352F52C12B6D400593047 /* Utils */, ); path = HiBit; @@ -505,6 +571,7 @@ 9163528B2C12B6D400593047 /* Category */ = { isa = PBXGroup; children = ( + 916353A52C12C69900593047 /* NSNotificationCenter */, 916352482C12B6D400593047 /* Foundation */, 9163524B2C12B6D400593047 /* NSData */, 9163524E2C12B6D400593047 /* NSDate */, @@ -673,23 +740,16 @@ path = KxMenu; sourceTree = ""; }; - 916352F42C12B6D400593047 /* HtyoNetWorking */ = { - isa = PBXGroup; - children = ( - 916352F22C12B6D400593047 /* HtyoNetWorking.h */, - 916352F32C12B6D400593047 /* HtyoNetWorking.m */, - ); - path = HtyoNetWorking; - sourceTree = ""; - }; 916352F52C12B6D400593047 /* Utils */ = { isa = PBXGroup; children = ( + 916353A42C12C4D900593047 /* RSButton */, + 916353A32C12C4CA00593047 /* HBAlertView */, + 916353A12C12C3DC00593047 /* HtyoNetWorking */, 9163528B2C12B6D400593047 /* Category */, 916352912C12B6D400593047 /* GTM+AES */, 916352EE2C12B6D400593047 /* HUD */, 916352F12C12B6D400593047 /* KxMenu */, - 916352F42C12B6D400593047 /* HtyoNetWorking */, ); path = Utils; sourceTree = ""; @@ -697,10 +757,172 @@ 9163533F2C12C01E00593047 /* Services */ = { isa = PBXGroup; children = ( + 916353412C12C15300593047 /* HBApiParams.h */, + 916353422C12C15300593047 /* HBApiParams.m */, + 916353432C12C15300593047 /* HBNetWorkingUtility.h */, + 916353442C12C15300593047 /* HBNetWorkingUtility.m */, + 916353452C12C15300593047 /* HBNetWorkingUtilityResult.h */, + 916353462C12C15300593047 /* HBNetWorkingUtilityResult.m */, + 916353482C12C15300593047 /* HBNetWorkingUtility+Services.h */, + 916353492C12C15300593047 /* HBNetWorkingUtility+Services.m */, ); path = Services; sourceTree = ""; }; + 916353402C12C10100593047 /* Project */ = { + isa = PBXGroup; + children = ( + 916353852C12C20B00593047 /* Publics */, + 9163533F2C12C01E00593047 /* Services */, + ); + path = Project; + sourceTree = ""; + }; + 916353512C12C20B00593047 /* Color */ = { + isa = PBXGroup; + children = ( + 9163534F2C12C20B00593047 /* HBColor.h */, + 916353502C12C20B00593047 /* HBColor.m */, + ); + path = Color; + sourceTree = ""; + }; + 916353562C12C20B00593047 /* CommonKeys */ = { + isa = PBXGroup; + children = ( + 916353522C12C20B00593047 /* HBCommonKeys.h */, + 916353532C12C20B00593047 /* HBCommonKeys.m */, + 916353542C12C20B00593047 /* HBThirdKeys.h */, + 916353552C12C20B00593047 /* HBThirdKeys.m */, + ); + path = CommonKeys; + sourceTree = ""; + }; + 9163535D2C12C20B00593047 /* Controllers */ = { + isa = PBXGroup; + children = ( + 916353572C12C20B00593047 /* HBNavigationController.h */, + 916353582C12C20B00593047 /* HBNavigationController.m */, + 916353592C12C20B00593047 /* HBTabBarController.h */, + 9163535A2C12C20B00593047 /* HBTabBarController.m */, + 9163535B2C12C20B00593047 /* HBViewController.h */, + 9163535C2C12C20B00593047 /* HBViewController.m */, + ); + path = Controllers; + sourceTree = ""; + }; + 9163535F2C12C20B00593047 /* Defines */ = { + isa = PBXGroup; + children = ( + 9163535E2C12C20B00593047 /* HBDefines.h */, + ); + path = Defines; + sourceTree = ""; + }; + 916353632C12C20B00593047 /* Controllers */ = { + isa = PBXGroup; + children = ( + 916353612C12C20B00593047 /* HBMultiLanguageController.h */, + 916353622C12C20B00593047 /* HBMultiLanguageController.m */, + ); + path = Controllers; + sourceTree = ""; + }; + 916353662C12C20B00593047 /* Manager */ = { + isa = PBXGroup; + children = ( + 916353642C12C20B00593047 /* HBMultiLanguageManager.h */, + 916353652C12C20B00593047 /* HBMultiLanguageManager.m */, + ); + path = Manager; + sourceTree = ""; + }; + 916353682C12C20B00593047 /* Sources */ = { + isa = PBXGroup; + children = ( + 916353672C12C20B00593047 /* MultiLanguage.xcstrings */, + ); + path = Sources; + sourceTree = ""; + }; + 916353692C12C20B00593047 /* MultiLanguage */ = { + isa = PBXGroup; + children = ( + 916353632C12C20B00593047 /* Controllers */, + 916353662C12C20B00593047 /* Manager */, + 916353682C12C20B00593047 /* Sources */, + ); + path = MultiLanguage; + sourceTree = ""; + }; + 916353842C12C20B00593047 /* Views */ = { + isa = PBXGroup; + children = ( + 916353762C12C20B00593047 /* HBCollectionViewCell.h */, + 916353772C12C20B00593047 /* HBCollectionViewCell.m */, + 916353782C12C20B00593047 /* HBRefreshAutoNormalFooter.h */, + 916353792C12C20B00593047 /* HBRefreshAutoNormalFooter.m */, + 9163537A2C12C20B00593047 /* HBRefreshNormalHeader.h */, + 9163537B2C12C20B00593047 /* HBRefreshNormalHeader.m */, + 9163537C2C12C20B00593047 /* HBTableView.h */, + 9163537D2C12C20B00593047 /* HBTableView.m */, + 9163537E2C12C20B00593047 /* HBTextField.h */, + 9163537F2C12C20B00593047 /* HBTextField.m */, + 916353802C12C20B00593047 /* HBView.h */, + 916353812C12C20B00593047 /* HBView.m */, + ); + path = Views; + sourceTree = ""; + }; + 916353852C12C20B00593047 /* Publics */ = { + isa = PBXGroup; + children = ( + 9163535F2C12C20B00593047 /* Defines */, + 916353562C12C20B00593047 /* CommonKeys */, + 916353692C12C20B00593047 /* MultiLanguage */, + 9163535D2C12C20B00593047 /* Controllers */, + 916353842C12C20B00593047 /* Views */, + 916353512C12C20B00593047 /* Color */, + ); + path = Publics; + sourceTree = ""; + }; + 916353A12C12C3DC00593047 /* HtyoNetWorking */ = { + isa = PBXGroup; + children = ( + 9163539F2C12C3DC00593047 /* HtyoNetWorking.h */, + 916353A02C12C3DC00593047 /* HtyoNetWorking.m */, + ); + path = HtyoNetWorking; + sourceTree = ""; + }; + 916353A32C12C4CA00593047 /* HBAlertView */ = { + isa = PBXGroup; + children = ( + 916353742C12C20B00593047 /* HBAlertView.h */, + 916353752C12C20B00593047 /* HBAlertView.m */, + ); + path = HBAlertView; + sourceTree = ""; + }; + 916353A42C12C4D900593047 /* RSButton */ = { + isa = PBXGroup; + children = ( + 916353822C12C20B00593047 /* RSButton.h */, + 916353832C12C20B00593047 /* RSButton.m */, + ); + path = RSButton; + sourceTree = ""; + }; + 916353A52C12C69900593047 /* NSNotificationCenter */ = { + isa = PBXGroup; + children = ( + 916353A62C12C6AF00593047 /* NSNotificationCenter+Extension.h */, + 916353A72C12C6AF00593047 /* NSNotificationCenter+Extension.m */, + ); + path = NSNotificationCenter; + sourceTree = ""; + }; B36329ED094310C499FEBA2F /* Frameworks */ = { isa = PBXGroup; children = ( @@ -771,6 +993,7 @@ buildActionMask = 2147483647; files = ( 9163512E2C12AFEA00593047 /* Assets.xcassets in Resources */, + 9163538E2C12C20B00593047 /* MultiLanguage.xcstrings in Resources */, 916353372C12B6D400593047 /* SVProgressHUD.bundle in Resources */, 916351312C12AFEA00593047 /* Base in Resources */, ); @@ -842,18 +1065,23 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 916353892C12C20B00593047 /* HBNavigationController.m in Sources */, 916353002C12B6D400593047 /* NSUserDefaults+Extesion.m in Sources */, 916351402C12B12F00593047 /* AppDelegate.m in Sources */, 9163530D2C12B6D400593047 /* UINavigationController+Transparent.m in Sources */, 916352FA2C12B6D400593047 /* NSNumber+Extension.m in Sources */, + 9163534D2C12C15300593047 /* HBNetWorkingUtilityResult.m in Sources */, 916353292C12B6D400593047 /* DGActivityIndicatorLineScalePulseOutRapidAnimation.m in Sources */, + 916353A22C12C3DC00593047 /* HtyoNetWorking.m in Sources */, 916353232C12B6D400593047 /* DGActivityIndicatorCookieTerminatorAnimation.m in Sources */, 9163530A2C12B6D400593047 /* NSLayoutConstraint+BSIBDesignable.m in Sources */, + 9163534C2C12C15300593047 /* HBNetWorkingUtility.m in Sources */, 916353352C12B6D400593047 /* SVIndefiniteAnimatedView.m in Sources */, 916353332C12B6D400593047 /* DGActivityIndicatorView.m in Sources */, 916353152C12B6D400593047 /* DGActivityIndicatorBallClipRotatePulseAnimation.m in Sources */, 916353132C12B6D400593047 /* DGActivityIndicatorBallClipRotateAnimation.m in Sources */, 916353322C12B6D400593047 /* DGActivityIndicatorTwoDotsAnimation.m in Sources */, + 916353862C12C20B00593047 /* HBColor.m in Sources */, 9163532B2C12B6D400593047 /* DGActivityIndicatorRotatingSandglassAnimation.m in Sources */, 916351432C12B13700593047 /* SceneDelegate.m in Sources */, 9163530E2C12B6D400593047 /* UIViewController+present.m in Sources */, @@ -861,6 +1089,7 @@ 916353262C12B6D400593047 /* DGActivityIndicatorLineScaleAnimation.m in Sources */, 916353272C12B6D400593047 /* DGActivityIndicatorLineScalePartyAnimation.m in Sources */, 916353102C12B6D400593047 /* NSString+AES.m in Sources */, + 9163538B2C12C20B00593047 /* HBViewController.m in Sources */, 9163531A2C12B6D400593047 /* DGActivityIndicatorBallRotateAnimation.m in Sources */, 916352F82C12B6D400593047 /* NSDate+Extension.m in Sources */, 916353032C12B6D400593047 /* UIDevice+Extension.m in Sources */, @@ -869,32 +1098,41 @@ 9163533A2C12B6D400593047 /* HUDManager.m in Sources */, 916353072C12B6D400593047 /* UIScreen+Extension.m in Sources */, 916353282C12B6D400593047 /* DGActivityIndicatorLineScalePulseOutAnimation.m in Sources */, + 9163534B2C12C15300593047 /* HBApiParams.m in Sources */, 9163531C2C12B6D400593047 /* DGActivityIndicatorBallScaleMultipleAnimation.m in Sources */, - 9163533E2C12B6D400593047 /* HtyoNetWorking.m in Sources */, 916353042C12B6D400593047 /* UIFont+Category.m in Sources */, 916353092C12B6D400593047 /* UITextField+Category.m in Sources */, + 916353972C12C20B00593047 /* HBTableView.m in Sources */, 916353162C12B6D400593047 /* DGActivityIndicatorBallGridBeatAnimation.m in Sources */, 916353122C12B6D400593047 /* DGActivityIndicatorBallBeatAnimation.m in Sources */, 916353202C12B6D400593047 /* DGActivityIndicatorBallTrianglePathAnimation.m in Sources */, + 916353982C12C20B00593047 /* HBTextField.m in Sources */, 916352FB2C12B6D400593047 /* NSObject+countDown.m in Sources */, 916352FC2C12B6D400593047 /* NSObject+Swizzled.m in Sources */, + 9163538D2C12C20B00593047 /* HBMultiLanguageManager.m in Sources */, 9163531F2C12B6D400593047 /* DGActivityIndicatorBallSpinFadeLoader.m in Sources */, + 9163539A2C12C20B00593047 /* RSButton.m in Sources */, 916353302C12B6D400593047 /* DGActivityIndicatorTriplePulseAnimation.m in Sources */, 916353022C12B6D400593047 /* UIControl+Extension.m in Sources */, 9163532D2C12B6D400593047 /* DGActivityIndicatorRotatingTrigonAnimation.m in Sources */, 916353342C12B6D400593047 /* MBProgressHUD.m in Sources */, 916353242C12B6D400593047 /* DGActivityIndicatorDoubleBounceAnimation.m in Sources */, + 9163538C2C12C20B00593047 /* HBMultiLanguageController.m in Sources */, 916353192C12B6D400593047 /* DGActivityIndicatorBallPulseSyncAnimation.m in Sources */, 9163532A2C12B6D400593047 /* DGActivityIndicatorNineDotsAnimation.m in Sources */, 9163533D2C12B6D400593047 /* KxMenu.m in Sources */, + 916353A82C12C6AF00593047 /* NSNotificationCenter+Extension.m in Sources */, 9163531E2C12B6D400593047 /* DGActivityIndicatorBallScaleRippleMultipleAnimation.m in Sources */, 916353362C12B6D400593047 /* SVProgressAnimatedView.m in Sources */, 916353112C12B6D400593047 /* DGActivityIndicatorAnimation.m in Sources */, 916353222C12B6D400593047 /* DGActivityIndicatorBallZigZagDeflectAnimation.m in Sources */, 9163531B2C12B6D400593047 /* DGActivityIndicatorBallScaleAnimation.m in Sources */, 916353182C12B6D400593047 /* DGActivityIndicatorBallPulseAnimation.m in Sources */, + 916353872C12C20B00593047 /* HBCommonKeys.m in Sources */, 916353052C12B6D400593047 /* UIImage+Category.m in Sources */, + 916353962C12C20B00593047 /* HBRefreshNormalHeader.m in Sources */, 916353392C12B6D400593047 /* SVRadialGradientLayer.m in Sources */, + 916353882C12C20B00593047 /* HBThirdKeys.m in Sources */, 916351342C12AFEA00593047 /* main.m in Sources */, 916353312C12B6D400593047 /* DGActivityIndicatorTripleRingsAnimation.m in Sources */, 916352FE2C12B6D400593047 /* NSString+Extension.m in Sources */, @@ -903,13 +1141,19 @@ 916353062C12B6D400593047 /* UIImageView+Extension.m in Sources */, 9163530C2C12B6D400593047 /* UIView+Frame.m in Sources */, 916353382C12B6D400593047 /* SVProgressHUD.m in Sources */, + 9163534E2C12C15300593047 /* HBNetWorkingUtility+Services.m in Sources */, 916353142C12B6D400593047 /* DGActivityIndicatorBallClipRotateMultipleAnimation.m in Sources */, + 9163538A2C12C20B00593047 /* HBTabBarController.m in Sources */, 916353172C12B6D400593047 /* DGActivityIndicatorBallGridPulseAnimation.m in Sources */, 916352FF2C12B6D400593047 /* NSString+Tools.m in Sources */, 916352F92C12B6D400593047 /* NSDictionary+Extension.m in Sources */, + 916353952C12C20B00593047 /* HBRefreshAutoNormalFooter.m in Sources */, + 916353942C12C20B00593047 /* HBCollectionViewCell.m in Sources */, 9163530B2C12B6D400593047 /* UIView+Extension.m in Sources */, 916352F62C12B6D400593047 /* FoundationContainer+Log.m in Sources */, 916353082C12B6D400593047 /* UITableView+Extension.m in Sources */, + 916353992C12C20B00593047 /* HBView.m in Sources */, + 916353932C12C20B00593047 /* HBAlertView.m in Sources */, 916352F72C12B6D400593047 /* NSData+Extension.m in Sources */, 9163532E2C12B6D400593047 /* DGActivityIndicatorThreeDotsAnimation.m in Sources */, 9163532F2C12B6D400593047 /* DGActivityIndicatorTriangleSkewSpinAnimation.m in Sources */, diff --git a/HiBit.xcworkspace/xcuserdata/loser.xcuserdatad/IDEFindNavigatorScopes.plist b/HiBit.xcworkspace/xcuserdata/loser.xcuserdatad/IDEFindNavigatorScopes.plist new file mode 100644 index 0000000..5dd5da8 --- /dev/null +++ b/HiBit.xcworkspace/xcuserdata/loser.xcuserdatad/IDEFindNavigatorScopes.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/HiBit/Basics/PrefixHeader.pch b/HiBit/Basics/PrefixHeader.pch index bdbd526..b1b5dc4 100644 --- a/HiBit/Basics/PrefixHeader.pch +++ b/HiBit/Basics/PrefixHeader.pch @@ -11,4 +11,95 @@ // Include any system framework and library headers here that should be included in all compilation units. // You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. +#import "HBDefines.h" + +// 第三方sdk的appkey +#import "HBThirdKeys.h" + +// 项目中一些常用的 string +#import "HBCommonKeys.h" + +// 多语言管理 +#import "HBMultiLanguageManager.h" + +// 布局管理 +#import + +// 网络图片 +#import + +// FaceBook登录 +#import + +// FaceBook分享 +#import + +// Google登录 +#import + +// Instagram 列表库 +#import + +// 富文本 +#import + +// 空数据 +#import + +// 分页控制器 +#import +#import +#import + +// 刷新控件 +#import + +// 数据模型转换 +#import + +// 模态底部弹出控制器 +#import + +// 吐司 +#import + +// 密码串 +#import + +// 使用Swift TikTokOpenSDKCore TikTokOpenShareSDK +#import "HiBit-Bridging-Header.h" + + +/// 分类 +#import "UIView+Frame.h" +#import "UIView+Extension.h" +#import "NSLayoutConstraint+BSIBDesignable.h" +#import "UIImage+Category.h" +#import "UIFont+Category.h" +#import "UIDevice+Extension.h" +#import "NSString+Tools.h" +#import "NSString+Extension.h" +#import "NSUserDefaults+Extesion.h" +#import "UIImageView+Extension.h" +#import "UITextField+Category.h" +#import "UIScreen+Extension.h" +#import "NSNotificationCenter+Extension.h" + + + +// 自定义控件 +#import "HBColor.h" +#import "RSButton.h" +#import "HUDManager.h" +//#import "HBNavigationController.h" +//#import "HBAlertView.h" +//#import "HBTextField.h" +//#import "HBRefreshNormalHeader.h" +//#import "HBRefreshAutoNormalFooter.h" +#import "KxMenu.h" + +//#import "GKDYPlayerViewController.h" +//#import "HBWebViewController.h" +// 数据请求 +//#import "HBNetWorkingUtility+Services.h" #endif /* PrefixHeader_pch */ diff --git a/HiBit/Project/Publics/Color/HBColor.h b/HiBit/Project/Publics/Color/HBColor.h new file mode 100644 index 0000000..52f605d --- /dev/null +++ b/HiBit/Project/Publics/Color/HBColor.h @@ -0,0 +1,26 @@ +// +// HBColor.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/6/1. +// + +#import +#import "UIColor+Category.h" +NS_ASSUME_NONNULL_BEGIN + +@interface HBColor : UIColor ++ (UIColor *)color_080B16; ++ (UIColor *)color_FF0049; ++ (UIColor *)color_272A30; ++ (UIColor *)color_999999; ++ (UIColor *)color_21242E; ++ (UIColor *)color_1973E9; ++ (UIColor *)color_FF6600; ++ (UIColor *)color_D5D5D5; ++ (UIColor *)color_22242D; ++ (UIColor *)color_FFE8C3; ++ (UIColor *)color_separator; +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/Color/HBColor.m b/HiBit/Project/Publics/Color/HBColor.m new file mode 100644 index 0000000..4fee133 --- /dev/null +++ b/HiBit/Project/Publics/Color/HBColor.m @@ -0,0 +1,53 @@ +// +// HBColor.m +// QinJiuTV +// +// Created by HI_LOSER on 2024/6/1. +// + +#import "HBColor.h" + +@implementation HBColor ++ (UIColor *)color_080B16{ + return [UIColor colorWithHexString:@"#080B16"]; +} + ++ (UIColor *)color_FF0049{ + return [UIColor colorWithHexString:@"#FF0049"]; +} + ++ (UIColor *)color_272A30 { + return [UIColor colorWithHexString:@"#272A30"]; +} + ++ (UIColor *)color_999999 { + return [UIColor colorWithHexString:@"#999999"]; +} + ++ (UIColor *)color_21242E { + return [UIColor colorWithHexString:@"#21242E"]; +} + ++ (UIColor *)color_1973E9 { + return [UIColor colorWithHexString:@"#1973E9"]; +} + ++ (UIColor *)color_FF6600 { + return [UIColor colorWithHexString:@"#FF6600"]; +} + ++ (UIColor *)color_D5D5D5 { + return [UIColor colorWithHexString:@"#D5D5D5"]; +} + ++ (UIColor *)color_22242D { + return [UIColor colorWithHexString:@"#22242D"]; +} + ++ (UIColor *)color_FFE8C3 { + return [UIColor colorWithHexString:@"#FFE8C3"]; +} ++ (UIColor *)color_separator { + return [UIColor colorWithRed:75.0/255.0 green:77.0/255.0 blue:80.0/255.0 alpha:1.0]; +} +@end diff --git a/HiBit/Project/Publics/CommonKeys/HBCommonKeys.h b/HiBit/Project/Publics/CommonKeys/HBCommonKeys.h new file mode 100644 index 0000000..866d88f --- /dev/null +++ b/HiBit/Project/Publics/CommonKeys/HBCommonKeys.h @@ -0,0 +1,40 @@ +// +// HBCommonKeys.h +// QinJiuTV +// +// Created by 秦九 on 2024/4/30. +// + +#import + +/// 网络请求地址 +extern NSString *const HBBaseUrlString; + +/// 保存设备唯一值key +extern NSString *const HBIdentifierForVendorKey; + +/// 用来保存用户是不是主动登录成功了,可以用来判断是否登录 +extern NSString *const HBCustomerLoginSuccessKey; + +/// 保存网络请求的Token +extern NSString *const HBNetWorkingTokenKey; + +/// 保存网络请求的Token +extern NSString *const HBCustomerIdKey; + +/// 搜索历史key +extern NSString *const HBSearchHistoryKey; + +/// 播放界面离开 通知播放器暂停 +extern NSString *const HBPlayerPuaseKey; + +/// 推送详情使用 +extern NSString *const HBNotificationOpenActionIdentifier; +extern NSString *const HBNotificationOpenCategoryIdentifier; + +/// 第一次启动存储 +extern NSString *const HBNotFirstStartKey; + +/// 通知 +FOUNDATION_EXPORT NSNotificationName _Nonnull const HBUpdateUserInfoNotification; + diff --git a/HiBit/Project/Publics/CommonKeys/HBCommonKeys.m b/HiBit/Project/Publics/CommonKeys/HBCommonKeys.m new file mode 100644 index 0000000..d8eec39 --- /dev/null +++ b/HiBit/Project/Publics/CommonKeys/HBCommonKeys.m @@ -0,0 +1,32 @@ +// +// HBCommonKeys.m +// QinJiuTV +// +// Created by 秦九 on 2024/4/30. +// + +#import "HBCommonKeys.h" + +/// 网络请求地址 +NSString *const HBBaseUrlString = @"https://hongkongapi.peonytv.com"; + +NSString *const HBIdentifierForVendorKey = @"HBIdentifierForVendorKey"; + +NSString *const HBNetWorkingTokenKey = @"HBNetWorkingTokenKey"; + +NSString *const HBCustomerLoginSuccessKey = @"HBCustomerLoginSuccessKey"; + +NSString *const HBCustomerIdKey = @"HBCustomerIdKey"; + +NSString *const HBSearchHistoryKey = @"HBSearchHistoryKey"; + +NSString *const HBPlayerPuaseKey = @"HBPlayerPuaseKey"; + + +NSString *const HBNotificationOpenActionIdentifier = @"HBNotificationOpenActionIdentifier"; +NSString *const HBNotificationOpenCategoryIdentifier = @"HBNotificationOpenCategoryIdentifier"; + +NSString *const HBUpdateUserInfoNotification = @"HBUpdateUserInfoNotification"; + + +NSString *const HBNotFirstStartKey = @"HBNotFirstStartKey"; diff --git a/HiBit/Project/Publics/CommonKeys/HBThirdKeys.h b/HiBit/Project/Publics/CommonKeys/HBThirdKeys.h new file mode 100644 index 0000000..6de8d88 --- /dev/null +++ b/HiBit/Project/Publics/CommonKeys/HBThirdKeys.h @@ -0,0 +1,20 @@ +// +// HBThirdKeys.h +// QinJiuTV +// +// Created by 秦九 on 2024/4/29. +// + +#import + +/// appsflyer dev key +extern NSString *const HBAppsFlyerDevKey; + +/// appsflyer app id +extern NSString *const HBAppsFlyerAppID; + +/// applovin key +extern NSString *const HBAppLovinKey; + +/// Panlge app id +extern NSString *const HBPangleID; diff --git a/HiBit/Project/Publics/CommonKeys/HBThirdKeys.m b/HiBit/Project/Publics/CommonKeys/HBThirdKeys.m new file mode 100644 index 0000000..13b1980 --- /dev/null +++ b/HiBit/Project/Publics/CommonKeys/HBThirdKeys.m @@ -0,0 +1,20 @@ +// +// HBThirdKeys.m +// QinJiuTV +// +// Created by 秦九 on 2024/4/29. +// + +#import "HBThirdKeys.h" + +/// appsflyer dev key +NSString *const HBAppsFlyerDevKey = @"axv4xFtouhau4js4GxqBX9"; + +/// appsflyer app id +NSString *const HBAppsFlyerAppID = @"8377862"; + +/// applovin key +NSString *const HBAppLovinKey = @"XW2aulJv9urKD4MIIFT1xcSCuyTHaDZ9qUbDqygnTLS04GkdX7WMHBviGP5vDRWGsk4OJJIyLGRV3mbLqOWx0W"; + +/// Panlge app id +NSString *const HBPangleID = @"8377862"; diff --git a/HiBit/Project/Publics/Controllers/HBNavigationController.h b/HiBit/Project/Publics/Controllers/HBNavigationController.h new file mode 100644 index 0000000..3a3d054 --- /dev/null +++ b/HiBit/Project/Publics/Controllers/HBNavigationController.h @@ -0,0 +1,17 @@ +// +// HBNavigationController.h +// QinJiuTV +// +// Created by 秦九 on 2024/4/28. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface HBNavigationController : HBDNavigationController + +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/Controllers/HBNavigationController.m b/HiBit/Project/Publics/Controllers/HBNavigationController.m new file mode 100644 index 0000000..c6e13b0 --- /dev/null +++ b/HiBit/Project/Publics/Controllers/HBNavigationController.m @@ -0,0 +1,42 @@ +// +// HBNavigationController.m +// QinJiuTV +// +// Created by 秦九 on 2024/4/28. +// + +#import "HBNavigationController.h" + +@interface HBNavigationController () + +@end + +@implementation HBNavigationController + +- (void)viewDidLoad { + [super viewDidLoad]; +// if(@available(iOS 15.0, *)) { +// UINavigationBarAppearance * appearnce = [UINavigationBarAppearance new]; +//// [appearnce configureWithDefaultBackground]; +// self.navigationBar.standardAppearance = appearnce; +// self.navigationBar.scrollEdgeAppearance = self.navigationBar.standardAppearance; +// } +} + +- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { + + if (self.viewControllers.count > 0) { + viewController.hidesBottomBarWhenPushed = YES; + NSString * navigation_btn_back = @"publics_navigationBar_back"; + UIBarButtonItem *leftBtn = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed: navigation_btn_back + renderingMode:UIImageRenderingModeAlwaysOriginal] + style:UIBarButtonItemStylePlain + target:viewController + action:@selector(backController:)]; + viewController.navigationItem.leftBarButtonItem = leftBtn; + + } + [super pushViewController:viewController animated:animated]; +} + +@end diff --git a/HiBit/Project/Publics/Controllers/HBTabBarController.h b/HiBit/Project/Publics/Controllers/HBTabBarController.h new file mode 100644 index 0000000..6eaec65 --- /dev/null +++ b/HiBit/Project/Publics/Controllers/HBTabBarController.h @@ -0,0 +1,16 @@ +// +// HBTabBarController.h +// QinJiuTV +// +// Created by 秦九 on 2024/4/28. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface HBTabBarController : UITabBarController + +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/Controllers/HBTabBarController.m b/HiBit/Project/Publics/Controllers/HBTabBarController.m new file mode 100644 index 0000000..f292601 --- /dev/null +++ b/HiBit/Project/Publics/Controllers/HBTabBarController.m @@ -0,0 +1,97 @@ +// +// HBTabBarController.m +// QinJiuTV +// +// Created by 秦九 on 2024/4/28. +// + +#import "HBTabBarController.h" +#import "HBNavigationController.h" +//#import "HBHomeViewController.h" +//#import "HBDiscoverController.h" +//#import "HBVideosController.h" +//#import "HBMineController.h" + +//#import "GKDYPlayerViewController.h" + +@interface HBTabBarController () + +@end + +@implementation HBTabBarController + +- (void)viewDidLoad { + [super viewDidLoad]; + [self loadTabbar]; + [self loadSubControllers]; +} + +- (void)loadTabbar { + UIColor * tabbarBackgroundColor = UIColor.blackColor; + if (@available (iOS 15.0, *)) { + // iOS 15.0 及以上 + UITabBarAppearance *appearance = [[UITabBarAppearance alloc] init]; + [appearance configureWithOpaqueBackground]; + appearance.backgroundColor = tabbarBackgroundColor; + + self.tabBar.standardAppearance = appearance; + self.tabBar.scrollEdgeAppearance = self.tabBar.standardAppearance; + } else { + + self.tabBar.barTintColor = tabbarBackgroundColor; + } + self.tabBar.tintColor = HBColor.color_FF0049; + self.tabBar.unselectedItemTintColor = HBColor.color_999999; + +} + +- (void)loadSubControllers { +// HBHomeViewController * homeController = [[HBHomeViewController alloc]init]; +// +// [self addChildViewController:homeController +// title:[@"tabbar_home" language] +// image:[UIImage imageNamed:@"tabbar_home_normal" renderingMode:UIImageRenderingModeAlwaysOriginal] +// selectedImage:[UIImage imageNamed:@"tabbar_home_selected" renderingMode:UIImageRenderingModeAlwaysOriginal]]; +// +//// HBDiscoverController * discoverController = [[HBDiscoverController alloc]init]; +//// GKZFPlayerViewController * discoverController = [[GKZFPlayerViewController alloc]init]; +//// discoverController.details = NO; +// +// GKDYPlayerViewController * discoverController = [[GKDYPlayerViewController alloc]init]; +// +// [self addChildViewController:discoverController +// title:[@"tabbar_discover" language] +// image:[UIImage imageNamed:@"tabbar_discover_normal" renderingMode:UIImageRenderingModeAlwaysOriginal] +// selectedImage:[UIImage imageNamed:@"tabbar_discover_selected" renderingMode:UIImageRenderingModeAlwaysOriginal]]; +// +// HBVideosController * videosController = [[HBVideosController alloc]init]; +// +// [self addChildViewController:videosController +// title:[@"tabbar_videos" language] +// image:[UIImage imageNamed:@"tabbar_discover_normal" renderingMode:UIImageRenderingModeAlwaysOriginal] +// selectedImage:[UIImage imageNamed:@"tabbar_discover_selected" renderingMode:UIImageRenderingModeAlwaysOriginal]]; +// +// HBMineController * mineController = [[HBMineController alloc]init]; +// +// +// [self addChildViewController:mineController +// title:[@"tabbar_mine" language] +// image:[UIImage imageNamed:@"tabbar_mine_normal" renderingMode:UIImageRenderingModeAlwaysOriginal] +// selectedImage:[UIImage imageNamed:@"tabbar_mine_selected" renderingMode:UIImageRenderingModeAlwaysOriginal]]; +// +// + +} + +- (void)addChildViewController:(UIViewController *)childController title:(NSString *)title image:(UIImage *)image selectedImage:(UIImage *)selectedImage { + childController.tabBarItem.title = title; + [childController.tabBarItem setImage:image]; + [childController.tabBarItem setSelectedImage:selectedImage]; + + HBNavigationController * navigationController = [[HBNavigationController alloc]initWithRootViewController:childController]; + + + [self addChildViewController:navigationController]; +} + +@end diff --git a/HiBit/Project/Publics/Controllers/HBViewController.h b/HiBit/Project/Publics/Controllers/HBViewController.h new file mode 100644 index 0000000..de81234 --- /dev/null +++ b/HiBit/Project/Publics/Controllers/HBViewController.h @@ -0,0 +1,21 @@ +// +// HBViewController.h +// QinJiuTV +// +// Created by 秦九 on 2024/4/28. +// + +#import +#import +#import +#import +NS_ASSUME_NONNULL_BEGIN + +@interface HBViewController : UIViewController +@property (assign, nonatomic) BOOL presentNavigation; + +- (void)backController:(UIButton * _Nullable)sender; + +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/Controllers/HBViewController.m b/HiBit/Project/Publics/Controllers/HBViewController.m new file mode 100644 index 0000000..a651d4d --- /dev/null +++ b/HiBit/Project/Publics/Controllers/HBViewController.m @@ -0,0 +1,49 @@ +// +// HBViewController.m +// QinJiuTV +// +// Created by 秦九 on 2024/4/28. +// + +#import "HBViewController.h" + +@interface HBViewController () + +@end + +@implementation HBViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.hbd_barTintColor = HBColor.color_080B16; + self.view.backgroundColor = HBColor.color_080B16; + self.hbd_titleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:UIColor.whiteColor,NSForegroundColorAttributeName, nil]; + + if (self.presentNavigation) { + NSString * navigation_btn_back = @"publics_navigationBar_back"; + UIBarButtonItem *leftBtn = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed: navigation_btn_back + renderingMode:UIImageRenderingModeAlwaysOriginal] + style:UIBarButtonItemStylePlain + target:self + action:@selector(backController:)]; + self.navigationItem.leftBarButtonItem = leftBtn; + } +} + +- (void)backController:(UIButton * _Nullable)sender { + if (self.presentNavigation) { + [self dismissViewControllerAnimated:YES completion:nil]; + } else { + [self.navigationController popViewControllerAnimated :YES]; + } +} +- (void)dealloc{ + NSLog(@"%@ dealloc",self.class); + [[NSNotificationCenter defaultCenter]removeObserver:self]; +} + +- (void)didReceiveMemoryWarning { + NSLog(@"%@ didReceiveMemoryWarning",self.class); +} + +@end diff --git a/HiBit/Project/Publics/Defines/HBDefines.h b/HiBit/Project/Publics/Defines/HBDefines.h new file mode 100644 index 0000000..cc6e2ee --- /dev/null +++ b/HiBit/Project/Publics/Defines/HBDefines.h @@ -0,0 +1,19 @@ +// +// HBDefines.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/6. +// + +#ifndef HBDefines_h +#define HBDefines_h + +#define HBWeakSelf __weak typeof(self) weakSelf = self; +#define HBScreenSize [[UIScreen mainScreen] bounds].size +#define HBStatusBarHeight [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height +#define HBNavBarHeiht (HBStatusBarHeight + 44) +#define HBAdapt(floatValue) (floatValue*[[UIScreen mainScreen] bounds].size.width/375.0) +//#define HBDispatchAsyncOnMainQueue(x) __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ typeof(weakSelf) self = weakSelf; {x}}); + + +#endif /* HBDefaults_h */ diff --git a/HiBit/Project/Publics/MultiLanguage/Controllers/HBMultiLanguageController.h b/HiBit/Project/Publics/MultiLanguage/Controllers/HBMultiLanguageController.h new file mode 100644 index 0000000..97f94d2 --- /dev/null +++ b/HiBit/Project/Publics/MultiLanguage/Controllers/HBMultiLanguageController.h @@ -0,0 +1,22 @@ +// +// HBMultiLanguageController.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/6. +// + +#import "HBViewController.h" + + + +NS_ASSUME_NONNULL_BEGIN + +@interface HBMultiLanguageController : HBViewController +@property (strong, nonatomic) NSArray * models; +@end + +@interface HBMultiLanguageCollectionViewCell : UICollectionViewCell +@property (strong, nonatomic) HBLanguageModel * model; +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/MultiLanguage/Controllers/HBMultiLanguageController.m b/HiBit/Project/Publics/MultiLanguage/Controllers/HBMultiLanguageController.m new file mode 100644 index 0000000..b43e70a --- /dev/null +++ b/HiBit/Project/Publics/MultiLanguage/Controllers/HBMultiLanguageController.m @@ -0,0 +1,246 @@ +// +// HBMultiLanguageController.m +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/6. +// + +#import "HBMultiLanguageController.h" + +@interface HBMultiLanguageController () +@property (weak, nonatomic) RSButton * sysButton; +@property (weak, nonatomic) UICollectionView * collectionView; +@property (strong, nonatomic) NSString * abbr; +@end + +@implementation HBMultiLanguageController + +-(NSArray *)models { + if (!_models) { + _models = [HBMultiLanguageManager languages]; + } + return _models; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + [self loadNavigationBar]; + [self loadSubViews]; +} + +- (void)loadNavigationBar { + self.navigationItem.title = [@"mine_title_language" language]; +} + +-(void)loadSubViews { + UIButton * doneButton = [[UIButton alloc]init]; + [doneButton acs_radiusWithRadius:21.0 corner:UIRectCornerAllCorners]; + doneButton.layer.masksToBounds = YES; + [doneButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; + [doneButton setTitle:[@"common_button_ok" language] forState:UIControlStateNormal]; + [doneButton setBackgroundImage:[UIImage imageNamed:@"publics_gradient"] forState:UIControlStateNormal]; + [doneButton addTarget:self action:@selector(doneAction) forControlEvents:UIControlEventTouchUpInside]; + [self.view addSubview:doneButton]; + + UIView * sysView = [[UIView alloc]init]; + [sysView acs_radiusWithRadius:10.0 corner:UIRectCornerAllCorners]; + sysView.backgroundColor = HBColor.color_FF0049; + [sysView addTapGestureRecognizerWithTarget:self action:@selector(systemAction)]; + [self.view addSubview:sysView]; + + RSButton * sysButton = [[RSButton alloc]initWithType:RSButtonTypeAbove]; + sysButton.selected = [HBMultiLanguageManager isSystem]; + sysButton.margin = 4.0; + sysButton.insets = UIEdgeInsetsMake(0, 4.0, 0, 4.0); + [sysButton setTitleFont:[UIFont systemFontOfSize:12.0 weight:UIFontWeightSemibold]]; + [sysButton setTitle:[@"language_text_system" language] forState:UIControlStateNormal]; + [sysButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; + [sysButton setImage:[UIImage imageNamed:@"language_select_normal"] forState:UIControlStateNormal]; + [sysButton setImage:[UIImage imageNamed:@"language_select_selected"] forState:UIControlStateSelected]; + [sysButton addTarget:self action:@selector(systemAction) forControlEvents:UIControlEventTouchUpInside]; + [sysView addSubview:sysButton]; + self.sysButton = sysButton; + + UILabel * sysDetailTextLabel = [[UILabel alloc]init]; + sysDetailTextLabel.text = [@"language_text_system_tip" language]; + sysDetailTextLabel.font = [UIFont systemFontOfSize:12.0 weight:UIFontWeightRegular]; + sysDetailTextLabel.textColor = UIColor.whiteColor; + sysDetailTextLabel.numberOfLines = 0; + [sysView addSubview:sysDetailTextLabel]; + + + CGFloat width = (self.view.width - 42.0) * 0.5; + UICollectionViewFlowLayout * flowLayout = [[UICollectionViewFlowLayout alloc]init]; + flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical; + flowLayout.minimumLineSpacing = 10.0; + flowLayout.itemSize = CGSizeMake(width, width); + + UICollectionView * collectionView = [[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:flowLayout]; + collectionView.backgroundColor = HBColor.color_080B16; + [collectionView registerClass:HBMultiLanguageCollectionViewCell.class forCellWithReuseIdentifier:@"HBMultiLanguageCollectionViewCell"]; + collectionView.delegate = self; + collectionView.dataSource = self; + [self.view addSubview:collectionView]; + self.collectionView = collectionView; + + [sysView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.top.offset(16.0); + make.right.offset(-16.0); + make.height.offset(71.0); + }]; + + [sysButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.centerY.equalTo(sysView); + make.width.offset(80.0); + }]; + + [sysDetailTextLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(sysButton.mas_right); + make.top.offset(10.0); + make.right.offset(-12.0); + make.bottom.offset(-10.0); + }]; + + + [doneButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.offset(16.0); + make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom).offset(-20.0); + make.right.offset(-16.0); + make.height.offset(42.0); + }]; + + [collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.offset(16.0); + make.right.offset(-16.0); + make.top.equalTo(sysView.mas_bottom).offset(20.0); + make.bottom.equalTo(doneButton.mas_top).offset(-20.0); + }]; + +} + +#pragma mark UICollectionViewDelegate +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + self.sysButton.selected = NO; + self.abbr = self.models[indexPath.row].abbr; +} + +#pragma mark UICollectionViewDataSource +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.models.count; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + HBMultiLanguageCollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"HBMultiLanguageCollectionViewCell" forIndexPath:indexPath]; + cell.model = self.models[indexPath.row]; + if (cell.model.selected) { + [collectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:UICollectionViewScrollPositionNone]; + } + return cell; +} +#pragma mark Action +- (void)systemAction { + + if (!self.sysButton.selected) { // 防止重复点击 + self.abbr = @"--"; // @"--" 表示跟随系统 + self.sysButton.selected = YES; + [self.collectionView deselectItemAtIndexPath:self.collectionView.indexPathsForSelectedItems.firstObject animated:YES]; + } +} + +- (void)doneAction { + [HBMultiLanguageManager saveCurrentLanguageAbbr:self.abbr]; +} + +@end + + +@interface HBMultiLanguageCollectionViewCell() +@property (weak, nonatomic) UIButton * button; +@property (weak, nonatomic) UIImageView * imageView; +@property (weak, nonatomic) UILabel * titleLabel; +@property (weak, nonatomic) UILabel * subTitleLabel; +@end + +@implementation HBMultiLanguageCollectionViewCell + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + self.layer.borderWidth = 1.0; + self.layer.borderColor = HBColor.color_272A30.CGColor; + self.backgroundColor = HBColor.color_272A30; + [self acs_radiusWithRadius:10.0 corner:UIRectCornerAllCorners]; + [self loadSubViews]; + } + return self; +} + +- (void)loadSubViews { + UIButton * button = [[UIButton alloc]init]; + [button setImage:[UIImage imageNamed:@"publics_select_button_normal"] forState:UIControlStateNormal]; + [button setImage:[UIImage imageNamed:@"publics_select_button_selected"] forState:UIControlStateSelected]; + [self addSubview:button]; + self.button = button; + + UIImageView * imageView = [[UIImageView alloc] init]; + imageView.hidden = YES; + imageView.image = [UIImage imageNamed:@"language_country_zh"]; + [self addSubview:imageView]; + self.imageView = imageView; + + UILabel * titleLabel = [[UILabel alloc]init]; + titleLabel.text = @"中文"; + titleLabel.textColor = UIColor.whiteColor; + titleLabel.font = [UIFont systemFontOfSize:14.0 weight:UIFontWeightRegular]; + [self addSubview:titleLabel]; + self.titleLabel = titleLabel; + + UILabel * subTitleLabel = [[UILabel alloc]init]; + subTitleLabel.numberOfLines = 0; + subTitleLabel.text = @"选择语言后,您的系统将会切换成中文"; + subTitleLabel.textAlignment = NSTextAlignmentCenter; + subTitleLabel.textColor = UIColor.whiteColor; + subTitleLabel.font = [UIFont systemFontOfSize:14.0 weight:UIFontWeightRegular]; + [self addSubview:subTitleLabel]; + self.subTitleLabel = subTitleLabel; + + [button mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.top.offset(8.0); + }]; + + [subTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.offset(8.0); + make.right.offset(-8.0); + make.bottom.offset(-18.0); + make.top.equalTo(titleLabel.mas_bottom).offset(6.0); + }]; + + [imageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.offset(25.0); + make.centerX.equalTo(self); + }]; + + [titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.equalTo(self); + make.top.equalTo(imageView.mas_bottom).offset(6.0); + }]; +} +-(void)setModel:(HBLanguageModel *)model{ + _model = model; + self.imageView.image = [UIImage imageNamed:model.imageNamed]; + self.titleLabel.text = model.title; + self.subTitleLabel.text = model.subTitle; +} +-(void)setSelected:(BOOL)selected { + self.button.selected = selected; + if (selected) { + self.layer.borderColor = HBColor.color_FF0049.CGColor; + self.backgroundColor = [HBColor.color_FF0049 alpha:0.2]; + } else { + self.layer.borderColor = HBColor.color_272A30.CGColor; + self.backgroundColor = HBColor.color_272A30; + } +} + + +@end diff --git a/HiBit/Project/Publics/MultiLanguage/Manager/HBMultiLanguageManager.h b/HiBit/Project/Publics/MultiLanguage/Manager/HBMultiLanguageManager.h new file mode 100644 index 0000000..a94d11e --- /dev/null +++ b/HiBit/Project/Publics/MultiLanguage/Manager/HBMultiLanguageManager.h @@ -0,0 +1,74 @@ +// +// HBMultiLanguageManager.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/6. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + + +/* + -- 跟随系统 + zh-Hans 简体中文 + en English + zh-Hans-HK 繁体中文 + ko 韩文 + */ + +/// 多语言 userdefine key +extern NSString *const HBMultiLanguageKey; + +/// 多语言 查询系统首选语言 key +extern NSString *const HBLocaleLanguageKey; + +/// 多语言发发现切换使用通知的key +extern NSString *const HBNotificationMultiLanguageChangeKey; + + + + +@interface HBLanguageModel : NSObject + +/// 语言展示的标题 +@property (copy, nonatomic) NSString * title; + +/// 语言文件名 或 英文简写 +@property (copy, nonatomic) NSString * abbr; + +/// 国旗名 +@property (copy, nonatomic) NSString * imageNamed; + +/// 描述 +@property (copy, nonatomic) NSString * subTitle; + +/// 当前选中 +@property (assign, nonatomic) BOOL selected; + + + ++ (HBLanguageModel *) newWithTitle:(NSString *) title subTitle:(NSString *)subTitle abbr:(NSString *) abbr imageNamed:(NSString *)imageNamed; +@end + +@interface HBMultiLanguageManager : NSObject + +/// 获取当前使用的语言设置 +/// 只给外部使用 ++ (NSString *)abbr; ++ (BOOL)isSystem; + +/// 保存当前选的语言 ++ (void)saveCurrentLanguageAbbr:(NSString *)language; + +/// 获取当前可以展示的语言列表 ++ (NSArray *)languages; + +@end + +@interface NSString (language) +- (NSString *)language; +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/MultiLanguage/Manager/HBMultiLanguageManager.m b/HiBit/Project/Publics/MultiLanguage/Manager/HBMultiLanguageManager.m new file mode 100644 index 0000000..c9c57c0 --- /dev/null +++ b/HiBit/Project/Publics/MultiLanguage/Manager/HBMultiLanguageManager.m @@ -0,0 +1,168 @@ +// +// HBMultiLanguageManager.m +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/6. +// + +#import "HBMultiLanguageManager.h" + +/// 多语言 userdefine key +NSString *const HBMultiLanguageKey = @"HB_language"; + +NSString *const HBLocaleLanguageKey = @"AppleLanguages"; + +NSString *const HBNotificationMultiLanguageChangeKey = @"HB_language_change_key"; + + + +@implementation HBLanguageModel ++ (HBLanguageModel *) newWithTitle:(NSString *) title subTitle:(NSString *)subTitle abbr:(NSString *) abbr imageNamed:(NSString *)imageNamed{ + HBLanguageModel * model = [[HBLanguageModel alloc]init]; + model.title = title; + model.abbr = abbr; + model.imageNamed = imageNamed; + model.subTitle = subTitle; + return model; +} + +-(BOOL)selected{ + return [self.abbr isEqualToString:[NSUserDefaults stringForKey:HBMultiLanguageKey]]; +} + +@end + + + +@implementation HBMultiLanguageManager + ++ (NSString *)abbr{ + NSString * abbr = [self currentlanguageAbbr]; + if ([abbr isEqualToString:@"--"]) { + NSString * localAbbr = [NSUserDefaults arrayForKey:HBLocaleLanguageKey].firstObject; + NSString *countryCode = [NSString stringWithFormat:@"-%@", [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]]; + if (localAbbr) { + localAbbr = [localAbbr stringByReplacingOccurrencesOfString:countryCode withString:@""]; + } + return localAbbr; + } + return abbr; +} + ++ (BOOL)isSystem { + NSString * abbr = [self currentlanguageAbbr]; + return [abbr isEqualToString:@"--"]; +} + ++ (NSString *)currentlanguageAbbr{ + NSString * abbr = [NSUserDefaults stringForKey:HBMultiLanguageKey]; + if (!abbr) { + abbr = @"--"; + [self saveCurrentLanguageAbbr:abbr]; + } + return abbr; +} + ++ (void)saveCurrentLanguageAbbr:(NSString *)abbr { + NSString * oldAbbr = [NSUserDefaults stringForKey:HBMultiLanguageKey]; + if ([oldAbbr isEqualToString:abbr]) return; + +// [NSUserDefaults setObject:abbr forKey:HBLocaleLanguageKey]; + [NSUserDefaults setObject:abbr forKey:HBMultiLanguageKey]; + [NSUserDefaults synchronize]; + [[NSNotificationCenter defaultCenter]postNotificationName:HBNotificationMultiLanguageChangeKey object:nil]; +} + + ++(NSArray *)languages{ + return @[ + [HBLanguageModel newWithTitle:@"中文" subTitle:@"选择语言后,您的系统将会切换成中文" abbr:@"zh" imageNamed:@"language_country_zh"], + [HBLanguageModel newWithTitle:@"English" subTitle:@"After selecting the language, your system will switch to English" abbr:@"en" imageNamed:@"language_country_en"], + [HBLanguageModel newWithTitle:@"Tiếng Việt" subTitle:@"Sau khi chọn ngôn ngữ, hệ thống của bạn sẽ chuyển sang tiếng việt" abbr:@"vi" imageNamed:@"language_country_vi"], + [HBLanguageModel newWithTitle:@"한국어" subTitle:@"언어를 선택하면 시스템이 한국어로 전환됩니다" abbr:@"ko" imageNamed:@"language_country_ko"], + [HBLanguageModel newWithTitle:@"日本語" subTitle:@"言語をせんたく選択すると、システムはにっぽん日本ご語にきりかわり切り替わります" abbr:@"ja" imageNamed:@"language_country_ja"] + ]; +} +@end + + +@implementation NSString (language) +- (NSString *)language { + return NSLocalizedStringFromTable(self, @"MultiLanguage",nil); +} + +//- (NSString *)language { +// +// NSString * abbr = [HBMultiLanguageManager currentlanguageAbbr]; +// +// NSString * localAbbr = [NSUserDefaults arrayForKey:HBLocaleLanguageKey].firstObject; +// +// NSString *countryCode = [NSString stringWithFormat:@"-%@", [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]]; +// if (localAbbr) { +// localAbbr = [localAbbr stringByReplacingOccurrencesOfString:countryCode withString:@""]; +// } +// +// if ([abbr isEqualToString:@"--"]) { +// return [self bundleWithAbbr:localAbbr]; +// } else { +// return [self bundleWithAbbr:abbr]; +// } +//} +// +//- (NSBundle *) bundleWithAbbr:(NSString *) abbr { +// return [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:abbr ofType:@"lproj"]]; +//} +// +//- (NSString *)languageWithBundle:(NSBundle *) bundle { +// if (bundle) { +// return NSLocalizedStringFromTableInBundle(self, @"MultiLanguage", bundle, ni); +// } else { +// return NSLocalizedStringFromTable(self, @"MultiLanguage",nil); +// } +//} +@end + + +@interface HBBundle : NSBundle + +@end + + +@implementation HBBundle + +- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName { + if ([HBBundle bundle]) { + return [[HBBundle bundle] localizedStringForKey:key value:value table:tableName]; + } else { + return [super localizedStringForKey:key value:value table:tableName]; + } +} + ++ (NSBundle *)bundle { + NSString * abbr = [HBMultiLanguageManager currentlanguageAbbr]; + NSString * localAbbr = [NSUserDefaults arrayForKey:HBLocaleLanguageKey].firstObject; + NSString *countryCode = [NSString stringWithFormat:@"-%@", [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]]; + if (localAbbr) { + localAbbr = [localAbbr stringByReplacingOccurrencesOfString:countryCode withString:@""]; + } + if ([abbr isEqualToString:@"--"]) { + return [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:localAbbr ofType:@"lproj"]]; + } else { + return [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:abbr ofType:@"lproj"]];; + } +} +@end + +@implementation NSBundle (Language) ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // 动态继承、交换,方法类似KVO,通过修改[NSBundle mainBundle]对象的isa指针,使其指向它的子类CLBundle, + // 这样便可以调用子类的方法;其实这里也可以使用method_swizzling来交换mainBundle的实现,来动态判断,可以同样实现。 + object_setClass([NSBundle mainBundle], [HBBundle class]); + }); +} + +@end + + diff --git a/HiBit/Project/Publics/MultiLanguage/Sources/MultiLanguage.xcstrings b/HiBit/Project/Publics/MultiLanguage/Sources/MultiLanguage.xcstrings new file mode 100644 index 0000000..5552fc7 --- /dev/null +++ b/HiBit/Project/Publics/MultiLanguage/Sources/MultiLanguage.xcstrings @@ -0,0 +1,2001 @@ +{ + "sourceLanguage" : "zh-Hans", + "strings" : { + "alert_setting_message_logout" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Are you sure you want to log out?" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "本当にログインを終了しますか?" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "로그인을 종료하시겠습니까?" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn có chắc là bạn muốn đăng xuất không?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "您确定是要退出登录吗?" + } + } + } + }, + "alert_setting_message_signout" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Are you sure you want to cancel your account?" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "本当にアカウントをログアウトしますか?" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계정을 로그아웃하시겠습니까?" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn có chắc là muốn hủy tài khoản không?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "您确定是要注销账号吗?" + } + } + } + }, + "alter_cancel" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancel" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "キャンセル" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "취소" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hủy bỏ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "取消" + } + } + } + }, + "alter_confirm" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confirm" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "確認" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "확인" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xác nhận" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确认" + } + } + } + }, + "commom_highlight_agreement" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "《User Agreement》" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "「ユーザープロトコル」" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "< 사용자협의 >" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'Giao thức người dùng'" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "《用户协议》" + } + } + } + }, + "commom_highlight_children" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "《Child Personal Information Protection Rules》" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "「子供の個人情報保護ルール」" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "<아동 개인 정보 보호 규칙>" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'Quy tắc bảo vệ thông tin cá nhân của trẻ em'" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "《儿童个人信息保护规则》" + } + } + } + }, + "commom_highlight_privacy" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "《Privacy Policy》" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "「プライバシーポリシー」" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "< 프라이버시정책 >" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'Thỏa thuận người dùng'" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "《隐私政策》" + } + } + } + }, + "commom_highlight_teenager" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "《Youth Civilization Convention》" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "「青少年文明公約」" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "<청소년 문명 협약>" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'Hiệp ước văn minh thanh thiếu niên'" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "《青少年文明公约》" + } + } + } + }, + "commom_highlight_third" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "《List of Third-Party Sharing of Personal Information》" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "「個人情報第三者共有リスト」" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "<개인 정보 제3자 공유 목록>" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'Danh sách chia sẻ thông tin cá nhân với bên thứ ba'" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "《个人信息第三方共享清单》" + } + } + } + }, + "commom_highlight_user" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "《Explicit List of Personal Information Collection》" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "「個人情報収集明示リスト」" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "<개인 정보 수집 명시 목록>" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'Danh sách thông tin cá nhân được thu thập'" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "《收集个人信息明示清单》" + } + } + } + }, + "commom_text_subscribe" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Subscribe" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "購読" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "가입" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đăng ký" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "订阅" + } + } + } + }, + "common_button_more" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "More" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "詳細" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "추가" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thêm" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "更多" + } + } + } + }, + "common_button_ok" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确认" + } + } + } + }, + "first_start_close" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Close" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "同意しない" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "동의하지 않음" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không đồng ý" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "不同意" + } + } + } + }, + "first_start_done" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "同意して続行" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "동의 및 계속" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đồng ý và tiếp tục" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "同意并继续" + } + } + } + }, + "first_start_text" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Welcome to “Peony TV”.\n\tWe will help you understand our collection, use, and storage of personal information through the %@, %@, %@, %@, %@, and %@. Especially the types of personal information we collect and its purposes, as well as the measures to protect the information. You can view the content of the 《User Agreement》, 《Privacy Policy》, 《Explicit List of Personal Information Collection》, 《List of Third-Party Sharing of Personal Information》, 《Child Personal Information Protection Rules》, and 《Youth Civilization Convention》 in the “Mine” within this software and understand the ways to realize the related rights you enjoy.\n\t1.When using this software, we will collect and use device identification information to generate user accounts.\n\t2.We may apply for the following permissions:\n\t(2.1) Access to the phone, to ensure the safe operation and efficiency of the software services, and for statistical and security checks.\n\t(2.2) Access to the camera, you can use the camera to shoot and upload images.\n\t(2.3) Access to local storage, to help you cache video content for easy viewing.\n\t(2.4) Access to media content and files on your device, for reading and writing video information, caching videos and pictures, and improving the smoothness of application use.\n\t(2.5) Enable push, you can receive messages pushed by this software by enabling push permissions.\n\t(2.6) Enable unlimited data, you can realize the networking function required by this software by connecting to wireless networks or cellular data.\n\t(2.7) Enable eye protection mode, after you enable the eye protection mode, you will add an eye protection mode floating window, and you need to obtain your process list to ensure the floating window status. The above permissions will not be enabled by default, and you have the right to refuse or cancel the authorization. If you agree, please click the agree button to start our service.\n\t(2.8) Collect device sensor information to support various advertising styles issued by third-party advertising SDKs, such as shake. The above permissions will not be enabled by default, and you have the right to refuse or cancel the authorization. If you agree, please click the “Agree” button to start our service." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "\"Peony TV\"へようこそ 私たち。\n\t%@、%@、%@、%@、%@、%@を通じて、あなたが私たちが収集、使用、保存する個人情報について理解するのを助けます。特に、私たちが収集する個人情報の種類と目的、そして情報の保護策についてです。あなたはこのソフトウェア内の「個人センター」で「ユーザー契約」、「プライバシーポリシー」、「個人情報収集明示リスト」、「個人情報第三者共有リスト」、「子供の個人情報保護ルール」、「青少年文明公約」の内容を見て、あなたが享受する権利の実現方法を理解することができます。\n\t 1、このソフトウェアを使用する際、私たちはデバイス識別情報を収集し、ユーザーアカウントを生成します。\n\t2、私たちは以下の権限を申請する可能性があります: \n\t(2.1)電話へのアクセス、ソフトウェアサービスの安全な運用と効率を保証し、統計とセキュリティチェックに使用します\n\t(2.2)カメラへのアクセス、あなたはカメラを使用して撮影し、画像をアップロードすることができます\n\t(2.3)ローカルストレージへのアクセス、あなたがビデオコンテンツをキャッシュするのを助け、視聴を便利にします\n\t(2.4)あなたのデバイス上のメディアコンテンツとファイルへのアクセス、ビデオ情報の読み書き、ビデオと画像のキャッシュに使用し、アプリケーションの使用の流れを向上させます\n\t(2.5)プッシュの開始、あなたはプッシュ権限を開始することで、このソフトウェアがプッシュするメッセージを受け取ることができます \\n \n\t(2.6)無制限のデータを開始、あなたは無線ネットワークまたはセルラーデータに接続することで、このソフトウェアが必要とするネットワーク機能を実現することができます \n\t(2.7)アイケアモードの開始、あなたがアイケアモードを開始すると、アイケアモードのフローティングウィンドウが追加され、あなたのプロセスリストを取得してフローティングウィンドウの状態を保証する必要があります。これらの権限はデフォルトでは開始されません、あなたは拒否または承認をキャンセルする権利があります。同意する場合は、同意ボタンをクリックして私たちのサービスを開始してください\n\t(2.8)デバイスセンサー情報の収集、広告第三者SDKが送信するさまざまな広告スタイルをサポートします、例えば振ってください。これらの権限はデフォルトでは開始されません、あなたは拒否または承認をキャンセルする権利があります。同意する場合は、「同意」ボタンをクリックして私たちのサービスを開始してください。\"" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "\"Peony TV\"을 사용해 주셔서 감사합니다. \n\t우리는 %@, %@, %@, %@, %@, %@을 통해 우리가 개인 정보를 수집, 사용, 저장하는 상황을 이해하는 데 도움을 줍니다. 특히 우리가 수집하는 개인 정보의 종류와 목적, 그리고 정보 보호 조치에 대해 알려드립니다. 소프트웨어 내의 \"개인 센터\"에서 <사용자 계약>, <개인정보 보호 정책>, <개인 정보 수집 명시 목록>, <개인 정보 제3자 공유 목록>, <아동 개인 정보 보호 규칙>, <청소년 문명 협약>의 내용을 확인하고 관련 권리를 실현하는 방법을 알 수 있습니다.\n\t1. 이 소프트웨어를 사용할 때, 우리는 장치 식별 정보를 수집하고 사용하여 사용자 계정을 생성합니다. \n\t2. 우리는 다음과 같은 권한을 요청할 수 있습니다: \n\t(2.1) 전화에 접근하여 소프트웨어 서비스의 안전한 운영과 효율성을 보장하며, 통계 및 보안 검증에 사용됩니다.\n\t(2.2) 카메라에 접근하여 카메라를 사용하여 촬영하고 이미지를 업로드할 수 있습니다. \n\t(2.3) 로컬 저장소에 접근하여 비디오 콘텐츠를 캐시하여 시청을 돕습니다. \n\t(2.4) 장치의 미디어 콘텐츠와 파일에 접근하여 비디오 정보를 읽고 쓰고, 비디오와 이미지를 캐시하여 애플리케이션 사용의 부드러움을 향상시킵니다. \n\t(2.5) 푸시를 활성화하면, 푸시 권한을 활성화하여 이 소프트웨어가 푸시하는 메시지를 받을 수 있습니다. \n\t(2.6) 무제한 데이터를 활성화하면, 무선 네트워크나 셀룰러 데이터에 연결하여 이 소프트웨어가 필요로 하는 네트워크 기능을 구현할 수 있습니다. \n\t(2.7) 눈 보호 모드를 활성화하면, 눈 보호 모드를 활성화한 후 눈 보호 모드의 플로팅 창이 추가되며, 플로팅 창 상태를 보장하기 위해 프로세스 목록을 가져와야 합니다. 위의 권한은 기본적으로 활성화되지 않으며, 권한을 거부하거나 취소할 권리가 있습니다. 동의하시면 동의 버튼을 클릭하여 우리의 서비스를 시작하세요. \n\t(2.8) 장치 센서 정보를 수집하여 광고 제3자 SDK가 제공하는 다양한 광고 스타일을 지원합니다, 예를 들어 흔들기. 위의 권한은 기본적으로 활성화되지 않으며, 권한을 거부하거나 취소할 권리가 있습니다. 동의하시면 “동의” 버튼을 클릭하여 우리의 서비스를 시작하세요" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chào mừng bạn đến với “Peony TV”.\n\tChúng tôi sẽ thông qua %@, %@, %@, %@, %@, %@ để giúp bạn hiểu về việc chúng tôi thu thập, sử dụng, lưu trữ thông tin cá nhân. Đặc biệt là loại thông tin cá nhân mà chúng tôi thu thập và mục đích sử dụng, cũng như các biện pháp bảo vệ thông tin. Bạn có thể xem 'Thỏa thuận người dùng', 'Chính sách bảo mật' 'Danh sách thông tin cá nhân được thu thập' 'Danh sách chia sẻ thông tin cá nhân với bên thứ ba', 'Quy tắc bảo vệ thông tin cá nhân của trẻ em', 'Hiệp ước văn minh thanh thiếu niên' trong “Trung tâm cá nhân” của phần mềm này và tìm hiểu về cách thực hiện các quyền liên quan của bạn.\n\t1、Khi sử dụng phần mềm này, chúng tôi sẽ thu thập, sử dụng thông tin định danh thiết bị để tạo tài khoản người dùng. \n\t2、Chúng tôi có thể yêu cầu các quyền sau: \n\t(2.1)Truy cập vào điện thoại, để đảm bảo hoạt động an toàn và hiệu quả của dịch vụ phần mềm và được sử dụng cho thống kê và kiểm tra an toàn \n\t(2.2)Truy cập vào máy ảnh, bạn có thể sử dụng máy ảnh để chụp và tải lên hình ảnh. \n\t(2.3)Truy cập vào bộ nhớ cục bộ, giúp bạn lưu trữ nội dung video, thuận tiện cho việc xem. \n\t(2.4)Truy cập vào nội dung truyền thông và tệp trên thiết bị của bạn, được sử dụng để đọc và ghi thông tin video, lưu trữ video và hình ảnh, cải thiện sự mượt mà khi sử dụng ứng dụng. \n\t(2.5)Bật thông báo, bạn có thể nhận thông báo từ phần mềm này bằng cách bật quyền thông báo. \n\t(2.6)Bật dữ liệu không giới hạn, bạn có thể kết nối mạng không dây hoặc dữ liệu di động để thực hiện chức năng mạng cần thiết của phần mềm này. \n\t(2.7)Bật chế độ bảo vệ mắt, sau khi bạn bật chế độ bảo vệ mắt, bạn sẽ thêm cửa sổ nổi chế độ bảo vệ mắt và cần lấy danh sách quy trình của bạn để đảm bảo trạng thái cửa sổ nổi. Các quyền trên sẽ không được mở mặc định, bạn có quyền từ chối hoặc hủy ủy quyền. Nếu bạn đồng ý, vui lòng nhấp vào nút đồng ý để mở dịch vụ của chúng tôi. \n\t(2.8)Thu thập thông tin cảm biến thiết bị, hỗ trợ nhiều kiểu quảng cáo được gửi bởi SDK quảng cáo bên thứ ba, như lắc. Các quyền trên sẽ không được mở mặc định, bạn có quyền từ chối hoặc hủy ủy quyền. Nếu bạn đồng ý, vui lòng nhấp vào nút “Đồng ý” để mở dịch vụ của chúng tôi" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "欢迎您使用“Peony TV”。\n\t我们将通过%@、%@、%@、%@、%@、%@帮助您了解我们收集、使用、存储个人信息的情况。特别是我们所收集的个人信息类型及用途,以及对信息的保护措施。您可以本软件内“我的”中查看《用户协议》、《隐私政策》 《收集个人信息明示清单》 《个人信息第三方共享清单》、《儿童个人信息保护规则》、《青少年文明公约》 的内容并了解到您所享有的相关权利实现途径。\n\t1、在使用本软件时,我们会收集、使用设备标识信息用户账号生成。\n\t2、我们可能会申请以下权限:\n\t(2.1)访问电话,以保障软件服务的安全运营以及效率,并用于统计及安全校验\n\t(2.2)访问相机,您可以使用摄像头进行拍摄并上传图像。\n\t(2.3)访问本地存储,帮助您缓存视频内容,便于观看。\n\t(2.4)访问您设备上的媒体内容和文件,用于读写视频信息、视频及图片的缓存,提升应用使用流畅度。\n\t(2.5)开启推送,您可以通过开启推送权限来接受本软件推送的消息。\n\t(2.6)开启无限数据,您可以通过连接无线网络或蜂窝数据来实现本软件需要的联网功能。\n\t(2.7)开启护眼模式,您在开启护眼模式后会添加护眼模式的悬浮窗,并需要获取您的进程列表保证悬浮窗状态。以上权限不会默认开启,您有权拒绝或取消授权。如您同意请点击同意按钮已开启我们的服务。\n\t(2.8)收集设备传感器信息,支持广告第三方SDK下发的多种广告样式,如摇一摇。以上权限不会默认开启,您有权拒或者取消授权。如您同意请点击“同意”按钮以开启我们的服务。" + } + } + } + }, + "first_start_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Message" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "個人情報保護ガイドライン" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "개인 정보 보호 지침" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hướng dẫn bảo vệ thông tin" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "个人信息保护指引" + } + } + } + }, + "language_text_system" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "System Language" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "システム言語" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "시스템 언어" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ngôn ngữ hệ thống" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "系统语言" + } + } + } + }, + "language_text_system_tip" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The option here is to match based on thecurrent phone language system, which is thesame as the phone system language" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ここでのオプションは、電話システム言語と同じ現在の電話言語システムに基づいてマッチングされます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이 옵션은 전화 시스템 언어와 동일한 현재 전화 언어 시스템을 기반으로 일치합니다." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Các tùy chọn ở đây được kết hợp dựa trên hệ thống ngôn ngữ điện thoại hiện tại, giống như ngôn ngữ của hệ thống điện thoại." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "这里的选项是基于当前的电话语言系统进行匹配,该系统与电话系统语言相同" + } + } + } + }, + "login_read_text" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : " Please read and agree with %@ and %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : " %@と%@を読んで同意してください。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : " %@및%@을 읽고 동의하십시오" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : " Vui lòng đọc và đồng ý với %@ và %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : " 请阅读并同意%@和%@" + } + } + } + }, + "login_title_apple" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign in with Apple" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appleでサインイン" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apple로 로그인" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đăng nhập qua Apple" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过Apple登录" + } + } + } + }, + "login_title_facebook" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign in with FaceBook" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "FaceBookでサインイン" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "FaceBook로 로그인" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đăng nhập qua FaceBook" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过FaceBook登录" + } + } + } + }, + "login_title_google" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign in with Google" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Googleでサインイン" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Google로 로그인" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đăng nhập qua Google" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过Google登录" + } + } + } + }, + "login_title_tiktok" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign in with TikTok" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "TikTokでサインイン" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "TikTok로 로그인" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đăng nhập qua TikTok" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过TikTok登录" + } + } + } + }, + "mine_text_renew" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "renew" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "更新" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "업데이트" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cập nhật" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "更新" + } + } + } + }, + "mine_text_tip" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The gited coins will expire in 24 hour" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "贈呈された硬貨は24時間以内に期限切れになります" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "증정된 동전은 24시간 내에 기한이 만료됩니다." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiền xu được tặng sẽ hết hạn trong vòng 24 giờ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "赠送的硬币将在24小时内过期" + } + } + } + }, + "mine_title_agreement" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : " User Agreement" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ユーザプロトコル" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사용자 프로토콜" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thỏa thuận người dùng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "用户协议" + } + } + } + }, + "mine_title_browsing_istory" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Browsing History" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "追劇記録" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "추극 역사" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Theo đuổi lịch sử" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "追剧历史" + } + } + } + }, + "mine_title_consumption" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Consumption Record" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "消費履歴" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "소비 기록" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hồ sơ tiêu thụ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "消费记录" + } + } + } + }, + "mine_title_consumption_coins" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coins" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "金貨" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "금화" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vàng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "金币" + } + } + } + }, + "mine_title_consumption_vip" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "VIP" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "会員カード" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "회원 카드" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thẻ thành viên" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "会员卡" + } + } + } + }, + "mine_title_customer" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Customer Service" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "カスタマーサービスへの連絡" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "고객 서비스에 문의" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Liên hệ Hỗ trợ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "联系客服" + } + } + } + }, + "mine_title_favorites" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "My Favorites" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "私のコレクション" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "내 컬렉션" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bộ sưu tập của tôi" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "我的收藏" + } + } + } + }, + "mine_title_language" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Language" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "言語" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "언어" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ngôn ngữ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置语言" + } + } + } + }, + "mine_title_policy" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Privacy Policy" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "プライバシーポリシー" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "개인 정보 보호 정책" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chính sách bảo mật" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "隐私政策" + } + } + } + }, + "mine_title_purchase" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Purchase Records" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "購買履歴" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "구매 기록" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hồ sơ mua hàng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "购买记录" + } + } + } + }, + "mine_title_setting" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Setting" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설치" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thiết lập" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "设置" + } + } + } + }, + "mine_title_tourist" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tourist" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "観光客" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "여행자" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hành khách" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "游客" + } + } + } + }, + "mine_vip_date" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "vip expiration time:%@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "vip期限:%@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "vip 만료 시간: %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hết hạn vip: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "vip到期时间:%@" + } + } + } + }, + "mine_vip_tip_not" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "You have not activated VIP yet" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "VIPをアクティブにしていません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "당신은 아직 VIP를 활성화 하지 않았습니다" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn chưa kích hoạt VIP" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "您尚未激活VIP" + } + } + } + }, + "player_text_episcode" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Episode %d Complete: %d" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "第%d話 全集:%d" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d회 전집: %d" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tập %d tập đầy đủ: %d" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "第%d集 全集:%d" + } + } + } + }, + "player_text_series" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Series" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "全集" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "드라마" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tập" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全集" + } + } + } + }, + "refresh_auto_footer_idle_text" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tap or pull up to load more" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "クリックまたはドロップアップロードの詳細" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "탭 또는 위로 당겨 로드함" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nhấn hoặc kéo lên để tải thêm" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "点击或上拉加载更多" + } + } + } + }, + "refresh_auto_footer_no_more_data_text" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No more data" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "これ以上のデータはありません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "더이상 데이터 없음" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không thêm dữ liệu" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已经全部加载完毕" + } + } + } + }, + "refresh_auto_footer_refreshing_rext" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loading..." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ロード..." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "로딩중..." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đang tải..." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在加载更多的数据..." + } + } + } + }, + "refresh_header_date_today_text" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Today" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "今日" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "오늘" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hôm nay" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "今天" + } + } + } + }, + "refresh_header_idle_text" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pull down to refresh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ドロップダウンしてリフレッシュ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "아래로 당겨 새로고침" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kéo xuống để Refresh" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "下拉可以刷新" + } + } + } + }, + "refresh_header_last_time_text" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Last update: " + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "最終更新日:" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "마지막 업데이트: " + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cập nhật lần cuối:" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "最后更新:" + } + } + } + }, + "refresh_header_none_last_date_text" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No record" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "レコードなし" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기록 없음" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không có hồ sơ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无记录" + } + } + } + }, + "refresh_header_pulling_text" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Release to refresh" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "リラックスしてすぐにリフレッシュ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "놓으면 새로고침" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nới lỏng Làm mới ngay lập tức" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "松开立即刷新" + } + } + } + }, + "refresh_Header_refreshing_text" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loading..." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ロード..." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "로딩중..." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đang tải..." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "正在刷新数据中..." + } + } + } + }, + "setting_title_out" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Logout" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ログアウト" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "로그아웃" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đăng xuất" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "注销" + } + } + } + }, + "setting_title_quit" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quit" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "終了" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "종료" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thoát" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出" + } + } + } + }, + "tabbar_discover" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Recommended" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "推奨" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "발견" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Khám phá" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "推荐" + } + } + } + }, + "tabbar_home" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Home" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "トップページ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "첫 페이지" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trang chủ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "首页" + } + } + } + }, + "tabbar_mine" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mine" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "こう" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "광산" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "mỏ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "我的" + } + } + } + }, + "tabbar_videos" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Theater" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "劇場" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "극장" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rạp hát" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "影院" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/HiBit/Project/Publics/Views/HBCollectionViewCell.h b/HiBit/Project/Publics/Views/HBCollectionViewCell.h new file mode 100644 index 0000000..1ce715f --- /dev/null +++ b/HiBit/Project/Publics/Views/HBCollectionViewCell.h @@ -0,0 +1,16 @@ +// +// HBCollectionViewCell.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/15. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface HBCollectionViewCell : UICollectionViewCell +@property (weak, nonatomic) UIViewController * controller; +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/Views/HBCollectionViewCell.m b/HiBit/Project/Publics/Views/HBCollectionViewCell.m new file mode 100644 index 0000000..138ac7f --- /dev/null +++ b/HiBit/Project/Publics/Views/HBCollectionViewCell.m @@ -0,0 +1,12 @@ +// +// HBCollectionViewCell.m +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/15. +// + +#import "HBCollectionViewCell.h" + +@implementation HBCollectionViewCell + +@end diff --git a/HiBit/Project/Publics/Views/HBRefreshAutoNormalFooter.h b/HiBit/Project/Publics/Views/HBRefreshAutoNormalFooter.h new file mode 100644 index 0000000..3cdfed7 --- /dev/null +++ b/HiBit/Project/Publics/Views/HBRefreshAutoNormalFooter.h @@ -0,0 +1,16 @@ +// +// HBRefreshAutoNormalFooter.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/6/6. +// + +#import "MJRefreshAutoNormalFooter.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface HBRefreshAutoNormalFooter : MJRefreshAutoNormalFooter + +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/Views/HBRefreshAutoNormalFooter.m b/HiBit/Project/Publics/Views/HBRefreshAutoNormalFooter.m new file mode 100644 index 0000000..3965895 --- /dev/null +++ b/HiBit/Project/Publics/Views/HBRefreshAutoNormalFooter.m @@ -0,0 +1,19 @@ +// +// HBRefreshAutoNormalFooter.m +// QinJiuTV +// +// Created by HI_LOSER on 2024/6/6. +// + +#import "HBRefreshAutoNormalFooter.h" + +@implementation HBRefreshAutoNormalFooter + +-(void)prepare{ + [super prepare]; + [self setTitle:[@"refresh_auto_footer_idle_text" language] forState:MJRefreshStateIdle]; + [self setTitle:[@"refresh_auto_footer_refreshing_rext" language] forState:MJRefreshStateRefreshing]; + [self setTitle:[@"refresh_auto_footer_no_more_data_text" language] forState:MJRefreshStateNoMoreData]; +} +@end + diff --git a/HiBit/Project/Publics/Views/HBRefreshNormalHeader.h b/HiBit/Project/Publics/Views/HBRefreshNormalHeader.h new file mode 100644 index 0000000..c8f4398 --- /dev/null +++ b/HiBit/Project/Publics/Views/HBRefreshNormalHeader.h @@ -0,0 +1,16 @@ +// +// HBRefreshNormalHeader.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/6/6. +// + +#import "MJRefreshNormalHeader.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface HBRefreshNormalHeader : MJRefreshNormalHeader + +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/Views/HBRefreshNormalHeader.m b/HiBit/Project/Publics/Views/HBRefreshNormalHeader.m new file mode 100644 index 0000000..ebd5ee2 --- /dev/null +++ b/HiBit/Project/Publics/Views/HBRefreshNormalHeader.m @@ -0,0 +1,64 @@ +// +// HBRefreshNormalHeader.m +// QinJiuTV +// +// Created by HI_LOSER on 2024/6/6. +// + +#import "HBRefreshNormalHeader.h" + +@implementation HBRefreshNormalHeader + +-(void)prepare{ + [super prepare]; + [self setTitle:[@"refresh_header_idle_text" language] forState:MJRefreshStateIdle]; + [self setTitle:[@"refresh_header_pulling_text" language] forState:MJRefreshStatePulling]; + [self setTitle:[@"refresh_Header_refreshing_text" language] forState:MJRefreshStateRefreshing]; +} +- (void)setLastUpdatedTimeKey:(NSString *)lastUpdatedTimeKey { + [super setLastUpdatedTimeKey:lastUpdatedTimeKey]; + + // 如果label隐藏了,就不用再处理 + if (self.lastUpdatedTimeLabel.hidden) return; + + NSDate *lastUpdatedTime = [[NSUserDefaults standardUserDefaults] objectForKey:lastUpdatedTimeKey]; + + // 如果有block + if (self.lastUpdatedTimeText) { + self.lastUpdatedTimeLabel.text = self.lastUpdatedTimeText(lastUpdatedTime); + return; + } + + if (lastUpdatedTime) { + // 1.获得年月日 + NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; + NSUInteger unitFlags = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute; + NSDateComponents *cmp1 = [calendar components:unitFlags fromDate:lastUpdatedTime]; + NSDateComponents *cmp2 = [calendar components:unitFlags fromDate:[NSDate date]]; + + // 2.格式化日期 + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + BOOL isToday = NO; + if ([cmp1 day] == [cmp2 day]) { // 今天 + formatter.dateFormat = @" HH:mm"; + isToday = YES; + } else if ([cmp1 year] == [cmp2 year]) { // 今年 + formatter.dateFormat = @"MM-dd HH:mm"; + } else { + formatter.dateFormat = @"yyyy-MM-dd HH:mm"; + } + NSString *time = [formatter stringFromDate:lastUpdatedTime]; + + // 3.显示日期 + self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@"%@%@%@", + [@"refresh_header_last_time_text" language], + isToday ? [@"refresh_header_date_today_text" language] : @"", + time]; + } else { + self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@"%@%@", + [@"refresh_header_last_time_text" language], + [@"refresh_header_none_last_date_text" language]]; + } +} +@end + diff --git a/HiBit/Project/Publics/Views/HBTableView.h b/HiBit/Project/Publics/Views/HBTableView.h new file mode 100644 index 0000000..a8e97c7 --- /dev/null +++ b/HiBit/Project/Publics/Views/HBTableView.h @@ -0,0 +1,16 @@ +// +// HBTableView.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/15. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface HBTableView : UITableView + +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/Views/HBTableView.m b/HiBit/Project/Publics/Views/HBTableView.m new file mode 100644 index 0000000..41cc419 --- /dev/null +++ b/HiBit/Project/Publics/Views/HBTableView.m @@ -0,0 +1,12 @@ +// +// HBTableView.m +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/15. +// + +#import "HBTableView.h" + +@implementation HBTableView + +@end diff --git a/HiBit/Project/Publics/Views/HBTextField.h b/HiBit/Project/Publics/Views/HBTextField.h new file mode 100644 index 0000000..a4086c1 --- /dev/null +++ b/HiBit/Project/Publics/Views/HBTextField.h @@ -0,0 +1,16 @@ +// +// HBTextField.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/21. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface HBTextField : UITextField + +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/Views/HBTextField.m b/HiBit/Project/Publics/Views/HBTextField.m new file mode 100644 index 0000000..ba6c7c0 --- /dev/null +++ b/HiBit/Project/Publics/Views/HBTextField.m @@ -0,0 +1,21 @@ +// +// HBTextField.m +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/21. +// + +#import "HBTextField.h" + +@implementation HBTextField + +- (CGSize)intrinsicContentSize { + return UILayoutFittingExpandedSize; // 表示在可用范围内尽可能给予最大可用尺寸 +} + +-(CGRect)leftViewRectForBounds:(CGRect)bounds { + return CGRectMake(0, 0, 32, 32); +} + + +@end diff --git a/HiBit/Project/Publics/Views/HBView.h b/HiBit/Project/Publics/Views/HBView.h new file mode 100644 index 0000000..0bae1b9 --- /dev/null +++ b/HiBit/Project/Publics/Views/HBView.h @@ -0,0 +1,16 @@ +// +// HBView.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/13. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface HBView : UIView + +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Publics/Views/HBView.m b/HiBit/Project/Publics/Views/HBView.m new file mode 100644 index 0000000..d90041b --- /dev/null +++ b/HiBit/Project/Publics/Views/HBView.m @@ -0,0 +1,13 @@ +// +// HBView.m +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/13. +// + +#import "HBView.h" + +@implementation HBView + + +@end diff --git a/HiBit/Project/Services/HBApiParams.h b/HiBit/Project/Services/HBApiParams.h new file mode 100644 index 0000000..69c96a0 --- /dev/null +++ b/HiBit/Project/Services/HBApiParams.h @@ -0,0 +1,35 @@ +// +// HBApiParams.h +// FlyChat1 +// +// Created by Liv on 2022/3/6. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface HBApiParams : NSObject +/** + client:结构为获取的当前的终端信息,参考字面义 + clientVer:当前开发的前端(app、pc、h5)版本号,参与验签 + cont:请求包体内容内容为空时则直接接留空,参与验签 + timestamp:时间戳,毫秒值,参与验签 + clientType:请求终端,传值为:ios android h5 web;参与验签 + apiVer:调用接口版本,默认为1 ;参与验签 + + 验签key:使用sha1(终端类型)转hex值获取; + + 以上验签字段使用key=value结构拼接;按照字段排序key即可; + 生成的验签串如下: + apiVer=1&clientType=web&clientVer=1&cont=哈哈哈×tamp=1572760249513&key=CA84D1343B96BAA8137C943ED1860E522CACB238 + + 再将验签串进行md5加密转hex获得sign的值如下: + 最终生成的签名内容为:A6218946715FF5272527BFEADE70D022 + + ***/ + ++ (NSDictionary *)fetchPostParams:(id)info encryption:(BOOL)encryption; +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Services/HBApiParams.m b/HiBit/Project/Services/HBApiParams.m new file mode 100644 index 0000000..e2ca791 --- /dev/null +++ b/HiBit/Project/Services/HBApiParams.m @@ -0,0 +1,321 @@ +// +// HBApiParams.m +// FlyChat1 +// +// Created by Liv on 2022/3/6. +// + +#import "HBApiParams.h" +#import +#import +#import "CommonCrypto/CommonDigest.h" +#import "NSString+AES.h" + + +@implementation HBApiParams + +/** + client:结构为获取的当前的终端信息,参考字面义 + clientVer:当前开发的前端(app、pc、h5)版本号,参与验签 + cont:请求包体内容内容为空时则直接接留空,参与验签 + timestamp:时间戳,毫秒值,参与验签 + clientType:请求终端,传值为:ios android h5 web;参与验签 + apiVer:调用接口版本,默认为1 ;参与验签 + + 验签key:使用sha1(终端类型)转hex值获取; + + 以上验签字段使用key=value结构拼接;按照字段排序key即可; + 生成的验签串如下: + apiVer=1&clientType=web&clientVer=1&cont=哈哈哈×tamp=1572760249513&key=CA84D1343B96BAA8137C943ED1860E522CACB238 + + 再将验签串进行md5加密转hex获得sign的值如下: + 最终生成的签名内容为:A6218946715FF5272527BFEADE70D022 + + ***/ ++ (NSDictionary *)fetchPostParams:(id)info encryption:(BOOL)encryption{ + + NSMutableDictionary * tempInfo = [NSMutableDictionary dictionary]; + [tempInfo addEntriesFromDictionary:@{@"client":[self fetchClient]}]; + [tempInfo addEntriesFromDictionary:@{@"clientVer":@"1"}]; + [tempInfo addEntriesFromDictionary:@{@"apiVer":[self fetchApiVer]}]; + [tempInfo addEntriesFromDictionary:@{@"clientType":[self fetchClientType]}]; + [tempInfo addEntriesFromDictionary:@{@"timestamp":[self fetchTimestamp]}]; + [tempInfo addEntriesFromDictionary:@{@"param":@"param"}]; + + if (info) { + NSError *error; + NSString * infoJson = @"{}"; + NSData * jsonData = [NSJSONSerialization dataWithJSONObject:info options:0 error:&error]; + if (jsonData) { + infoJson = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + } + if (encryption) { + infoJson = [infoJson aci_encryptWithAES]; + [tempInfo addEntriesFromDictionary:@{@"cont":infoJson}]; + } else { + [tempInfo setValue:info forKey:@"cont"]; + } + } else { + [tempInfo addEntriesFromDictionary:@{@"cont":@""}]; + } + [tempInfo addEntriesFromDictionary:@{@"sign":[self fetchMD5Sha1Sign:tempInfo]}]; + + if ([tempInfo[@"cont"] isKindOfClass:[NSString class]] && [tempInfo[@"cont"] isEqualToString:@""]) { + [tempInfo removeObjectForKey:@"cont"]; + } + return tempInfo; +} + ++ (NSDictionary *)fetchClient{ + NSDictionary * clientDic = @{@"deviceId": [self fetchCurrentDeviceModel], + @"osType":@"iOS", + @"deviceType":@"ios", + @"osVersion":@"1.0", + @"appVersion":[self fetchAppVersion]}; + return clientDic; +} ++ (NSString *)fetchCurrentDeviceModel{ + struct utsname systemInfo; + uname(&systemInfo); + + NSString *deviceModel = [NSString stringWithCString:systemInfo.machine + encoding:NSASCIIStringEncoding]; + + if ([deviceModel isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; + if ([deviceModel isEqualToString:@"iPhone3,2"]) return @"iPhone 4"; + if ([deviceModel isEqualToString:@"iPhone3,3"]) return @"iPhone 4"; + if ([deviceModel isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; + if ([deviceModel isEqualToString:@"iPhone5,1"]) return @"iPhone 5"; + if ([deviceModel isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (GSM+CDMA)"; + if ([deviceModel isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (GSM)"; + if ([deviceModel isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (GSM+CDMA)"; + if ([deviceModel isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (GSM)"; + if ([deviceModel isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (GSM+CDMA)"; + if ([deviceModel isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus"; + if ([deviceModel isEqualToString:@"iPhone7,2"]) return @"iPhone 6"; + if ([deviceModel isEqualToString:@"iPhone8,1"]) return @"iPhone 6s"; + if ([deviceModel isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus"; + if ([deviceModel isEqualToString:@"iPhone8,4"]) return @"iPhone SE"; + // 日行两款手机型号均为日本独占,可能使用索尼FeliCa支付方案而不是苹果支付 + if ([deviceModel isEqualToString:@"iPhone9,1"]) return @"iPhone 7"; + if ([deviceModel isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus"; + if ([deviceModel isEqualToString:@"iPhone9,3"]) return @"iPhone 7"; + if ([deviceModel isEqualToString:@"iPhone9,4"]) return @"iPhone 7 Plus"; + if ([deviceModel isEqualToString:@"iPhone10,1"]) return @"iPhone_8"; + if ([deviceModel isEqualToString:@"iPhone10,4"]) return @"iPhone_8"; + if ([deviceModel isEqualToString:@"iPhone10,2"]) return @"iPhone_8_Plus"; + if ([deviceModel isEqualToString:@"iPhone10,5"]) return @"iPhone_8_Plus"; + if ([deviceModel isEqualToString:@"iPhone10,3"]) return @"iPhone X"; + if ([deviceModel isEqualToString:@"iPhone10,6"]) return @"iPhone X"; + if ([deviceModel isEqualToString:@"iPhone11,8"]) return @"iPhone XR"; + if ([deviceModel isEqualToString:@"iPhone11,2"]) return @"iPhone XS"; + if ([deviceModel isEqualToString:@"iPhone11,6"]) return @"iPhone XS Max"; + if ([deviceModel isEqualToString:@"iPhone11,4"]) return @"iPhone XS Max"; + if ([deviceModel isEqualToString:@"iPhone12,1"]) return @"iPhone 11"; + if ([deviceModel isEqualToString:@"iPhone12,3"]) return @"iPhone 11 Pro"; + if ([deviceModel isEqualToString:@"iPhone12,5"]) return @"iPhone 11 Pro Max"; + if ([deviceModel isEqualToString:@"iPhone12,8"]) return @"iPhone SE2"; + if ([deviceModel isEqualToString:@"iPhone13,1"]) return @"iPhone 12 mini"; + if ([deviceModel isEqualToString:@"iPhone13,2"]) return @"iPhone 12"; + if ([deviceModel isEqualToString:@"iPhone13,3"]) return @"iPhone 12 Pro"; + if ([deviceModel isEqualToString:@"iPhone13,4"]) return @"iPhone 12 Pro Max"; + if ([deviceModel isEqualToString:@"iPhone14,1"]) return @"iPhone 13 mini"; + if ([deviceModel isEqualToString:@"iPhone14,2"]) return @"iPhone 13"; + if ([deviceModel isEqualToString:@"iPhone14,3"]) return @"iPhone 13 Pro"; + if ([deviceModel isEqualToString:@"iPhone14,4"]) return @"iPhone 13 Pro Max"; + + if ([deviceModel isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G"; + if ([deviceModel isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G"; + if ([deviceModel isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G"; + if ([deviceModel isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G"; + if ([deviceModel isEqualToString:@"iPod5,1"]) return @"iPod Touch (5 Gen)"; + if ([deviceModel isEqualToString:@"iPad1,1"]) return @"iPad"; + if ([deviceModel isEqualToString:@"iPad1,2"]) return @"iPad 3G"; + if ([deviceModel isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)"; + if ([deviceModel isEqualToString:@"iPad2,2"]) return @"iPad 2"; + if ([deviceModel isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)"; + if ([deviceModel isEqualToString:@"iPad2,4"]) return @"iPad 2"; + if ([deviceModel isEqualToString:@"iPad2,5"]) return @"iPad Mini (WiFi)"; + if ([deviceModel isEqualToString:@"iPad2,6"]) return @"iPad Mini"; + if ([deviceModel isEqualToString:@"iPad2,7"]) return @"iPad Mini (GSM+CDMA)"; + if ([deviceModel isEqualToString:@"iPad3,1"]) return @"iPad 3 (WiFi)"; + if ([deviceModel isEqualToString:@"iPad3,2"]) return @"iPad 3 (GSM+CDMA)"; + if ([deviceModel isEqualToString:@"iPad3,3"]) return @"iPad 3"; + if ([deviceModel isEqualToString:@"iPad3,4"]) return @"iPad 4 (WiFi)"; + if ([deviceModel isEqualToString:@"iPad3,5"]) return @"iPad 4"; + if ([deviceModel isEqualToString:@"iPad3,6"]) return @"iPad 4 (GSM+CDMA)"; + if ([deviceModel isEqualToString:@"iPad4,1"]) return @"iPad Air (WiFi)"; + if ([deviceModel isEqualToString:@"iPad4,2"]) return @"iPad Air (Cellular)"; + if ([deviceModel isEqualToString:@"iPad4,4"]) return @"iPad Mini 2 (WiFi)"; + if ([deviceModel isEqualToString:@"iPad4,5"]) return @"iPad Mini 2 (Cellular)"; + if ([deviceModel isEqualToString:@"iPad4,6"]) return @"iPad Mini 2"; + if ([deviceModel isEqualToString:@"iPad4,7"]) return @"iPad Mini 3"; + if ([deviceModel isEqualToString:@"iPad4,8"]) return @"iPad Mini 3"; + if ([deviceModel isEqualToString:@"iPad4,9"]) return @"iPad Mini 3"; + if ([deviceModel isEqualToString:@"iPad5,1"]) return @"iPad Mini 4 (WiFi)"; + if ([deviceModel isEqualToString:@"iPad5,2"]) return @"iPad Mini 4 (LTE)"; + if ([deviceModel isEqualToString:@"iPad5,3"]) return @"iPad Air 2"; + if ([deviceModel isEqualToString:@"iPad5,4"]) return @"iPad Air 2"; + if ([deviceModel isEqualToString:@"iPad6,3"]) return @"iPad Pro 9.7"; + if ([deviceModel isEqualToString:@"iPad6,4"]) return @"iPad Pro 9.7"; + if ([deviceModel isEqualToString:@"iPad6,7"]) return @"iPad Pro 12.9"; + if ([deviceModel isEqualToString:@"iPad6,8"]) return @"iPad Pro 12.9"; + + if ([deviceModel isEqualToString:@"AppleTV2,1"]) return @"Apple TV 2"; + if ([deviceModel isEqualToString:@"AppleTV3,1"]) return @"Apple TV 3"; + if ([deviceModel isEqualToString:@"AppleTV3,2"]) return @"Apple TV 3"; + if ([deviceModel isEqualToString:@"AppleTV5,3"]) return @"Apple TV 4"; + + if ([deviceModel isEqualToString:@"i386"]) return @"Simulator"; + if ([deviceModel isEqualToString:@"x86_64"]) return @"Simulator"; + return deviceModel; +} + ++ (NSString *)fetchTimestamp{ + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0]; // 获取当前时间0秒后的时间 + NSTimeInterval time = [date timeIntervalSince1970]*1000;// *1000 是精确到毫秒(13位),不乘就是精确到秒(10位) + return [NSString stringWithFormat:@"%.0f", time]; +} + ++ (NSString *)fetchAppVersion { + NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; + NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"]; + return app_Version; +} + ++ (NSString *)fetchApiVer{ + NSString * apiVer = @"1"; + return apiVer; +} + ++ (NSString *)fetchClientType{ + NSString * clientType = @"iOS"; + return clientType; +} + ++ (NSString *)fetchMD5Sha1Sign:(NSDictionary *)info { + NSString * signStr = [self fetchSignStr:info]; + NSString * key = [[self sha1WithString:[self fetchClientType]] uppercaseString]; + signStr = [signStr stringByAppendingFormat:@"&key=%@",key]; + NSString * signComp = [ [self MD5String:signStr] uppercaseString] ; + return signComp; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" ++ (NSString *)MD5String:(NSString *)signStr { + const char *cstr = [signStr UTF8String]; + unsigned char result[16]; + CC_MD5(cstr, (CC_LONG)strlen(cstr), result); + return [NSString stringWithFormat: + @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + result[0], result[1], result[2], result[3], + result[4], result[5], result[6], result[7], + result[8], result[9], result[10], result[11], + result[12], result[13], result[14], result[15] + ]; +} +#pragma clang diagnostic pop + + ++ (NSString *)sha1WithString:(NSString *)string { + NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; + return [self sha1WithData:data]; +} + ++ (NSString *)sha1WithData:(NSData *)data { + unsigned char *digest = NULL; + + // Malloc a buffer to hold hash. + digest = malloc(CC_SHA1_DIGEST_LENGTH * sizeof(unsigned char)); + memset(digest, 0x0, CC_SHA1_DIGEST_LENGTH); + CC_SHA1(data.bytes, (CC_LONG)data.length, digest); + + NSString *result = [self sha1WithDigest:digest]; + if (digest) { + free(digest); + } + + return result; +} ++ (NSString *)sha1WithDigest:(const unsigned char *)digest { + if (!digest) { + return nil; + } + NSMutableString *result = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * sizeof(unsigned char)]; + for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) { + [result appendFormat:@"%02x",digest[i]]; + } + return result; +} + ++ (NSString *)fetchSignStr:(NSDictionary *)info { + NSString * signStr = @""; + NSArray*sortedKeys=[[info allKeys]sortedArrayUsingSelector:@selector(compare:)]; + + for(NSString * key in sortedKeys){ + if ([key isEqualToString:@"client"]) { + continue; + } + + id value = [info objectForKey:key] ; + if ([key isEqualToString:@"cont"] && [value isKindOfClass:[NSString class]] && [value length] == 0) { + continue; + } + NSString * valueStr = @""; + if ([value isKindOfClass:[NSArray class]] ) { + valueStr = [self stringWithArray:value]; + valueStr = [valueStr stringByAppendingString:@"}"]; + }else if ([value isKindOfClass:[NSDictionary class]]){ + valueStr = [NSString stringWithFormat:@"%@}",[self stringWithDict:value]]; + }else if ([value isKindOfClass:[NSString class]]){ + valueStr = value; + } + NSString * tempKeyV = [NSString stringWithFormat:@"%@=%@&",key,valueStr]; + signStr = [signStr stringByAppendingFormat:@"%@",tempKeyV]; + } + if (signStr.length >0) { + signStr = [signStr substringToIndex:signStr.length-1]; + } + return signStr; +} + ++ (NSString*)stringWithArray:(NSArray*)array { + NSString*str =@"["; + for(id obj in array) { + if([obj isKindOfClass:[NSDictionary class]]) { + str = [self stringWithDict:obj]; + str = [str stringByAppendingFormat:@"}"]; + }else if([obj isKindOfClass:[NSArray class]]) { + str = [self stringWithArray:obj]; + str = [str stringByAppendingFormat:@"]"]; + } + + if([str length] !=1) { + str = [str stringByAppendingString:@","]; + } + } + return str; +} + ++ (NSString*)stringWithDict:(NSDictionary*)dict{ + NSArray*keys = [dict allKeys]; + NSArray*sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2) { + return[obj1 compare:obj2 options:NSNumericSearch]; + }]; + + NSString*str =@"{"; + for(NSString*categoryId in sortedArray) { + id value = [dict objectForKey:categoryId]; + if([value isKindOfClass:[NSDictionary class]]) { + value = [self stringWithDict:value]; + value = [NSString stringWithFormat:@"%@}",value]; + } + if([str length] !=1) { + str = [str stringByAppendingString:@","]; + } + str = [str stringByAppendingFormat:@"\"%@\":\"%@\"",categoryId,value]; + } + return str; +} +@end diff --git a/HiBit/Project/Services/HBNetWorkingUtility+Services.h b/HiBit/Project/Services/HBNetWorkingUtility+Services.h new file mode 100644 index 0000000..92a4f88 --- /dev/null +++ b/HiBit/Project/Services/HBNetWorkingUtility+Services.h @@ -0,0 +1,135 @@ +// +// HBNetWorkingUtility+Services.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/28. +// + +#import "HBNetWorkingUtility.h" + +NS_ASSUME_NONNULL_BEGIN + +/// 公共接口 +@interface HBNetWorkingUtility (Commom) + +/// 用设备信息 注册token +/// NSUserDefaults HBNetWorkingTokenKey 保存了 token +/// NSUserDefaults HBCustomerIdKey 保存了 用户id ++ (void)commom_deviceRegister; + + + +/// 获取首页滚动 +/// - Parameter complateBlock: ++ (void)commom_fetchBannersWithComplateBlock:(HBResponseComplateBlock)complateBlock; + + +/// 短剧搜索 +/// - Parameters: +/// - key: 搜索的关键字 +/// - complateBlock: ++ (void)common_searchVideosWithKey:(NSString *) key complateBlock:(HBResponseComplateBlock)complateBlock; + + +@end + +/// 首页接口 +@interface HBNetWorkingUtility (home) ++ (void)home_fetchCategoriesWithComplateBlock:(HBResponseComplateBlock)complateBlock; +@end + +/// 用户相关接口 +@interface HBNetWorkingUtility (Customer) + +/// 第三方登录接口 +/// - Parameters: +/// - params: @{@"email" : @"dsfasfasf", +/// @"third_id" : @"sdl342034023424", +/// @"platform" : @"google", +/// @"family_name" : @"wu", +/// @"giving_name" : @"colin", +/// @"avator" : @"http://"} +/// - complateBlock: ++ (void)customer_thirdLoginWithParams:(NSDictionary *) params complateBlock:(HBResponseComplateBlock)complateBlock; + +/// 退出登录 +/// - Parameter complateBlock: ++ (void)customer_logoutWithComplateBlock:(HBResponseComplateBlock)complateBlock; + +/// 注销账户 +/// - Parameter complateBlock: ++ (void)customer_signoutWithComplateBlock:(HBResponseComplateBlock)complateBlock; + +/// 获取用户信息 +/// - Parameter complateBlock: ++ (void)customer_fetchUserInfoWithComplateBlock:(HBResponseComplateBlock)complateBlock; + + +/// 获取用户的收藏列表 +/// - Parameter complateBlock: ++ (void)customer_fetchFavoriteListWithComplateBlock:(HBResponseComplateBlock)complateBlock; + +/// 用户收藏短视频 +/// - Parameters: +/// - vId: 短视频ID +/// - complateBlock: ++ (void)customer_favoriteWithVideoId:(NSInteger )vId complateBlock:(HBResponseComplateBlock)complateBlock; + + +/// 用户取消收藏短视频 +/// - Parameters: +/// - vId: 短视频ID +/// - complateBlock: ++ (void)customer_unFavoriteWithVideoId:(NSInteger )vId complateBlock:(HBResponseComplateBlock)complateBlock; + +@end + + +/// 视频相关接口 +@interface HBNetWorkingUtility (videos) + +/// 获取短视频分类 +/// - Parameter complateBlock: ++ (void)videos_fetchCategoriesWithComplateBlock:(HBResponseComplateBlock)complateBlock; + +/// 根据短视频分类id获取短视频列表 +/// - Parameters: +/// - cid: 短视频id +/// - complateBlock: ++ (void)videos_fetchCategoryVideosWithId:(NSInteger)cid complateBlock:(HBResponseComplateBlock)complateBlock; + + +/// 获取视频详情 和剧集 +/// - Parameters: +/// - vId: 短视频id +/// - complateBlock: ++ (void)videos_fetchVideoDetailsWithSid:(NSInteger)vId complateBlock:(HBResponseComplateBlock)complateBlock; + + +/// 上报用户单前观看记录 +/// - Parameters: +/// - sId: 短视频id +/// - vId: 剧集id +/// - complateBlock: ++ (void)videos_uploadPlayHistoryWithSid:(NSInteger)sId vId:(NSInteger)vId complateBlock:(HBResponseComplateBlock)complateBlock; + + +/// 获取剧场排行 +/// - Parameter complateBlock: ++ (void)videos_fetchVisitTopWithComplateBlock:(HBResponseComplateBlock)complateBlock; +@end + +/// 推挤页接口 +@interface HBNetWorkingUtility (Discover) + +/// 推荐页列表 +/// - Parameters: +/// - page: +/// - size: +/// - complateBlock: ++ (void)discover_fetchRecommandsWithPage:(NSInteger)page + size:(NSInteger)size + complateBlock:(HBResponseComplateBlock) complateBlock; +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Services/HBNetWorkingUtility+Services.m b/HiBit/Project/Services/HBNetWorkingUtility+Services.m new file mode 100644 index 0000000..64dd13c --- /dev/null +++ b/HiBit/Project/Services/HBNetWorkingUtility+Services.m @@ -0,0 +1,226 @@ +// +// HBNetWorkingUtility+Services.m +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/28. +// + +#import "HBNetWorkingUtility+Services.h" + +@implementation HBNetWorkingUtility (Commom) + ++ (void)commom_deviceRegister { + + if([NSUserDefaults boolForKey:HBCustomerLoginSuccessKey]) return; + + NSError * error = nil; + NSString * identifierForVendor = [SAMKeychain passwordForService:[UIDevice bundleIdentifier] account:HBIdentifierForVendorKey error:&error]; + if ([NSString empty:identifierForVendor] || error) { + identifierForVendor = [UIDevice identifierForVendor]; + [SAMKeychain setPassword:identifierForVendor forService:[UIDevice bundleIdentifier] account:HBIdentifierForVendorKey]; + } + + + NSDictionary * headers = @{ + @"Authorization": @"", + @"device-id": identifierForVendor, + @"system-type": @"ios", + @"model":[UIDevice model], + @"system-version": [UIDevice systemVersion], + @"brand": @"ios", + @"app-version": [UIDevice appVersion] + }; + + + [HBNetWorkingUtility requestWithHTTPMethod:HTTPMethodPost + api:@"customer/register" + headers:headers + parameters:nil + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (result.success) { + [NSUserDefaults setObject:result.data[@"token"] forKey:HBNetWorkingTokenKey]; + [NSUserDefaults setObject:result.data[@"customer_id"] forKey:HBCustomerIdKey]; + } else { + + } + }]; +} + ++ (void)commom_fetchBannersWithComplateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodGet + api:@"getBanners" + parameters:nil + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; +} + ++ (void)common_searchVideosWithKey:(NSString *) key complateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodGet + api:@"videoList" + parameters:@{@"search":key} + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; + +} + +@end + +@implementation HBNetWorkingUtility (home) + ++ (void)home_fetchCategoriesWithComplateBlock:(HBResponseComplateBlock)complateBlock{ + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodGet + api:@"getHomeCategories" + parameters:nil + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; +} +@end + + + +@implementation HBNetWorkingUtility (Customer) ++ (void)customer_thirdLoginWithParams:(NSDictionary *) params complateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodPost + api:@"customer/login" + parameters:params + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; + +} + ++ (void)customer_logoutWithComplateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodPost + api:@"customer/signout" + parameters:nil + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) { + [NSUserDefaults setObject:result.data[@"token"] forKey:HBNetWorkingTokenKey]; + [NSUserDefaults setObject:result.data[@"customer_id"] forKey:HBCustomerIdKey]; + complateBlock(result.success,result.data,result.message); + } + }]; +} + ++ (void)customer_signoutWithComplateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodPost + api:@"customer/logoff" + parameters:nil + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (result.success) [HBNetWorkingUtility commom_deviceRegister]; + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; +} + + ++ (void)customer_fetchUserInfoWithComplateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodGet + api:@"customer/info" + parameters:nil + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; +} + ++ (void)customer_favoriteWithVideoId:(NSInteger )vId complateBlock:(HBResponseComplateBlock)complateBlock { + + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodPost + api:@"collect" + parameters:@{@"short_video_id" : @(vId)} + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; +} + ++ (void)customer_unFavoriteWithVideoId:(NSInteger )vId complateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodPost + api:@"cancelCollect" + parameters:@{@"short_video_id" : @(vId)} + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; +} + ++ (void)customer_fetchFavoriteListWithComplateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodGet + api:@"myCollections" + parameters:nil + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; +} + +@end + +@implementation HBNetWorkingUtility (videos) ++ (void)videos_fetchCategoriesWithComplateBlock:(HBResponseComplateBlock)complateBlock { + + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodGet + api:@"getCategories" + parameters:nil + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; +} + ++ (void)videos_fetchCategoryVideosWithId:(NSInteger)cid complateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodGet + api:@"videoList" + parameters:@{@"category_id":@(cid)} + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; + +} + ++ (void)videos_fetchVideoDetailsWithSid:(NSInteger)sId complateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodGet + api:@"getVideoDetails" + parameters:@{@"short_video_id":@(sId)} + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; + +} + ++ (void)videos_uploadPlayHistoryWithSid:(NSInteger)sId vId:(NSInteger)vId complateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodPost + api:@"createHistory" + parameters:@{@"short_video_id":@(sId),@"video_id":@(vId)} + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; + +} + ++ (void)videos_fetchVisitTopWithComplateBlock:(HBResponseComplateBlock)complateBlock { + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodGet + api:@"getVisitTop" + parameters:nil + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; + +} + +@end + + +@implementation HBNetWorkingUtility (Discover) ++ (void)discover_fetchRecommandsWithPage:(NSInteger)page + size:(NSInteger)size + complateBlock:(HBResponseComplateBlock) complateBlock { + NSDictionary * parmes = @{@"page_size":@(size), + @"current_page":@(page)}; + + [HBNetWorkingUtility tokenRequestWithHTTPMethod:HTTPMethodGet + api:@"getRecommands" + parameters:parmes + response:^(HBNetWorkingUtilityResult * _Nullable result) { + if (complateBlock) complateBlock(result.success,result.data,result.message); + }]; +} +@end diff --git a/HiBit/Project/Services/HBNetWorkingUtility.h b/HiBit/Project/Services/HBNetWorkingUtility.h new file mode 100644 index 0000000..8d981a9 --- /dev/null +++ b/HiBit/Project/Services/HBNetWorkingUtility.h @@ -0,0 +1,136 @@ +// +// HBNetWorkingUtility.h +// QinJiuTV +// +// Created by 秦九 on 2024/4/29. +// + +#import +#import "HtyoNetWorking.h" +#import "HBNetWorkingUtilityResult.h" + + +NS_ASSUME_NONNULL_BEGIN + +typedef void(^HBResponseComplateBlock)(BOOL success, id data, NSString * message); + + +@interface HBNetWorkingUtility : NSObject + +///// POST 请求 +///// - Parameters: +///// - api: 这里不能填完整url 只需要填 接口api +///// - parameters:参数 +///// - responseBlock: 请求回调 +//+ (void)postRequestWithApi:(nonnull NSString *)api +// parameters:(nullable NSDictionary *)parameters +// response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock; + +/// 数据请求 默认传入了 token +/// - Parameters: +/// - method: 请求方式 +/// - api: 这里不能填完整url 只需要填 接口api +/// - authorization: authorization +/// - parameters: 参数 +/// - responseBlock: 请求回调 ++ (void)tokenRequestWithHTTPMethod:(HTTPMethod)method + api:(nonnull NSString *)api + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock; + +/// 数据请求 +/// - Parameters: +/// - method: 请求方式 +/// - api: 这里不能填完整url 只需要填 接口api +/// - authorization: authorization +/// - parameters: 参数 +/// - responseBlock: 请求回调 ++ (void)requestWithHTTPMethod:(HTTPMethod)method + api:(nonnull NSString *)api + authorization:(nullable NSString *)authorization + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock; +/// 数据请求 +/// - Parameters: +/// - method: 请求方式 +/// - api: 这里不能填完整url 只需要填 接口api +/// - authorization: authorization +/// - parameters: 参数 +/// - responseBlock: 请求回调 ++ (void)requestWithHTTPMethod:(HTTPMethod)method + api:(nonnull NSString *)api + headers:(nullable NSDictionary *)headers + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock; + +/// 数据请求 +/// - Parameters: +/// - method: 请求方式 +/// - urlString: 这里需要填写完整的url +/// - authorization: authorization +/// - parameters: 参数 +/// - responseBlock: 请求回调 ++ (void)requestWithHTTPMethod:(HTTPMethod)method + urlString:(nonnull NSString *) urlString + authorization:(nullable NSString *)authorization + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock; +/// 数据请求 +/// - Parameters: +/// - method: 请求方式 +/// - urlString: 这里需要填写完整的url +/// - headers: headers +/// - parameters: 参数 +/// - responseBlock: 请求回调 ++ (void)requestWithHTTPMethod:(HTTPMethod)method + urlString:(nonnull NSString *)urlString + headers:(nullable NSDictionary *)headers + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock; + +/// POST 上传文件请求 +/// - Parameters: +/// - api: 这里不能填完整url 只需要填 接口api +/// - parameters: 参数 +/// - block: 需要上传的文件 在block里 配置 +/// - uploadProgress: 上传进度 +/// - responseBlock: 请求回调 ++ (void)postRequestWithApi:(nonnull NSString *)api + parameters:(nullable NSDictionary *)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock; + +/// POST 上传文件请求 +/// - Parameters: +/// - api: 这里不能填完整url 只需要填 接口api +/// - authorization: authorization +/// - parameters: 参数 +/// - block: 需要上传的文件 在block里 配置 +/// - uploadProgress: 上传进度 +/// - responseBlock: 请求回调 ++ (void)postRequestWithApi:(nonnull NSString *)api + authorization:(nullable NSString *)authorization + parameters:(nullable NSDictionary *)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock; + +/// POST 上传文件请求 +/// - Parameters: +/// - urlString: 这里需要完整的url +/// - authorization: authorization +/// - parameters: 参数 +/// - block: 需要上传的文件 在block里 配置 +/// - uploadProgress: 上传进度 +/// - responseBlock: 请求回调 ++ (void)postRequestWitUrlString:(nonnull NSString *)urlString + authorization:(nullable NSString *)authorization + parameters:(nullable NSDictionary *)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock; + +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Project/Services/HBNetWorkingUtility.m b/HiBit/Project/Services/HBNetWorkingUtility.m new file mode 100644 index 0000000..14472ab --- /dev/null +++ b/HiBit/Project/Services/HBNetWorkingUtility.m @@ -0,0 +1,253 @@ +// +// HBNetWorkingUtility.m +// QinJiuTV +// +// Created by 秦九 on 2024/4/29. +// + +#import "HBNetWorkingUtility.h" +#import "NSString+Extension.h" + +@implementation HBNetWorkingUtility + +/// POST 请求 +/// - Parameters: +/// - api: 这里不能填完整url 只需要填 接口api +/// - parameters:参数 +/// - responseBlock: 请求回调 ++ (void)postRequestWithApi:(nonnull NSString *)api + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock { + [self requestWithHTTPMethod:HTTPMethodPost + api:api + authorization:nil + parameters:parameters + response:responseBlock]; + +} + ++ (void)postRequestWithApi:(nonnull NSString *)api + headers:(nullable NSDictionary *)headers + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock { + [self requestWithHTTPMethod:HTTPMethodPost + api:api + headers:headers + parameters:parameters + response:responseBlock]; + +} + +/// 数据请求 +/// - Parameters: +/// - method: 请求方式 +/// - api: 这里不能填完整url 只需要填 接口api +/// - authorization: authorization +/// - parameters: 参数 +/// - responseBlock: 请求回调 ++ (void)tokenRequestWithHTTPMethod:(HTTPMethod)method + api:(nonnull NSString *)api + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock{ + NSString * url = [NSString stringWithFormat:@"%@/%@",HBBaseUrlString,api]; + NSString * token = [NSUserDefaults stringForKey:HBNetWorkingTokenKey]; + BOOL flag = ![NSString empty:token]; + [self requestWithHTTPMethod:method + urlString:url + authorization:flag ? token : @"" + parameters:parameters + response:responseBlock]; +} + +/// 数据请求 +/// - Parameters: +/// - method: 请求方式 +/// - api: 这里不能填完整url 只需要填 接口api +/// - authorization: authorization +/// - parameters: 参数 +/// - responseBlock: 请求回调 ++ (void)requestWithHTTPMethod:(HTTPMethod)method + api:(nonnull NSString *)api + authorization:(nullable NSString *)authorization + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock{ + NSString * url = [NSString stringWithFormat:@"%@/%@",HBBaseUrlString,api]; + [self requestWithHTTPMethod:method + urlString:url + authorization:authorization + parameters:parameters + response:responseBlock]; +} + +/// 数据请求 +/// - Parameters: +/// - method: 请求方式 +/// - api: 这里不能填完整url 只需要填 接口api +/// - authorization: authorization +/// - parameters: 参数 +/// - responseBlock: 请求回调 ++ (void)requestWithHTTPMethod:(HTTPMethod)method + api:(nonnull NSString *)api + headers:(nullable NSDictionary *)headers + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock { + NSString * url = [NSString stringWithFormat:@"%@/%@",HBBaseUrlString,api]; + [self requestWithHTTPMethod:method + urlString:url + headers:headers + parameters:parameters + response:responseBlock]; + +} + + +/// 数据请求 +/// - Parameters: +/// - method: 请求方式 +/// - urlString: 这里需要填写完整的url +/// - authorization: authorization +/// - parameters: 参数 +/// - responseBlock: 请求回调 ++ (void)requestWithHTTPMethod:(HTTPMethod)method + urlString:(nonnull NSString *) urlString + authorization:(nullable NSString *)authorization + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock{ + [self requestWithHTTPMethod:method + urlString:urlString + headers:@{@"Authorization":authorization} + parameters:parameters + response:responseBlock]; + + +} + +/// 数据请求 +/// - Parameters: +/// - method: 请求方式 +/// - urlString: 这里需要填写完整的url +/// - headers: headers +/// - parameters: 参数 +/// - responseBlock: 请求回调 ++ (void)requestWithHTTPMethod:(HTTPMethod)method + urlString:(nonnull NSString *)urlString + headers:(nullable NSDictionary *)headers + parameters:(nullable NSDictionary *)parameters + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock { + [HtyoNetWorking requestWithHTTPMethod:method + URLString:urlString + headers:headers + parameters:parameters + success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + if (responseBlock) { + HBNetWorkingUtilityResult * resut = [HBNetWorkingUtilityResult successResult:task response:responseObject]; + if (resut.code == 403) { + NSLog(@"newworking toke 失效!"); + } + responseBlock(resut); + } + } + failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + if (responseBlock) { + responseBlock([HBNetWorkingUtilityResult failureResult:task error:error]); + } + }]; + + +} + +/// POST 上传文件请求 +/// - Parameters: +/// - api: 这里不能填完整url 只需要填 接口api +/// - parameters: 参数 +/// - block: 需要上传的文件 在block里 配置 +/// - uploadProgress: 上传进度 +/// - responseBlock: 请求回调 ++ (void)postRequestWithApi:(nonnull NSString *)api + parameters:(nullable NSDictionary *)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock{ + [self postRequestWithApi:api + authorization:nil + parameters:parameters + constructingBodyWithBlock:block + progress:uploadProgress + response:responseBlock]; +} + +/// POST 上传文件请求 +/// - Parameters: +/// - api: 这里不能填完整url 只需要填 接口api +/// - authorization: authorization +/// - parameters: 参数 +/// - block: 需要上传的文件 在block里 配置 +/// - uploadProgress: 上传进度 +/// - responseBlock: 请求回调 ++ (void)postRequestWithApi:(nonnull NSString *)api + authorization:(nullable NSString *)authorization + parameters:(nullable NSDictionary *)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock{ + NSString * url = [NSString stringWithFormat:@"%@/%@",HBBaseUrlString,api]; + [self postRequestWitUrlString:url + authorization:authorization + parameters:parameters + constructingBodyWithBlock:block + progress:uploadProgress + response:responseBlock]; +} + +/// POST 上传文件请求 +/// - Parameters: +/// - urlString: 这里需要完整的url +/// - authorization: authorization +/// - parameters: 参数 +/// - block: 需要上传的文件 在block里 配置 +/// - uploadProgress: 上传进度 +/// - responseBlock: 请求回调 ++ (void)postRequestWitUrlString:(nonnull NSString *)urlString + authorization:(nullable NSString *)authorization + parameters:(nullable NSDictionary *)parameters + constructingBodyWithBlock:(nullable void (^)(id formData))block + progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress + response:(nullable void (^)(HBNetWorkingUtilityResult * _Nullable result))responseBlock{ + [HtyoNetWorking postRequestWithURLString:urlString + authorization:authorization + parameters:parameters + constructingBodyWithBlock:block + progress:uploadProgress + success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + if (responseBlock) { + responseBlock([HBNetWorkingUtilityResult successResult:task response:responseObject]); + } + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + if (responseBlock) { + responseBlock([HBNetWorkingUtilityResult failureResult:task error:error]); + } + }]; +} + +@end + + +/* + + (void)saveCookieIfHave:(NSURLSessionDataTask *)task { + NSString *cookieString = [[(NSHTTPURLResponse *)task.response allHeaderFields] valueForKey:@"Set-Cookie"]; + NSMutableString *finalCookie = [NSMutableString new]; + NSArray *cookieStrings = [cookieString componentsSeparatedByString:@","]; + for (NSString *temp in cookieStrings) { + NSArray *tempArr = [temp componentsSeparatedByString:@";"]; + [finalCookie appendString:[NSString stringWithFormat:@"%@;", tempArr[0]]]; + } + if (finalCookie.length > 0) { + // [DEFAULTS setObject:finalCookie forKey:RCDUserCookiesKey]; + // [DEFAULTS synchronize]; + [[HtyoNetWorking sharedManager].requestSerializer setValue:finalCookie forHTTPHeaderField:@"Cookie"]; + } + } + + + */ diff --git a/HiBit/Project/Services/HBNetWorkingUtilityResult.h b/HiBit/Project/Services/HBNetWorkingUtilityResult.h new file mode 100644 index 0000000..6b914bb --- /dev/null +++ b/HiBit/Project/Services/HBNetWorkingUtilityResult.h @@ -0,0 +1,29 @@ +// +// HBNetWorkingUtilityResult.h +// QinJiuTV +// +// Created by 秦九 on 2024/4/29. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// 网络请求回调处理类 +@interface HBNetWorkingUtilityResult : NSObject +@property (copy, nonatomic) NSString * message; +@property (assign, nonatomic) NSInteger status; +@property (assign, nonatomic) NSInteger httpCode; +@property (assign, nonatomic) NSInteger code; +@property (copy, nonatomic) NSString * url; +@property (assign, nonatomic) BOOL success; +@property (strong, nonatomic) id data; + ++ (HBNetWorkingUtilityResult *)successResult:(NSURLSessionDataTask *)task response:(id)responseObject; + ++ (HBNetWorkingUtilityResult *)failureResult:(NSURLSessionDataTask *)task error:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/HiBit/Project/Services/HBNetWorkingUtilityResult.m b/HiBit/Project/Services/HBNetWorkingUtilityResult.m new file mode 100644 index 0000000..04d003e --- /dev/null +++ b/HiBit/Project/Services/HBNetWorkingUtilityResult.m @@ -0,0 +1,54 @@ +// +// HBNetWorkingUtilityResult.m +// QinJiuTV +// +// Created by 秦九 on 2024/4/29. +// + +#import "HBNetWorkingUtilityResult.h" + +@interface HBNetWorkingUtilityResult() +@property (strong, nonatomic) NSDictionary * allHeaderFields; +@end + +@implementation HBNetWorkingUtilityResult + + +/// 网络请求成功回调处理 +/// - Parameters: +/// - task: task +/// - responseObject: data ++ (HBNetWorkingUtilityResult *)successResult:(NSURLSessionDataTask *)task response:(id)responseObject { + HBNetWorkingUtilityResult *result = [[HBNetWorkingUtilityResult alloc] init]; + result.allHeaderFields = task.currentRequest.allHTTPHeaderFields; + result.url = task.currentRequest.URL.absoluteString; + result.httpCode = ((NSHTTPURLResponse *)task.response).statusCode; + result.data = responseObject[@"data"]; + result.message = responseObject[@"msg"]; + result.code = [responseObject[@"code"] intValue]; + result.success = (result.code == 200); + NSLog(@"%@",result); + return result; +} + + +/// 请求失败回调处理 +/// - Parameters: +/// - task: task +/// - error: error ++ (HBNetWorkingUtilityResult *)failureResult:(NSURLSessionDataTask *)task error:(NSError *)error { + HBNetWorkingUtilityResult *result = [[HBNetWorkingUtilityResult alloc] init]; + result.url = task.currentRequest.URL.absoluteString; + result.success = NO; + result.httpCode = ((NSHTTPURLResponse *)task.response).statusCode; + result.message = error.description; + NSLog(@"%@",result); + return result; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"-url: %@,\n-headers: %@,\n-success: %d,\n-code: %ld,\n-message: %@,\n-data: %@",self.url,self.allHeaderFields,self.success, (long)self.code, self.message, self.data]; +} + +@end + diff --git a/HiBit/Utils/Category/NSNotificationCenter/NSNotificationCenter+Extension.h b/HiBit/Utils/Category/NSNotificationCenter/NSNotificationCenter+Extension.h new file mode 100644 index 0000000..cfad5cd --- /dev/null +++ b/HiBit/Utils/Category/NSNotificationCenter/NSNotificationCenter+Extension.h @@ -0,0 +1,23 @@ +// +// NSNotificationCenter+Extension.h +// HiBit +// +// Created by HI_LOSER on 2024/6/7. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSNotificationCenter (Extension) ++ (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject; + ++ (void)postNotification:(NSNotification *)notification; ++ (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject; ++ (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo; + ++ (void)removeObserver:(id)observer; ++ (void)removeObserver:(id)observer name:(nullable NSNotificationName)aName object:(nullable id)anObject; +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Utils/Category/NSNotificationCenter/NSNotificationCenter+Extension.m b/HiBit/Utils/Category/NSNotificationCenter/NSNotificationCenter+Extension.m new file mode 100644 index 0000000..f1ffde0 --- /dev/null +++ b/HiBit/Utils/Category/NSNotificationCenter/NSNotificationCenter+Extension.m @@ -0,0 +1,35 @@ +// +// NSNotificationCenter+Extension.m +// HiBit +// +// Created by HI_LOSER on 2024/6/7. +// + +#import "NSNotificationCenter+Extension.h" + +@implementation NSNotificationCenter (Extension) ++ (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject{ + [[NSNotificationCenter defaultCenter] addObserver:observer selector:aSelector name:aName object:anObject]; +} + ++ (void)postNotification:(NSNotification *)notification { + [[NSNotificationCenter defaultCenter] postNotification:notification]; +} + ++ (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject{ + [[NSNotificationCenter defaultCenter] postNotificationName:aName object:anObject]; +} + ++ (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo{ + [[NSNotificationCenter defaultCenter] postNotificationName:aName object:anObject userInfo:aUserInfo]; +} + ++ (void)removeObserver:(id)observer { + [[NSNotificationCenter defaultCenter] removeObserver:observer]; +} + ++ (void)removeObserver:(id)observer name:(nullable NSNotificationName)aName object:(nullable id)anObject { + [[NSNotificationCenter defaultCenter] removeObserver:observer name:aName object:anObject]; +} + +@end diff --git a/HiBit/Utils/Category/NSUserDefaults/NSUserDefaults+Extesion.h b/HiBit/Utils/Category/NSUserDefaults/NSUserDefaults+Extesion.h index a7418f0..173e971 100644 --- a/HiBit/Utils/Category/NSUserDefaults/NSUserDefaults+Extesion.h +++ b/HiBit/Utils/Category/NSUserDefaults/NSUserDefaults+Extesion.h @@ -16,6 +16,8 @@ NS_ASSUME_NONNULL_BEGIN + (BOOL)boolForKey:(NSString *)key; ++ (NSArray *)arrayForKey:(NSString *)key; + + (void)removeObjectForKey:(NSString *)defaultName; + (NSString *)stringForKey:(NSString *)key; diff --git a/HiBit/Utils/Category/NSUserDefaults/NSUserDefaults+Extesion.m b/HiBit/Utils/Category/NSUserDefaults/NSUserDefaults+Extesion.m index 0b83df2..1d3e01e 100644 --- a/HiBit/Utils/Category/NSUserDefaults/NSUserDefaults+Extesion.m +++ b/HiBit/Utils/Category/NSUserDefaults/NSUserDefaults+Extesion.m @@ -22,10 +22,12 @@ [[NSUserDefaults standardUserDefaults] removeObjectForKey:defaultName]; } - + (BOOL)boolForKey:(NSString *)key { return [[NSUserDefaults standardUserDefaults]boolForKey:key]; } ++ (NSArray *)arrayForKey:(NSString *)key { + return [[NSUserDefaults standardUserDefaults]arrayForKey:key]; +} + (NSString *)stringForKey:(NSString *)key { return [[NSUserDefaults standardUserDefaults]stringForKey:key]; diff --git a/HiBit/Utils/HBAlertView/HBAlertView.h b/HiBit/Utils/HBAlertView/HBAlertView.h new file mode 100644 index 0000000..24ded1d --- /dev/null +++ b/HiBit/Utils/HBAlertView/HBAlertView.h @@ -0,0 +1,45 @@ +// +// HBAlertView.h +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/16. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +typedef void (^ButtonBlock)(void); + +@interface HBAlertView : UIView + ++ (void)showMessage:(NSString *)message + leftTitle:(NSString *)leftTitle + rightTitle:(NSString *)rightTitle + leftBlock:(ButtonBlock)cancel + rightBlock:(ButtonBlock)confirm; + ++ (void)showAlertWithTitle:(NSString *)title + message:(NSString *)message + describeTitle:(NSString *)describeTitle + confirmTitle:(NSString *)confirmTitle + confirm:(ButtonBlock)confirm; + ++ (void)showAlertWithMessage:(NSString *)Message + highlightText:(NSString *)highlightText + leftTitle:(NSString *)leftTitle + rightTitle:(NSString *)rightTitle + cancel:(ButtonBlock)cancel + confirm:(ButtonBlock)confirm; + ++ (void)showAlertWithTitle:(NSString *)title + message:(NSString *)message + highlightText:(NSString *)highlightText + describeTitle:(NSString *)describeTitle + leftTitle:(NSString *)leftTitle + rightTitle:(NSString *)rightTitle + cancel:(ButtonBlock)cancel + confirm:(ButtonBlock)confirm; + +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Utils/HBAlertView/HBAlertView.m b/HiBit/Utils/HBAlertView/HBAlertView.m new file mode 100644 index 0000000..d2ead61 --- /dev/null +++ b/HiBit/Utils/HBAlertView/HBAlertView.m @@ -0,0 +1,306 @@ +// +// HBAlertView.m +// QinJiuTV +// +// Created by HI_LOSER on 2024/5/16. +// + +#import "HBAlertView.h" +#import + +typedef enum : NSUInteger { + ClassRoomAlertViewCancel, + ClassRoomAlertViewConfirm, +} ClassRoomAlertViewActionTag; + +#define AWidth 320 +#define AHeight 134 + +@interface HBAlertView () + +@property (nonatomic, strong) UILabel *titleLabel; +@property (nonatomic, strong) UILabel *messageLabel; +@property (nonatomic, strong) UILabel *infoLabel; +@property (nonatomic, strong) UIButton *cancelButton; +@property (nonatomic, strong) UIButton *downgradeButton; +@property (nonatomic, strong) UIView *verticalLine; +@property (nonatomic, strong) NSString *title; +@property (nonatomic, strong) NSString *message; +@property (nonatomic, strong) NSString *info; +@property (nonatomic, strong) NSString *highlightText; +@property (nonatomic, strong) NSString *leftTitle; +@property (nonatomic, strong) NSString *rightTitle; +@property (nonatomic, copy) ButtonBlock cancel; +@property (nonatomic, copy) ButtonBlock confirm; + +@end + +@implementation HBAlertView + ++ (void)showMessage:(NSString *)message + leftTitle:(NSString *)leftTitle + rightTitle:(NSString *)rightTitle + leftBlock:(ButtonBlock)cancel + rightBlock:(ButtonBlock)confirm { + [self showAlertWithTitle:@"" + message:message + highlightText:@"" + describeTitle:@"" + leftTitle:leftTitle + rightTitle:rightTitle + cancel:cancel + confirm:confirm]; +} + ++ (void)showAlertWithTitle:(NSString *)title + message:(NSString *)message + describeTitle:(NSString *)describeTitle + confirmTitle:(NSString *)confirmTitle + confirm:(ButtonBlock)confirm { + [self showAlertWithTitle:title + message:message + highlightText:@"" + describeTitle:describeTitle + leftTitle:@"" + rightTitle:confirmTitle + cancel:nil + confirm:confirm]; +} + ++ (void)showAlertWithMessage:(NSString *)Message + highlightText:(NSString *)highlightText + leftTitle:(NSString *)leftTitle + rightTitle:(NSString *)rightTitle + cancel:(ButtonBlock)cancel + confirm:(ButtonBlock)confirm { + [self showAlertWithTitle:@"" + message:Message + highlightText:highlightText + describeTitle:@"" + leftTitle:leftTitle + rightTitle:rightTitle + cancel:cancel + confirm:confirm]; +} + ++ (void)showAlertWithTitle:(NSString *)title + message:(NSString *)message + highlightText:(NSString *)highlightText + describeTitle:(NSString *)describeTitle + leftTitle:(NSString *)leftTitle + rightTitle:(NSString *)rightTitle + cancel:(ButtonBlock)cancel + confirm:(ButtonBlock)confirm { + HBAlertView *alertView = [[HBAlertView alloc] initWithFrame:[UIScreen mainScreen].bounds]; + alertView.title = title; + alertView.message = message; + alertView.info = describeTitle; + alertView.highlightText = highlightText; + alertView.leftTitle = leftTitle; + alertView.rightTitle = rightTitle; + alertView.cancel = cancel; + alertView.confirm = confirm; + [alertView addSubviews]; + [alertView showAlertView]; +} + +- (void)acs_radiusWithView:(UIView *)view radius:(CGFloat)radius corner:(UIRectCorner)corner { + if (@available(iOS 11.0, *)) { + view.layer.cornerRadius = radius; + view.layer.maskedCorners = (CACornerMask)corner; + } else { + UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)]; + CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; + maskLayer.frame = self.bounds; + maskLayer.path = path.CGPath; + view.layer.mask = maskLayer; + } + if ([self isKindOfClass:[UIImageView class]] || [self isKindOfClass:[UIButton class]]){ + self.layer.masksToBounds = YES; + } +} + +- (void)showAlertView { + [[UIApplication sharedApplication].windows.firstObject addSubview:self]; +} + +- (void)dismissAlertView { + [self removeFromSuperview]; +} + +- (void)addSubviews { + CGRect rect = CGRectMake(([UIScreen mainScreen].bounds.size.width - AWidth) / 2, + ([UIScreen mainScreen].bounds.size.height - AHeight) / 2, AWidth, AHeight); + UIView *contentView = [[UIView alloc] initWithFrame:rect]; + contentView.backgroundColor = [UIColor colorWithRed:40.0/255 green:42.0/255.0 blue:47.0/255.0 alpha:1.0]; + contentView.layer.cornerRadius = 8; + contentView.layer.masksToBounds = YES; + [self addSubview:contentView]; + [contentView addSubview:self.titleLabel]; + [contentView addSubview:self.messageLabel]; + [contentView addSubview:self.infoLabel]; + [contentView addSubview:self.cancelButton]; + [contentView addSubview:self.downgradeButton]; + + + [self acs_radiusWithView:self.cancelButton radius:6.0 corner:UIRectCornerAllCorners]; + [self acs_radiusWithView:self.downgradeButton radius:6.0 corner:UIRectCornerAllCorners]; + + + if (self.title.length > 0) { + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(contentView.mas_top).offset(15); + make.left.equalTo(contentView.mas_left).offset(13); + make.right.equalTo(contentView.mas_right).offset(-13); + make.height.offset(20); + }]; + } else { + self.titleLabel.hidden = YES; + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.width.height.left.offset(0); + }]; + } + [self.messageLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.titleLabel.mas_bottom).offset(20); + make.left.equalTo(contentView.mas_left).offset(13); + make.right.equalTo(contentView.mas_right).offset(-13); + }]; + if (self.info.length > 0) { + [self.infoLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.messageLabel.mas_bottom).offset(10); + make.left.equalTo(contentView.mas_left).offset(13); + make.right.equalTo(contentView.mas_right).offset(-13); + }]; + } else { + self.infoLabel.hidden = YES; + [self.infoLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.messageLabel.mas_bottom).offset(10); + make.width.height.left.offset(0); + }]; + } + if (self.leftTitle.length > 0) { + [self.cancelButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(contentView).offset(40.0); + make.bottom.equalTo(contentView.mas_bottom).offset(-20.0); + make.height.equalTo(@28.0); + make.width.equalTo(@90.0); + }]; + + [self.downgradeButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.equalTo(contentView).offset(-40.0); + make.bottom.equalTo(contentView.mas_bottom).offset(-20.0); + make.height.equalTo(@28.0); + make.width.equalTo(@90.0); + }]; + + } else { + [self.downgradeButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(contentView); + make.bottom.equalTo(contentView.mas_bottom).offset(0); + make.height.equalTo(@28.0); + make.width.equalTo(@90.0); + }]; + } + [contentView updateConstraintsIfNeeded]; + [contentView layoutIfNeeded]; + rect.size.height = CGRectGetMaxY(self.infoLabel.frame) + 44 + 10; + rect.origin.y = ([UIScreen mainScreen].bounds.size.height - rect.size.height) / 2; + contentView.frame = rect; +} + +- (void)buttonAction:(UIButton *)button { + if (button.tag == ClassRoomAlertViewCancel) { + if (self.cancel) { + self.cancel(); + } + } else { + if (self.confirm) { + self.confirm(); + } + } + [self dismissAlertView]; +} + + +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.font = [UIFont boldSystemFontOfSize:18]; + _titleLabel.textAlignment = NSTextAlignmentCenter; + _titleLabel.text = self.title; + _titleLabel.numberOfLines = 1; + _titleLabel.lineBreakMode = NSLineBreakByTruncatingMiddle; + _titleLabel.textColor = UIColor.whiteColor; + } + return _titleLabel; +} + + +- (UILabel *)messageLabel { + if (!_messageLabel) { + _messageLabel = [[UILabel alloc] init]; + _messageLabel.font = [UIFont systemFontOfSize:14.0 weight:UIFontWeightRegular]; + _messageLabel.textAlignment = NSTextAlignmentCenter; + _messageLabel.text = self.message; + _messageLabel.numberOfLines = 0; + _messageLabel.lineBreakMode = NSLineBreakByTruncatingMiddle; + _messageLabel.textColor = UIColor.whiteColor; + if (self.highlightText.length > 0) { + NSRange range = [self.message rangeOfString:self.highlightText]; + if (range.location != NSNotFound) { + NSMutableAttributedString *attributedString = + [[NSMutableAttributedString alloc] initWithString:self.message]; + [attributedString addAttribute:NSForegroundColorAttributeName + value:[UIColor colorWithRed:234.0/255.0 green:51.0/255.0 blue:79.0/255.0 alpha:1.0] + range:range]; //0x3a91f3 + _messageLabel.attributedText = attributedString; + } + } + } + return _messageLabel; +} + +- (UILabel *)infoLabel { + if (!_infoLabel) { + _infoLabel = [[UILabel alloc] init]; + _infoLabel.font = [UIFont systemFontOfSize:12.0]; + _infoLabel.textAlignment = NSTextAlignmentCenter; + _infoLabel.text = self.info; + _infoLabel.numberOfLines = 0; + _infoLabel.lineBreakMode = NSLineBreakByTruncatingMiddle; + _infoLabel.textColor = UIColor.grayColor; + } + return _infoLabel; +} + +- (UIButton *)cancelButton { + if (!_cancelButton) { + _cancelButton = [[UIButton alloc] init]; + _cancelButton.backgroundColor = [UIColor colorWithRed:62.0/255.0 green:64.0/255.0 blue:69.0/255.0 alpha:1.0]; + [_cancelButton.titleLabel setFont:[UIFont systemFontOfSize:12.0 weight:UIFontWeightRegular]]; + [_cancelButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; + [_cancelButton setTitle:self.leftTitle forState:UIControlStateNormal]; + _cancelButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; + _cancelButton.tag = ClassRoomAlertViewCancel; + [_cancelButton addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _cancelButton; +} + +- (UIButton *)downgradeButton { + if (!_downgradeButton) { + _downgradeButton = [[UIButton alloc] init]; + _downgradeButton.backgroundColor = [UIColor colorWithRed:234.0/255.0 green:51.0/255.0 blue:79.0/255.0 alpha:1.0]; + [_downgradeButton.titleLabel setFont:[UIFont systemFontOfSize:12.0 weight:UIFontWeightRegular]]; + [_downgradeButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal]; + [_downgradeButton setTitle:self.rightTitle forState:UIControlStateNormal]; + _downgradeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; + _downgradeButton.tag = ClassRoomAlertViewConfirm; + [_downgradeButton addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; + } + return _downgradeButton; +} + + + +@end diff --git a/HiBit/Utils/HtyoNetWorking/HtyoNetWorking.h b/HiBit/Utils/HtyoNetWorking/HtyoNetWorking.h index 0096b5c..48a6eab 100644 --- a/HiBit/Utils/HtyoNetWorking/HtyoNetWorking.h +++ b/HiBit/Utils/HtyoNetWorking/HtyoNetWorking.h @@ -1,5 +1,5 @@ // -// QJNetWorking.h +// HBNetWorking.h // QinJiuTV // // Created by 秦九 on 2024/4/29. diff --git a/HiBit/Utils/HtyoNetWorking/HtyoNetWorking.m b/HiBit/Utils/HtyoNetWorking/HtyoNetWorking.m index 9a70103..2dbc287 100644 --- a/HiBit/Utils/HtyoNetWorking/HtyoNetWorking.m +++ b/HiBit/Utils/HtyoNetWorking/HtyoNetWorking.m @@ -1,5 +1,5 @@ // -// QJNetWorking.m +// HBNetWorking.m // QinJiuTV // // Created by 秦九 on 2024/4/29. diff --git a/HiBit/Utils/RSButton/RSButton.h b/HiBit/Utils/RSButton/RSButton.h new file mode 100644 index 0000000..6af79e1 --- /dev/null +++ b/HiBit/Utils/RSButton/RSButton.h @@ -0,0 +1,42 @@ +// +// RSButton.h +// Serendipity +// +// Created by HI_LOSER on 2022/10/18. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXPORT NSString * RSButtonStringFromControlState(UIControlState status); + + +typedef enum : NSUInteger { + RSButtonTypeAbove = 0, // 图片在文字上面 + RSButtonTypeBelow, // 图片在文字下面 + RSButtonTypeLeft, // 图片在文字左面 + RSButtonTypeRight, // 图片在文字右面 + RSButtonTypeOnlyImage, // 只有图片 + RSButtonTypeOnlyTitle, // 只有文字 +} RSButtonType; + + +@interface RSButton : UIControl +@property (strong, nonatomic, readonly) UILabel * titleLabel; +@property (strong, nonatomic, readonly) UIImageView * imageView; +@property (strong, nonatomic, readonly) UIImageView * backgroundImageView; +@property (assign, nonatomic) UIEdgeInsets insets; + +@property (assign, nonatomic) CGFloat margin; + +- (instancetype)initWithType:(RSButtonType)type; + +- (void)setTitle:(NSString *) title forState:(UIControlState) state; +- (void)setTitleColor:(UIColor *) color forState:(UIControlState) state; +- (void)setImage:(UIImage *) image forState:(UIControlState) state; +-(void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state; +- (void)setTitleFont:(UIFont *)titleFont; +@end + +NS_ASSUME_NONNULL_END diff --git a/HiBit/Utils/RSButton/RSButton.m b/HiBit/Utils/RSButton/RSButton.m new file mode 100644 index 0000000..8526743 --- /dev/null +++ b/HiBit/Utils/RSButton/RSButton.m @@ -0,0 +1,265 @@ +// +// RSButton.m +// Serendipity +// +// Created by HI_LOSER on 2022/10/18. +// + +#import "RSButton.h" + + +NSString * RSButtonStringFromControlState(UIControlState status) { + switch (status) { + case UIControlStateNormal: + return @"Normal"; + case UIControlStateSelected: + return @"Selected"; + case UIControlStateDisabled: + return @"Disabled"; + case UIControlStateHighlighted: + return @"Highlighted"; + case UIControlStateFocused: + return @"Focused"; + case UIControlStateApplication: + return @"Application"; + case UIControlStateReserved: + return @"Reserved"; + default: + return @"Other"; + } +} + +@interface RSButton () +@property (assign, nonatomic) RSButtonType type; +@property (strong, nonatomic) NSMutableDictionary * titleDcit; +@property (strong, nonatomic) NSMutableDictionary * titleColorDcit; +@property (strong, nonatomic) NSMutableDictionary * imageDcit; +@property (strong, nonatomic) NSMutableDictionary * backgroundImageDcit; +@end + +@implementation RSButton +-(NSMutableDictionary *)titleColorDcit{ + if (_titleColorDcit) return _titleColorDcit; + return _titleColorDcit = [NSMutableDictionary dictionary]; +} + + +-(NSMutableDictionary *)backgroundImageDcit{ + if (_backgroundImageDcit) return _backgroundImageDcit; + return _backgroundImageDcit = [NSMutableDictionary dictionary]; +} + +-(NSMutableDictionary *)imageDcit{ + if (_imageDcit) return _imageDcit; + return _imageDcit = [NSMutableDictionary dictionary]; +} + +-(NSMutableDictionary *)titleDcit{ + if (_titleDcit) return _titleDcit; + return _titleDcit = [NSMutableDictionary dictionary]; +} + +- (instancetype)initWithType:(RSButtonType)type { + self = [super init]; + if (self) { + self.insets = UIEdgeInsetsZero; + self.type = type; + self.margin = 10; + [self loadSubViews]; + } + return self; +} + +- (void)loadSubViews { + UIImageView * backgroundImageView = [[UIImageView alloc]init]; + [self addSubview:backgroundImageView]; + _backgroundImageView = backgroundImageView; + + + UIImageView * imageView = [[UIImageView alloc]init]; + imageView.contentMode = UIViewContentModeCenter; + [self addSubview:imageView]; + _imageView = imageView; + + UILabel * titleLabel = [UILabel new]; + titleLabel.font = [UIFont boldSystemFontOfSize:13.0]; + titleLabel.textAlignment = NSTextAlignmentCenter; + titleLabel.numberOfLines = 0; + [self addSubview:titleLabel]; + _titleLabel = titleLabel; + + + +} + +- (void)layoutSubviews{ + [super layoutSubviews]; + + + CGFloat margin = (_imageView.image && ![self empty: _titleLabel.text]) ? self.margin : 0.0; + +// [_backgroundImageView mas_makeConstraints:^(MASConstraintMaker *make) { +// make.left.top.right.bottom.equalTo(self); +// }]; + + if (self.type == RSButtonTypeAbove) { + [_imageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self).offset(self.insets.top); + make.left.equalTo(self).offset(self.insets.left); + make.right.equalTo(self).offset(-self.insets.right); + }]; + + [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(_imageView.mas_bottom).offset(margin); + make.left.equalTo(self).offset(self.insets.left); + make.right.equalTo(self).offset(-self.insets.right); + make.bottom.equalTo(self).offset(self.insets.bottom); + }]; + } else if (self.type == RSButtonTypeBelow) { + [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self).offset(self.insets.top); + make.left.equalTo(self).offset(self.insets.left); + make.right.equalTo(self).offset(-self.insets.right); + }]; + + [_imageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(_titleLabel.mas_bottom).offset(margin); + make.left.equalTo(self).offset(self.insets.left); + make.right.equalTo(self).offset(-self.insets.right); + make.bottom.equalTo(self).offset(self.insets.bottom); + }]; + + } else if (self.type == RSButtonTypeLeft) { + [_imageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self).offset(self.insets.left); + make.top.equalTo(self).offset(self.insets.top); + make.bottom.equalTo(self).offset(self.insets.bottom); + }]; + + [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(_imageView.mas_right).offset(margin); + make.right.equalTo(self).offset(-self.insets.right); + make.top.equalTo(self).offset(self.insets.top); + make.bottom.equalTo(self).offset(self.insets.bottom); + }]; + } else if (self.type == RSButtonTypeRight) { + [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self).offset(self.insets.left); + make.top.equalTo(self).offset(self.insets.top); + make.bottom.equalTo(self).offset(self.insets.bottom); + }]; + + [_imageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(_titleLabel.mas_right).offset(margin); + make.right.equalTo(self).offset(-self.insets.right); + make.top.equalTo(self).offset(self.insets.top); + make.bottom.equalTo(self).offset(self.insets.bottom); + }]; + + } else if (self.type == RSButtonTypeOnlyImage) { + [_imageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self).offset(self.insets.left); + make.right.equalTo(self).offset(-self.insets.right); + make.top.equalTo(self).offset(self.insets.top); + make.bottom.equalTo(self).offset(self.insets.bottom); + }]; + _titleLabel.hidden = YES; + } else if (self.type == RSButtonTypeOnlyTitle) { + _imageView.hidden = YES; + [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self).offset(self.insets.left); + make.right.equalTo(self).offset(-self.insets.right); + make.top.equalTo(self).offset(self.insets.top); + make.bottom.equalTo(self).offset(self.insets.bottom); + }]; + } +} + +- (void)setTitleFont:(UIFont *)titleFont{ + _titleLabel.font = titleFont; +} + + +- (void)setSelected:(BOOL)selected { + [super setSelected:selected]; + [self setSubViewsValue]; +} + +- (void)setEnabled:(BOOL)enabled{ + [super setEnabled:enabled]; + [self setSubViewsValue]; +} + +- (void)setTitle:(NSString *) title forState:(UIControlState) state { + [self.titleDcit setObject:title forKey:RSButtonStringFromControlState(state)]; + [self setSubViewsValue]; +} + +- (void)setTitleColor:(UIColor *) color forState:(UIControlState) state { + [self.titleColorDcit setObject:color forKey:RSButtonStringFromControlState(state)]; + [self setSubViewsValue]; +} + +- (void)setImage:(UIImage *) image forState:(UIControlState) state { + if (image) { + [self.imageDcit setObject:image forKey:RSButtonStringFromControlState(state)]; + [self setSubViewsValue]; + } +} + +-(void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state { + if (image) { + [self.backgroundImageDcit setObject:image forKey:RSButtonStringFromControlState(state)]; + [self setSubViewsValue]; + } +} + + +- (void)setSubViewsValue{ + UIColor * textColor = self.titleColorDcit[RSButtonStringFromControlState(UIControlStateNormal)]; + if (textColor) _titleLabel.textColor = textColor; + + _imageView.image = self.imageDcit[RSButtonStringFromControlState(UIControlStateNormal)]; + _titleLabel.text = self.titleDcit[RSButtonStringFromControlState(UIControlStateNormal)]; + _backgroundImageView.image = self.backgroundImageDcit[RSButtonStringFromControlState(UIControlStateNormal)]; + if (!self.enabled) { + UIImage * image = self.imageDcit[RSButtonStringFromControlState(UIControlStateDisabled)]; + if (image) _imageView.image = image; + + UIColor * color = self.titleColorDcit[RSButtonStringFromControlState(UIControlStateDisabled)]; + if (color) _titleLabel.textColor = color; + + NSString * text = self.titleDcit[RSButtonStringFromControlState(UIControlStateDisabled)]; + if (![self empty:text]) _titleLabel.text = text; + + UIImage * backgroundImage = self.backgroundImageDcit[RSButtonStringFromControlState(UIControlStateDisabled)]; + if (backgroundImage) _backgroundImageView.image = backgroundImage; + + } else if (self.selected) { + UIImage * image = self.imageDcit[RSButtonStringFromControlState(UIControlStateSelected)]; + if (image) _imageView.image = image; + + UIColor * color = self.titleColorDcit[RSButtonStringFromControlState(UIControlStateSelected)]; + if (color) _titleLabel.textColor = color; + + NSString * text = self.titleDcit[RSButtonStringFromControlState(UIControlStateSelected)]; + if (![self empty:text]) _titleLabel.text = text; + + UIImage * backgroundImage = self.backgroundImageDcit[RSButtonStringFromControlState(UIControlStateSelected)]; + if (backgroundImage) _backgroundImageView.image = backgroundImage; + + } + + [self setNeedsLayout]; + +} + + +- (BOOL)empty:(NSString *)string{ + if (string == nil || [string isKindOfClass:NSNull.class]) return YES; + else return string == nil || string.length == 0 || [string isEqualToString:@""]; +} + + + +@end