From 22f2e9febfe877e3e347038863bf40446cfd4b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BE=9C=E5=A3=B0=E4=B8=96=E7=BA=AA?= <> Date: Wed, 17 Dec 2025 18:04:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=8D=E9=A6=88=EF=BC=8C=E6=B3=A8=E9=94=80?= =?UTF-8?q?=EF=BC=8C=E6=8E=A8=E9=80=81=EF=BC=8Cadjust?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Podfile | 5 +- ReaderHive.xcodeproj/project.pbxproj | 77 ++++-- ReaderHive/Base/Define/NRDefine.swift | 2 +- .../Base/Define/NRUserDefaultsKey.swift | 6 +- .../CGMutablePath+NRRoundedCorner.swift | 2 +- .../Base/Extension/Dictionary+NRAdd.swift | 2 +- .../Base/Extension/NSNumber+NRAdd.swift | 2 +- ReaderHive/Base/Extension/String+NRAdd.swift | 22 +- ReaderHive/Base/Extension/UIFont+NRAdd.swift | 2 +- .../Extension/UINavigationBar+NRAdd.swift | 2 +- .../Base/Extension/UIScreen+NRAdd.swift | 2 +- .../Base/Extension/UIScrollView+Refresh.swift | 2 +- .../Base/Extension/UIStackView+NRAdd.swift | 2 +- ReaderHive/Base/Extension/UIView+NRAdd.swift | 2 +- .../Base/Extension/UserDefaults+NRAdd.swift | 2 +- .../Base/Networking/API/NRHomeAPI.swift | 2 +- .../Base/Networking/API/NRNovelAPI.swift | 22 +- .../Base/Networking/API/NRSettingAPI.swift | 22 +- .../Base/Networking/API/NRStatAPI.swift | 171 ++++++++++++++ .../Base/Networking/API/NRStoreAPI.swift | 25 +- .../Base/Networking/API/NRUserAPI.swift | 2 +- ReaderHive/Base/Networking/NRNetwork.swift | 2 +- .../Base/Networking/NRNetworkModel.swift | 2 +- .../NRNetworkReachableManager.swift | 2 +- .../Base/Networking/NRResponseCryptor.swift | 2 +- ReaderHive/Base/Networking/NRTargetType.swift | 2 +- ReaderHive/Base/Networking/NRUrlPath.swift | 2 +- .../Base/VC/NRAppStartViewController.swift | 67 ++++++ .../Base/VC/NRNavigationController.swift | 2 +- ReaderHive/Base/VC/NRTabBarController.swift | 4 +- ReaderHive/Base/VC/NRViewController.swift | 25 +- ReaderHive/Base/View/NRCollectionView.swift | 2 +- ReaderHive/Base/View/NRGradientButton.swift | 2 +- ReaderHive/Base/View/NRGradientView.swift | 2 +- ReaderHive/Base/View/NRImageView.swift | 2 +- ReaderHive/Base/View/NRLabel.swift | 2 +- .../Base/View/NRPanModalContentView.swift | 2 +- ReaderHive/Base/View/NRProgressView.swift | 2 +- ReaderHive/Base/View/NRScrollView.swift | 2 +- ReaderHive/Base/View/NRTableView.swift | 2 +- ReaderHive/Base/View/NRTableViewCell.swift | 2 +- .../Base/WebView/NRAppWebViewController.swift | 4 +- ReaderHive/Base/WebView/NRWebView.swift | 2 +- .../WebView/NRWebViewController+Script.swift | 62 +++-- .../Base/WebView/NRWebViewController.swift | 2 +- .../Explore/M/NRExploreNovelMenuItem.swift | 2 +- .../V/NRExploreNovelContentListCell.swift | 2 +- .../Explore/V/NRExploreNovelGenresCell.swift | 2 +- .../Explore/V/NRExploreNovelMenuCell.swift | 2 +- .../Explore/V/NRExploreNovelMenuView.swift | 2 +- .../Class/Explore/V/NRNovelGenresCell.swift | 2 +- ...xploreNovelContentListViewController.swift | 17 +- .../NRExploreNovelContentViewController.swift | 2 +- .../NRExploreNovelGenresViewController.swift | 15 +- .../VC/NRExploreNovelViewController.swift | 2 +- .../Explore/VC/NRExploreViewController.swift | 2 +- .../VC/NRNovelGenresViewController.swift | 2 +- .../VM/NRExploreNovelMenuDataSource.swift | 2 +- .../Explore/VM/NRExploreNovelViewModel.swift | 2 +- .../C/NRHomeNovelListViewController.swift | 2 +- .../Home/C/NRHomeNovelNewViewController.swift | 2 +- .../Home/C/NRHomeNovelViewController.swift | 2 +- .../Class/Home/C/NRHomeViewController.swift | 55 ++++- .../Class/Home/C/NRSearchViewController.swift | 2 +- .../Class/Home/M/NRHomeNovelModuleItem.swift | 2 +- .../Home/M/NRReadWhatViewTransformer.swift | 2 +- .../Class/Home/V/NRHomeCategoryTagView.swift | 2 +- .../Home/V/NRHomeNovelHeaderContentView.swift | 2 +- .../Class/Home/V/NRHomeNovelHeaderView.swift | 2 +- .../Class/Home/V/NRHomeNovelHotGridView.swift | 2 +- .../Class/Home/V/NRHomeNovelHotTagCell.swift | 2 +- .../Class/Home/V/NRHomeNovelHotTagView.swift | 2 +- .../Class/Home/V/NRHomeNovelListCell.swift | 2 +- .../Home/V/NRHomeNovelListTextCell.swift | 2 +- .../Home/V/NRHomeNovelMustReadTodayCell.swift | 2 +- .../Home/V/NRHomeNovelMustReadTodayView.swift | 2 +- .../Home/V/NRHomeNovelNewArrivalsCell.swift | 2 +- .../Home/V/NRHomeNovelNewArrivalsView.swift | 2 +- .../Class/Home/V/NRHomeNovelNextView.swift | 2 +- .../Home/V/NRHomeNovelNextViewCell.swift | 2 +- .../Home/V/NRHomeNovelReadWhatCell.swift | 2 +- .../Home/V/NRHomeNovelReadWhatView.swift | 2 +- .../Class/Home/V/NRSearchHomeView.swift | 2 +- .../Class/Home/V/NRSearchInputView.swift | 2 +- .../Class/Home/V/NRSearchRecordCell.swift | 2 +- .../Class/Home/V/NRSearchRecordView.swift | 2 +- .../Class/Home/V/NRSearchResultCell.swift | 2 +- .../Class/Home/V/NRSearchResultView.swift | 2 +- ReaderHive/Class/Home/V/NRStarGradeView.swift | 14 +- .../Class/Home/VM/NRHomeNovelViewModel.swift | 2 +- .../Class/Home/VM/NRSearchViewModel.swift | 2 +- .../Class/Me/M/NRFeedbackCountModel.swift | 16 ++ ReaderHive/Class/Me/M/NRLanguageModel.swift | 2 +- ReaderHive/Class/Me/M/NRMeItem.swift | 2 +- ReaderHive/Class/Me/V/NRAboutCell.swift | 2 +- ReaderHive/Class/Me/V/NRAboutHeaderView.swift | 2 +- ReaderHive/Class/Me/V/NRLanguageCell.swift | 2 +- ReaderHive/Class/Me/V/NRMeCell.swift | 15 +- .../Class/Me/V/NRMeCoinsContentView.swift | 2 +- ReaderHive/Class/Me/V/NRMeCoinsPackView.swift | 2 +- ReaderHive/Class/Me/V/NRMeCoinsView.swift | 2 +- ReaderHive/Class/Me/V/NRMeHeaderView.swift | 2 +- ReaderHive/Class/Me/V/NRMeVipView.swift | 2 +- .../Class/Me/V/NRNovelHistoryCell.swift | 2 +- .../Class/Me/VC/NRAboutViewController.swift | 2 +- .../Me/VC/NRFeedbackViewController.swift | 74 +++++- .../Class/Me/VC/NRHistoryViewController.swift | 2 +- .../Me/VC/NRLanguageViewController.swift | 2 +- .../Class/Me/VC/NRMeViewController.swift | 8 +- ReaderHive/Class/Me/VC/NRMyUnlocksCell.swift | 9 + ReaderHive/Class/Me/VC/NRMyUnlocksCell.xib | 2 +- .../Me/VC/NRMyUnlocksViewController.swift | 52 +++- .../Me/VC/NRNovelHistoryViewController.swift | 4 +- .../Class/Me/VC/NRSettingViewController.swift | 1 + .../Class/MyList/V/NRMyListNovelCell.swift | 2 +- .../VC/NRMyListNovelViewController.swift | 17 +- .../MyList/VC/NRMyListViewController.swift | 2 +- .../Class/Novel/M/NRCategoryModel.swift | 2 +- ReaderHive/Class/Novel/M/NRNovelModel.swift | 5 +- .../Novel/M/NRReadChapterCatalogModel.swift | 2 +- .../Class/Novel/M/NRReadChapterModel.swift | 2 +- .../Class/Novel/M/NRReadPageModel.swift | 2 +- .../Class/Novel/M/NRShowRecommendPop.swift | 2 +- .../Class/Novel/V/NRDetailRechargeView.swift | 2 +- .../Novel/V/NRNovelDetailBottomView.swift | 2 +- .../V/NRNovelDetailHeaderView+Data.swift | 2 +- ...NovelDetailHeaderView+NovelCoverInfo.swift | 2 +- .../Novel/V/NRNovelDetailHeaderView.swift | 2 +- .../Novel/V/NRNovelDetailMoreLikeCell.swift | 2 +- .../Class/Novel/V/NRVipRetainItemView.swift | 1 - .../Novel/V/Reader/NRNovelCatalogCell.swift | 2 +- .../V/Reader/NRNovelReadBottomView.swift | 4 +- .../Reader/NRNovelReadContentBottomView.swift | 2 +- .../V/Reader/NRNovelReadContentTopView.swift | 6 +- .../Reader/NRNovelReadFinishHeaderView.swift | 2 +- .../Novel/V/Reader/NRNovelReadGradeView.swift | 2 +- .../V/Reader/NRNovelReadSettingItemView.swift | 2 +- .../V/Reader/NRNovelReadSettingView.swift | 2 +- .../V/Reader/NRNovelReadStarGradeView.swift | 2 +- .../Novel/V/Reader/NRNovelReadTopView.swift | 6 +- .../Novel/V/Reader/NRNovelReadView.swift | 2 +- .../V/Reader/NRNovelReaderCatalogView.swift | 2 +- .../Novel/V/Reader/NRReadBatteryView.swift | 2 +- .../Reader/NRReadSettingBrightnessView.swift | 2 +- .../V/Reader/NRReadSettingFontView.swift | 2 +- .../V/Reader/NRReadSettingSpacingView.swift | 2 +- .../V/Reader/NRReadSettingThemeView.swift | 5 +- .../NRNovelDetailCatalogViewController.swift | 2 +- ...NRNovelDetailRecommandViewController.swift | 2 +- .../VC/NRNovelDetailViewController.swift | 2 +- .../Read/NRNovelReadBaseViewController.swift | 2 +- .../NRNovelReadContentViewController.swift | 2 +- .../NRNovelReadFinishViewController.swift | 2 +- .../Read/NRNovelReadPageViewController.swift | 2 +- .../NRNovelReaderViewController+Page.swift | 2 +- .../VC/Read/NRNovelReaderViewController.swift | 2 +- .../Novel/VM/NRNovelDetailViewModel.swift | 2 +- .../Novel/VM/NRNovelReadViewModel+Data.swift | 2 +- .../Class/Novel/VM/NRNovelReadViewModel.swift | 2 +- .../Class/Store/M/NRBuyRecordsModel.swift | 2 +- .../Store/M/NRCoinPackCanReceiveModel.swift | 16 ++ .../Class/Store/M/NROrderRecordsModel.swift | 2 +- ReaderHive/Class/Store/M/NRPayDateModel.swift | 2 +- .../Class/Store/M/NRRewardCoinsModel.swift | 2 +- .../Store/V/NRConsumptionRecordsCell.swift | 2 +- .../Class/Store/V/NROrderRecordsCell.swift | 2 +- .../Class/Store/V/NRRewardCoinsCell.swift | 2 +- .../Class/Store/V/NRStoreCoinsBigCell.swift | 2 +- .../Class/Store/V/NRStoreCoinsCell.swift | 2 +- .../Class/Store/V/NRStoreCoinsPackCell.swift | 2 +- .../Class/Store/V/NRStoreCoinsSmallCell.swift | 2 +- .../Class/Store/V/NRStoreCoinsView.swift | 2 +- ReaderHive/Class/Store/V/NRStoreVipCell.swift | 44 +++- ReaderHive/Class/Store/V/NRStoreVipView.swift | 2 +- ReaderHive/Class/Store/V/NRWalletCell.swift | 2 +- .../Class/Store/V/NRWalletHeaderView.swift | 2 +- .../NRConsumptionRecordsViewController.swift | 2 +- .../VC/NROrderRecordsPageViewController.swift | 2 +- .../VC/NROrderRecordsViewController.swift | 2 +- .../VC/NRRewardCoinsViewController.swift | 2 +- .../Store/VC/NRStoreViewController.swift | 2 +- .../Store/VC/NRWalletViewController.swift | 2 +- ReaderHive/Delegate/AppDelegate+APNS.swift | 109 +++++++++ ReaderHive/Delegate/AppDelegate+Config.swift | 34 ++- ReaderHive/Delegate/AppDelegate+Open.swift | 85 ++++++- ReaderHive/Delegate/AppDelegate.swift | 6 +- ReaderHive/Delegate/SceneDelegate.swift | 78 +++++- ReaderHive/Libs/Alert/NRAlert.swift | 28 ++- .../Libs/Alert/NRAlertWindowManager.swift | 2 +- ReaderHive/Libs/Alert/NRBaseAlert.swift | 2 +- ReaderHive/Libs/Alert/NRCoinsPackAlert.swift | 89 +++++++ ReaderHive/Libs/Alert/NRUpdatesAlert.swift | 1 + ReaderHive/Libs/DeviceId/NRDeviceId.swift | 2 +- ReaderHive/Libs/DeviceId/NRKeychain.swift | 2 +- ReaderHive/Libs/Empty/NREmpty.swift | 24 +- ReaderHive/Libs/Hud/NRHud.swift | 2 +- ReaderHive/Libs/Hud/NRToast.swift | 2 +- ReaderHive/Libs/IAP/NRIAPOrderModel.swift | 2 +- ReaderHive/Libs/IAP/NRIAPVerifyModel.swift | 2 +- ReaderHive/Libs/IAP/NRIapManager.swift | 21 +- ReaderHive/Libs/IAP/NRPayDataRequest.swift | 2 +- ReaderHive/Libs/IAP/NRWaitRestoreModel.swift | 2 +- .../Libs/KeyedArchiver/NRKeyedArchiver.swift | 2 +- .../LocalizedManager/NRLocalizedManager.swift | 2 +- .../LocalizedManager/NRLocalizedModel.swift | 2 +- ReaderHive/Libs/Login/NRLoginManager.swift | 14 +- ReaderHive/Libs/Login/NRLoginToken.swift | 2 +- ReaderHive/Libs/Login/NRUserInfo.swift | 2 +- ReaderHive/Libs/NovelTool/NRCoreText.swift | 2 +- .../Libs/NovelTool/NRNovelReadSet.swift | 2 +- .../NovelTool/NRNovelReadSetManager.swift | 3 +- ReaderHive/Libs/NovelTool/NRReadParser.swift | 2 +- ReaderHive/Libs/Tool/NROpenAppManager.swift | 66 ++++++ ReaderHive/Libs/Tool/NROpenAppModel.swift | 25 ++ ReaderHive/Libs/Tool/NRTool.swift | 43 +++- .../NRWaterfallFlowLayout.swift | 2 +- ReaderHive/ReaderHive.entitlements | 6 + .../Color/#FF313B.colorset/Contents.json | 20 ++ .../alert_top_icon_04.imageset/Contents.json | 22 ++ .../alert_top_icon_04.imageset/delete@2x.png | Bin 0 -> 88673 bytes .../alert_top_icon_04.imageset/delete@3x.png | Bin 0 -> 184002 bytes .../alert_top_icon_05.imageset/Contents.json | 22 ++ .../alert_top_icon_05.imageset/checkin@2x.png | Bin 0 -> 111076 bytes .../alert_top_icon_05.imageset/checkin@3x.png | Bin 0 -> 224643 bytes .../alert_top_icon_06.imageset/Contents.json | 22 ++ .../alert_top_icon_06.imageset/notify@2x.png | Bin 0 -> 93353 bytes .../alert_top_icon_06.imageset/notify@3x.png | Bin 0 -> 189601 bytes .../coins_icon_07.imageset/Contents.json | 22 ++ .../Image/coins_icon_07.imageset/金币@2x.png | Bin 0 -> 5043 bytes .../Image/coins_icon_07.imageset/金币@3x.png | Bin 0 -> 10179 bytes .../empty_image_02.imageset/Contents.json | 22 ++ .../Frame 2072750545@2x.png | Bin 0 -> 23123 bytes .../Frame 2072750545@3x.png | Bin 0 -> 41312 bytes .../Contents.json | 5 + .../反馈记录@2x.png | Bin 0 -> 476 bytes .../反馈记录@3x.png | Bin 0 -> 614 bytes ReaderHive/Source/GoogleService-Info.plist | 30 +++ ReaderHive/Source/Info.plist | 2 + .../Source/en.lproj/Localizable.strings | 13 +- .../JXIAPManager/JXIAPManager.swift | 223 ------------------ .../App Store Connect API/ReaderHive_auth.json | 5 + .../App Store Connect API/connect_2HBVC6WYPG.p8 | 6 + 账号信息/团队密钥/AuthKey_2HBVC6WYPG.p8 | 6 + 账号信息/推送证书/AuthKey_3VK895UWKL.p8 | 6 + 账号信息/账号信息.txt | 1 + 245 files changed, 1754 insertions(+), 535 deletions(-) create mode 100644 ReaderHive/Base/Networking/API/NRStatAPI.swift create mode 100644 ReaderHive/Base/VC/NRAppStartViewController.swift create mode 100644 ReaderHive/Class/Me/M/NRFeedbackCountModel.swift create mode 100644 ReaderHive/Class/Store/M/NRCoinPackCanReceiveModel.swift create mode 100644 ReaderHive/Delegate/AppDelegate+APNS.swift create mode 100644 ReaderHive/Libs/Alert/NRCoinsPackAlert.swift create mode 100644 ReaderHive/Libs/Tool/NROpenAppManager.swift create mode 100644 ReaderHive/Libs/Tool/NROpenAppModel.swift create mode 100644 ReaderHive/Source/Assets.xcassets/Color/#FF313B.colorset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/alert_top_icon_04.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/alert_top_icon_04.imageset/delete@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/alert_top_icon_04.imageset/delete@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/alert_top_icon_05.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/alert_top_icon_05.imageset/checkin@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/alert_top_icon_05.imageset/checkin@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/alert_top_icon_06.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/alert_top_icon_06.imageset/notify@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/alert_top_icon_06.imageset/notify@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/coins_icon_07.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/coins_icon_07.imageset/金币@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/coins_icon_07.imageset/金币@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/empty_image_02.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/empty_image_02.imageset/Frame 2072750545@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/empty_image_02.imageset/Frame 2072750545@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/feedback_list_icon_01.imageset/反馈记录@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/feedback_list_icon_01.imageset/反馈记录@3x.png create mode 100644 ReaderHive/Source/GoogleService-Info.plist delete mode 100644 ReaderHive/Thirdparty/JXIAPManager/JXIAPManager.swift create mode 100644 账号信息/App Store Connect API/ReaderHive_auth.json create mode 100644 账号信息/App Store Connect API/connect_2HBVC6WYPG.p8 create mode 100644 账号信息/团队密钥/AuthKey_2HBVC6WYPG.p8 create mode 100644 账号信息/推送证书/AuthKey_3VK895UWKL.p8 create mode 100644 账号信息/账号信息.txt diff --git a/Podfile b/Podfile index fdf432b..7f10687 100644 --- a/Podfile +++ b/Podfile @@ -33,6 +33,9 @@ target 'ReaderHive' do pod 'Toast' pod 'SVProgressHUD' pod 'FDFullscreenPopGesture' - pod 'ZLPhotoBrowser' + pod 'JXIAPManager', :git => 'https://git.qinjiu8.com/zengjx/JXIAPManager.git', :tag => '0.0.1' + pod 'Adjust' + + end diff --git a/ReaderHive.xcodeproj/project.pbxproj b/ReaderHive.xcodeproj/project.pbxproj index cabe89d..2c5a993 100644 --- a/ReaderHive.xcodeproj/project.pbxproj +++ b/ReaderHive.xcodeproj/project.pbxproj @@ -111,6 +111,17 @@ 85CF944B2EF004D3006467E3 /* NRMyUnlocksCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF94482EF004D3006467E3 /* NRMyUnlocksCell.swift */; }; 85CF944D2EF0EC00006467E3 /* NRVersionUpdateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF944C2EF0EC00006467E3 /* NRVersionUpdateModel.swift */; }; 85CF944F2EF0F04D006467E3 /* NRUpdatesAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF944E2EF0F04D006467E3 /* NRUpdatesAlert.swift */; }; + 85CF94522EF14FBD006467E3 /* NROpenAppManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF94512EF14FA3006467E3 /* NROpenAppManager.swift */; }; + 85CF94542EF151E4006467E3 /* NRAppStartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF94532EF151E4006467E3 /* NRAppStartViewController.swift */; }; + 85CF94562EF15F7C006467E3 /* NRFeedbackCountModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF94552EF15F7C006467E3 /* NRFeedbackCountModel.swift */; }; + 85CF94582EF25694006467E3 /* NRCoinPackCanReceiveModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF94572EF25694006467E3 /* NRCoinPackCanReceiveModel.swift */; }; + 85CF945A2EF257B9006467E3 /* NRCoinsPackAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF94592EF257B9006467E3 /* NRCoinsPackAlert.swift */; }; + 85CF945C2EF28433006467E3 /* NROpenAppModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF945B2EF28433006467E3 /* NROpenAppModel.swift */; }; + 85CF945E2EF285D5006467E3 /* NRStatAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF945D2EF285D2006467E3 /* NRStatAPI.swift */; }; + 85CF94612EF2A347006467E3 /* FirebaseMessaging in Frameworks */ = {isa = PBXBuildFile; productRef = 85CF94602EF2A347006467E3 /* FirebaseMessaging */; }; + 85CF94632EF2A347006467E3 /* FirebasePerformance in Frameworks */ = {isa = PBXBuildFile; productRef = 85CF94622EF2A347006467E3 /* FirebasePerformance */; }; + 85CF94652EF2A3D9006467E3 /* AppDelegate+APNS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF94642EF2A3D3006467E3 /* AppDelegate+APNS.swift */; }; + 85CF94672EF2A81D006467E3 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 85CF94662EF2A81D006467E3 /* GoogleService-Info.plist */; }; F34348AF2ED5B85300AA7E70 /* NRExploreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34348AE2ED5B85300AA7E70 /* NRExploreViewController.swift */; }; F34348B12ED5B9A400AA7E70 /* NRExploreNovelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34348B02ED5B9A400AA7E70 /* NRExploreNovelViewController.swift */; }; F34348B32ED5BB6100AA7E70 /* NRExploreNovelMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34348B22ED5BB6100AA7E70 /* NRExploreNovelMenuView.swift */; }; @@ -213,7 +224,6 @@ F3B859442EE902BF0095A9CC /* NRStoreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859432EE902BF0095A9CC /* NRStoreViewController.swift */; }; F3B8594C2EE904980095A9CC /* NRPayDateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8594B2EE904980095A9CC /* NRPayDateModel.swift */; }; F3B8594E2EE905A70095A9CC /* NRStoreAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8594D2EE905A40095A9CC /* NRStoreAPI.swift */; }; - F3B859522EE906A90095A9CC /* JXIAPManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859512EE906A80095A9CC /* JXIAPManager.swift */; }; F3B859572EE9072C0095A9CC /* NRIapManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859562EE907280095A9CC /* NRIapManager.swift */; }; F3B859592EE9073B0095A9CC /* NRIAPOrderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B859582EE907350095A9CC /* NRIAPOrderModel.swift */; }; F3B8595B2EE907600095A9CC /* NRWaitRestoreModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B8595A2EE907600095A9CC /* NRWaitRestoreModel.swift */; }; @@ -357,6 +367,15 @@ 85CF94492EF004D3006467E3 /* NRMyUnlocksCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NRMyUnlocksCell.xib; sourceTree = ""; }; 85CF944C2EF0EC00006467E3 /* NRVersionUpdateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRVersionUpdateModel.swift; sourceTree = ""; }; 85CF944E2EF0F04D006467E3 /* NRUpdatesAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRUpdatesAlert.swift; sourceTree = ""; }; + 85CF94512EF14FA3006467E3 /* NROpenAppManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NROpenAppManager.swift; sourceTree = ""; }; + 85CF94532EF151E4006467E3 /* NRAppStartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRAppStartViewController.swift; sourceTree = ""; }; + 85CF94552EF15F7C006467E3 /* NRFeedbackCountModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRFeedbackCountModel.swift; sourceTree = ""; }; + 85CF94572EF25694006467E3 /* NRCoinPackCanReceiveModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRCoinPackCanReceiveModel.swift; sourceTree = ""; }; + 85CF94592EF257B9006467E3 /* NRCoinsPackAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRCoinsPackAlert.swift; sourceTree = ""; }; + 85CF945B2EF28433006467E3 /* NROpenAppModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NROpenAppModel.swift; sourceTree = ""; }; + 85CF945D2EF285D2006467E3 /* NRStatAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStatAPI.swift; sourceTree = ""; }; + 85CF94642EF2A3D3006467E3 /* AppDelegate+APNS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+APNS.swift"; sourceTree = ""; }; + 85CF94662EF2A81D006467E3 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; C3BEE224CB3F55939653D26D /* Pods-NovelReader.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NovelReader.debug.xcconfig"; path = "Target Support Files/Pods-NovelReader/Pods-NovelReader.debug.xcconfig"; sourceTree = ""; }; F34348AE2ED5B85300AA7E70 /* NRExploreViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRExploreViewController.swift; sourceTree = ""; }; F34348B02ED5B9A400AA7E70 /* NRExploreNovelViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRExploreNovelViewController.swift; sourceTree = ""; }; @@ -460,7 +479,6 @@ F3B859432EE902BF0095A9CC /* NRStoreViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStoreViewController.swift; sourceTree = ""; }; F3B8594B2EE904980095A9CC /* NRPayDateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRPayDateModel.swift; sourceTree = ""; }; F3B8594D2EE905A40095A9CC /* NRStoreAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRStoreAPI.swift; sourceTree = ""; }; - F3B859512EE906A80095A9CC /* JXIAPManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JXIAPManager.swift; sourceTree = ""; }; F3B859562EE907280095A9CC /* NRIapManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRIapManager.swift; sourceTree = ""; }; F3B859582EE907350095A9CC /* NRIAPOrderModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRIAPOrderModel.swift; sourceTree = ""; }; F3B8595A2EE907600095A9CC /* NRWaitRestoreModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRWaitRestoreModel.swift; sourceTree = ""; }; @@ -499,7 +517,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 85CF94612EF2A347006467E3 /* FirebaseMessaging in Frameworks */, 85CF94372EEFE27E006467E3 /* FacebookLogin in Frameworks */, + 85CF94632EF2A347006467E3 /* FirebasePerformance in Frameworks */, 67DC33BD353DB9F2D4C0FFE8 /* Pods_ReaderHive.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -510,6 +530,7 @@ 0373D93C2ED578FC0017DCC7 /* API */ = { isa = PBXGroup; children = ( + 85CF945D2EF285D2006467E3 /* NRStatAPI.swift */, F3B8594D2EE905A40095A9CC /* NRStoreAPI.swift */, F34991022EE160E50039E939 /* NRUserAPI.swift */, F343492B2EDE72EE00AA7E70 /* NRHomeAPI.swift */, @@ -635,6 +656,7 @@ children = ( 03980F7E2ED009EB0006E317 /* Assets.xcassets */, 03980F7F2ED009EB0006E317 /* Info.plist */, + 85CF94662EF2A81D006467E3 /* GoogleService-Info.plist */, 03980F812ED009EB0006E317 /* LaunchScreen.storyboard */, 039810712ED053BE0006E317 /* Localizable.strings */, ); @@ -648,6 +670,7 @@ 03980F842ED009EB0006E317 /* SceneDelegate.swift */, 0398107B2ED0551C0006E317 /* AppDelegate+Config.swift */, 85CF943A2EEFE947006467E3 /* AppDelegate+Open.swift */, + 85CF94642EF2A3D3006467E3 /* AppDelegate+APNS.swift */, ); path = Delegate; sourceTree = ""; @@ -685,6 +708,7 @@ 0398105B2ED047FE0006E317 /* NRTabBarController.swift */, 0398105D2ED0481E0006E317 /* NRNavigationController.swift */, 0398108F2ED060EF0006E317 /* NRViewController.swift */, + 85CF94532EF151E4006467E3 /* NRAppStartViewController.swift */, ); path = VC; sourceTree = ""; @@ -794,6 +818,8 @@ isa = PBXGroup; children = ( 039810972ED066B20006E317 /* NRTool.swift */, + 85CF94512EF14FA3006467E3 /* NROpenAppManager.swift */, + 85CF945B2EF28433006467E3 /* NROpenAppModel.swift */, ); path = Tool; sourceTree = ""; @@ -1047,6 +1073,7 @@ F34991042EE165EA0039E939 /* NRMeItem.swift */, F3B8593B2EE677170095A9CC /* NRLanguageModel.swift */, 85CF944C2EF0EC00006467E3 /* NRVersionUpdateModel.swift */, + 85CF94552EF15F7C006467E3 /* NRFeedbackCountModel.swift */, ); path = M; sourceTree = ""; @@ -1113,6 +1140,7 @@ children = ( F34991222EE26EAC0039E939 /* NRAlert.swift */, 85CF944E2EF0F04D006467E3 /* NRUpdatesAlert.swift */, + 85CF94592EF257B9006467E3 /* NRCoinsPackAlert.swift */, F349911E2EE26C350039E939 /* NRAlertWindowManager.swift */, F34991202EE26C660039E939 /* NRBaseAlert.swift */, ); @@ -1175,6 +1203,7 @@ F3B859922EEA63CD0095A9CC /* NROrderRecordsModel.swift */, 85CF941C2EEBFEA6006467E3 /* NRCoinsPackModel.swift */, 85CF941E2EEBFECF006467E3 /* NRCoinsPackReceiveModel.swift */, + 85CF94572EF25694006467E3 /* NRCoinPackCanReceiveModel.swift */, ); path = M; sourceTree = ""; @@ -1196,19 +1225,10 @@ F3B8594F2EE9068E0095A9CC /* Thirdparty */ = { isa = PBXGroup; children = ( - F3B859502EE906A40095A9CC /* JXIAPManager */, ); path = Thirdparty; sourceTree = ""; }; - F3B859502EE906A40095A9CC /* JXIAPManager */ = { - isa = PBXGroup; - children = ( - F3B859512EE906A80095A9CC /* JXIAPManager.swift */, - ); - path = JXIAPManager; - sourceTree = ""; - }; F3B859552EE907220095A9CC /* IAP */ = { isa = PBXGroup; children = ( @@ -1270,6 +1290,7 @@ minimizedProjectReferenceProxies = 1; packageReferences = ( 85CF94352EEFE27E006467E3 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */, + 85CF945F2EF2A347006467E3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, ); preferredProjectObjectVersion = 77; productRefGroup = 03980F662ED009E30006E317 /* Products */; @@ -1292,6 +1313,7 @@ F3B859872EE972F70095A9CC /* NRConsumptionRecordsCell.xib in Resources */, 03980F8C2ED009EB0006E317 /* LaunchScreen.storyboard in Resources */, 85CF944A2EF004D3006467E3 /* NRMyUnlocksCell.xib in Resources */, + 85CF94672EF2A81D006467E3 /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1372,6 +1394,7 @@ 85CF94212EEC050D006467E3 /* NRCoinsPackBuyView.swift in Sources */, F3B8595F2EE910020095A9CC /* NRPayDataRequest.swift in Sources */, F3B859692EE91BD70095A9CC /* NRStoreCoinsPackCell.swift in Sources */, + 85CF945E2EF285D5006467E3 /* NRStatAPI.swift in Sources */, F34991102EE1708C0039E939 /* NRWebViewController+Script.swift in Sources */, F34348B12ED5B9A400AA7E70 /* NRExploreNovelViewController.swift in Sources */, F34348BF2ED691C100AA7E70 /* NRExploreNovelGenresViewController.swift in Sources */, @@ -1403,6 +1426,7 @@ 85CF94272EED1734006467E3 /* NRHomeCoinsPackButton.swift in Sources */, F34991012EE1593A0039E939 /* NRMeHeaderView.swift in Sources */, F3B8598F2EEA5B1C0095A9CC /* NROrderRecordsPageViewController.swift in Sources */, + 85CF94542EF151E4006467E3 /* NRAppStartViewController.swift in Sources */, F34991052EE165EA0039E939 /* NRMeItem.swift in Sources */, 039810CC2ED477CD0006E317 /* UIView+NRAdd.swift in Sources */, F3B859312EE66B950095A9CC /* NRDetailRechargeView.swift in Sources */, @@ -1414,8 +1438,10 @@ F3B8595B2EE907600095A9CC /* NRWaitRestoreModel.swift in Sources */, 039810CA2ED469D50006E317 /* NRWaterfallFlowLayout.swift in Sources */, F34348F72ED84B0D00AA7E70 /* NRNovelReaderViewController+Page.swift in Sources */, + 85CF94582EF25694006467E3 /* NRCoinPackCanReceiveModel.swift in Sources */, 039810902ED060EF0006E317 /* NRViewController.swift in Sources */, 039810702ED053910006E317 /* String+NRAdd.swift in Sources */, + 85CF94652EF2A3D9006467E3 /* AppDelegate+APNS.swift in Sources */, 039810932ED062CE0006E317 /* NRHomeViewController.swift in Sources */, F3B859652EE91BB70095A9CC /* NRStoreCoinsBigCell.swift in Sources */, 039810BC2ED43C8E0006E317 /* NRReadWhatViewTransformer.swift in Sources */, @@ -1450,6 +1476,7 @@ 85606A9C2EEBE243005D989D /* NRCoinsPackHeaderView.swift in Sources */, F34349102ED9A77A00AA7E70 /* NRPanModalContentView.swift in Sources */, F3B859892EE97E1F0095A9CC /* NRRewardCoinsViewController.swift in Sources */, + 85CF945C2EF28433006467E3 /* NROpenAppModel.swift in Sources */, 039810CE2ED47A130006E317 /* CGMutablePath+NRRoundedCorner.swift in Sources */, F34348E72ED7F91C00AA7E70 /* NSNumber+NRAdd.swift in Sources */, F3B8597F2EE96F810095A9CC /* NRConsumptionRecordsViewController.swift in Sources */, @@ -1473,9 +1500,9 @@ F3B859372EE6750B0095A9CC /* NRLanguageViewController.swift in Sources */, F34348E12ED70A2700AA7E70 /* NRNovelDetailHeaderView+NovelCoverInfo.swift in Sources */, 85CF94292EED4664006467E3 /* NRVipRetainAlert.swift in Sources */, - F3B859522EE906A90095A9CC /* JXIAPManager.swift in Sources */, F34349012ED93A9B00AA7E70 /* NRReadChapterModel.swift in Sources */, F34348DF2ED7049E00AA7E70 /* NRNovelDetailHeaderView.swift in Sources */, + 85CF94562EF15F7C006467E3 /* NRFeedbackCountModel.swift in Sources */, F34348BB2ED5CD8100AA7E70 /* NRExploreNovelMenuItem.swift in Sources */, 0398109B2ED0692A0006E317 /* NRImageView.swift in Sources */, 0398108A2ED0582F0006E317 /* NRDeviceId.swift in Sources */, @@ -1549,10 +1576,12 @@ F3B8597D2EE9627B0095A9CC /* NRWalletHeaderView.swift in Sources */, 039810872ED057260006E317 /* NRUserDefaultsKey.swift in Sources */, F34349222EDD227A00AA7E70 /* NRReadSettingSpacingView.swift in Sources */, + 85CF94522EF14FBD006467E3 /* NROpenAppManager.swift in Sources */, 85606A902EEBA8F3005D989D /* NRCoinsPackConfirmView.swift in Sources */, F34990F32EE02FD60039E939 /* NRNovelReadFinishViewController.swift in Sources */, F34348F92ED855AA00AA7E70 /* NRNovelReadContentViewController.swift in Sources */, 039810A42ED072380006E317 /* NRHomeNovelListViewController.swift in Sources */, + 85CF945A2EF257B9006467E3 /* NRCoinsPackAlert.swift in Sources */, 039810BE2ED44C210006E317 /* NRHomeNovelHotGridView.swift in Sources */, F3B859672EE91BC50095A9CC /* NRStoreCoinsSmallCell.swift in Sources */, F3B859392EE676610095A9CC /* NRLanguageCell.swift in Sources */, @@ -1622,6 +1651,7 @@ INFOPLIST_KEY_LSApplicationCategoryType = ""; INFOPLIST_KEY_NSCameraUsageDescription = "The APP needs to access your album to provide screenshots for feedback."; INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "The APP needs to access your album to provide screenshots for feedback."; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "We will use your advertising identifier (IDFA) to provide a personalized advertising experience."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = ""; @@ -1632,7 +1662,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = com.lssj.ReaderHive; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1666,6 +1696,7 @@ INFOPLIST_KEY_LSApplicationCategoryType = ""; INFOPLIST_KEY_NSCameraUsageDescription = "The APP needs to access your album to provide screenshots for feedback."; INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "The APP needs to access your album to provide screenshots for feedback."; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "We will use your advertising identifier (IDFA) to provide a personalized advertising experience."; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = ""; @@ -1676,7 +1707,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = com.lssj.ReaderHive; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1845,6 +1876,14 @@ minimumVersion = 14.1.0; }; }; + 85CF945F2EF2A347006467E3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/firebase/firebase-ios-sdk"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 12.7.0; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -1853,6 +1892,16 @@ package = 85CF94352EEFE27E006467E3 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; productName = FacebookLogin; }; + 85CF94602EF2A347006467E3 /* FirebaseMessaging */ = { + isa = XCSwiftPackageProductDependency; + package = 85CF945F2EF2A347006467E3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseMessaging; + }; + 85CF94622EF2A347006467E3 /* FirebasePerformance */ = { + isa = XCSwiftPackageProductDependency; + package = 85CF945F2EF2A347006467E3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebasePerformance; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 03980F5D2ED009E30006E317 /* Project object */; diff --git a/ReaderHive/Base/Define/NRDefine.swift b/ReaderHive/Base/Define/NRDefine.swift index afb3c03..268f200 100644 --- a/ReaderHive/Base/Define/NRDefine.swift +++ b/ReaderHive/Base/Define/NRDefine.swift @@ -2,7 +2,7 @@ // NRDefine.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/Define/NRUserDefaultsKey.swift b/ReaderHive/Base/Define/NRUserDefaultsKey.swift index f2239e0..f206bf4 100644 --- a/ReaderHive/Base/Define/NRUserDefaultsKey.swift +++ b/ReaderHive/Base/Define/NRUserDefaultsKey.swift @@ -2,7 +2,7 @@ // NRUserDefaultsKey.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // ///登录token @@ -15,3 +15,7 @@ let kNRNovelReadSetDefaultsKey = "kNRNovelReadSetDefaultsKey" let kNRWaitRestoreIAPDefaultsKey = "kNRWaitRestoreIAPDefaultsKey" let kNRVersionUpdateAlertDefaultsKey = "kNRVersionUpdateAlertDefaultsKey" + +let kNRHasFirstOpenedAPPDefaultsKey = "kNRHasFirstOpenedAPPDefaultsKey" + +let kNRApnsAlertDefaultsKey = "kNRApnsAlertDefaultsKey" diff --git a/ReaderHive/Base/Extension/CGMutablePath+NRRoundedCorner.swift b/ReaderHive/Base/Extension/CGMutablePath+NRRoundedCorner.swift index 6a5a7ec..a88bf10 100644 --- a/ReaderHive/Base/Extension/CGMutablePath+NRRoundedCorner.swift +++ b/ReaderHive/Base/Extension/CGMutablePath+NRRoundedCorner.swift @@ -2,7 +2,7 @@ // CGMutablePath+NRRoundedCorner.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Base/Extension/Dictionary+NRAdd.swift b/ReaderHive/Base/Extension/Dictionary+NRAdd.swift index 6f0451c..930b888 100644 --- a/ReaderHive/Base/Extension/Dictionary+NRAdd.swift +++ b/ReaderHive/Base/Extension/Dictionary+NRAdd.swift @@ -2,7 +2,7 @@ // Dictionary+NRAdd.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/10. +// Created by 澜声世纪 on 2025/12/10. // import UIKit diff --git a/ReaderHive/Base/Extension/NSNumber+NRAdd.swift b/ReaderHive/Base/Extension/NSNumber+NRAdd.swift index 2cb1682..ca9e24b 100644 --- a/ReaderHive/Base/Extension/NSNumber+NRAdd.swift +++ b/ReaderHive/Base/Extension/NSNumber+NRAdd.swift @@ -2,7 +2,7 @@ // NSNumber+NRAdd.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/27. +// Created by 澜声世纪 on 2025/11/27. // import UIKit diff --git a/ReaderHive/Base/Extension/String+NRAdd.swift b/ReaderHive/Base/Extension/String+NRAdd.swift index 778226e..96fc8fb 100644 --- a/ReaderHive/Base/Extension/String+NRAdd.swift +++ b/ReaderHive/Base/Extension/String+NRAdd.swift @@ -2,7 +2,7 @@ // String+NRAdd.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit import YYCategories @@ -42,3 +42,23 @@ extension String { } catch {return []} } } + +extension String { + + ///将url中的参数转换成字典 + func nr_urlQuryToDictionary() -> [String : Any] { + let array = self.components(separatedBy: "&") + var tempDic: [String : Any] = [:] + + array.forEach { + if let strRange = $0.range(of: "=") { + var key: String = String($0.prefix(upTo: strRange.upperBound)) + key.removeLast() + var value: String = String($0.suffix(from: strRange.upperBound)) + value = value.removingPercentEncoding ?? value + tempDic[key] = value + } + } + return tempDic + } +} diff --git a/ReaderHive/Base/Extension/UIFont+NRAdd.swift b/ReaderHive/Base/Extension/UIFont+NRAdd.swift index 308d6d9..9fcd69a 100644 --- a/ReaderHive/Base/Extension/UIFont+NRAdd.swift +++ b/ReaderHive/Base/Extension/UIFont+NRAdd.swift @@ -2,7 +2,7 @@ // UIFont+NRAdd.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/Extension/UINavigationBar+NRAdd.swift b/ReaderHive/Base/Extension/UINavigationBar+NRAdd.swift index c6557fb..5e30ffc 100644 --- a/ReaderHive/Base/Extension/UINavigationBar+NRAdd.swift +++ b/ReaderHive/Base/Extension/UINavigationBar+NRAdd.swift @@ -2,7 +2,7 @@ // UINavigationBar+NRAdd.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Base/Extension/UIScreen+NRAdd.swift b/ReaderHive/Base/Extension/UIScreen+NRAdd.swift index 6dfd6be..2e27636 100644 --- a/ReaderHive/Base/Extension/UIScreen+NRAdd.swift +++ b/ReaderHive/Base/Extension/UIScreen+NRAdd.swift @@ -2,7 +2,7 @@ // UIScreen+NRAdd.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/Extension/UIScrollView+Refresh.swift b/ReaderHive/Base/Extension/UIScrollView+Refresh.swift index 03fb610..db838ea 100644 --- a/ReaderHive/Base/Extension/UIScrollView+Refresh.swift +++ b/ReaderHive/Base/Extension/UIScrollView+Refresh.swift @@ -2,7 +2,7 @@ // UIScrollView+Refresh.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/2. +// Created by 澜声世纪 on 2025/12/2. // import UIKit diff --git a/ReaderHive/Base/Extension/UIStackView+NRAdd.swift b/ReaderHive/Base/Extension/UIStackView+NRAdd.swift index 8ec4763..80a160a 100644 --- a/ReaderHive/Base/Extension/UIStackView+NRAdd.swift +++ b/ReaderHive/Base/Extension/UIStackView+NRAdd.swift @@ -2,7 +2,7 @@ // UIStackView+NRAdd.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Base/Extension/UIView+NRAdd.swift b/ReaderHive/Base/Extension/UIView+NRAdd.swift index e092d34..694baaa 100644 --- a/ReaderHive/Base/Extension/UIView+NRAdd.swift +++ b/ReaderHive/Base/Extension/UIView+NRAdd.swift @@ -2,7 +2,7 @@ // UIView+NRAdd.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Base/Extension/UserDefaults+NRAdd.swift b/ReaderHive/Base/Extension/UserDefaults+NRAdd.swift index 3cd881a..80745da 100644 --- a/ReaderHive/Base/Extension/UserDefaults+NRAdd.swift +++ b/ReaderHive/Base/Extension/UserDefaults+NRAdd.swift @@ -2,7 +2,7 @@ // UserDefaults+NRAdd.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/Networking/API/NRHomeAPI.swift b/ReaderHive/Base/Networking/API/NRHomeAPI.swift index 8f08836..894d1fb 100644 --- a/ReaderHive/Base/Networking/API/NRHomeAPI.swift +++ b/ReaderHive/Base/Networking/API/NRHomeAPI.swift @@ -2,7 +2,7 @@ // NRHomeAPI.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/2. +// Created by 澜声世纪 on 2025/12/2. // import UIKit diff --git a/ReaderHive/Base/Networking/API/NRNovelAPI.swift b/ReaderHive/Base/Networking/API/NRNovelAPI.swift index 5d3c0c2..a343c4e 100644 --- a/ReaderHive/Base/Networking/API/NRNovelAPI.swift +++ b/ReaderHive/Base/Networking/API/NRNovelAPI.swift @@ -2,7 +2,7 @@ // NRNovelAPI.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit @@ -233,6 +233,26 @@ struct NRNovelAPI { } } + static func requestMyUnlock(page: Int) async -> [NRNovelModel]? { + await withCheckedContinuation { continuation in + var param = NRNetwork.Parameters(path: "/novel/purchasedNovels") + param.method = .get + param.parameters = [ + "current_page" : page, + "page_size" : 20 + ] + + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response>) in + if response.isSuccess { + continuation.resume(returning: response.data?.list) + } else { + continuation.resume(returning: nil) + } + } + } + } + } diff --git a/ReaderHive/Base/Networking/API/NRSettingAPI.swift b/ReaderHive/Base/Networking/API/NRSettingAPI.swift index 7e893cf..c9adc2e 100644 --- a/ReaderHive/Base/Networking/API/NRSettingAPI.swift +++ b/ReaderHive/Base/Networking/API/NRSettingAPI.swift @@ -2,7 +2,7 @@ // NRSettingAPI.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/8. +// Created by 澜声世纪 on 2025/12/8. // import UIKit @@ -61,4 +61,24 @@ struct NRSettingAPI { } } + ///获取反馈红点数量 + static func requestFeedbackRedCount() async -> NRFeedbackCountModel? { + + await withCheckedContinuation { continuation in + var param = NRNetwork.Parameters(path: "/noticeNum") + param.method = .post + param.isToast = false + param.isLoding = false + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in + if response.isSuccess { + continuation.resume(returning: response.data) + } else { + continuation.resume(returning: nil) + } + } + } + + } + } diff --git a/ReaderHive/Base/Networking/API/NRStatAPI.swift b/ReaderHive/Base/Networking/API/NRStatAPI.swift new file mode 100644 index 0000000..90962e4 --- /dev/null +++ b/ReaderHive/Base/Networking/API/NRStatAPI.swift @@ -0,0 +1,171 @@ +// +// NRStatAPI.swift +// ReaderHive +// +// Created by 澜声世纪 on 2025/12/17. +// + +import UIKit +import Alamofire + +struct NRStatAPI { + + enum EventKey: String { + case payError = "pay_error" //支付过程中的其它错误 + case payCallback = "pay_callback" //支付成功,但是后台接口失败 + case payRestore = "pay_restore" //restore 失败 + case forceUpdate = "force_update"//更新弹窗 + case payCancel = "pay_cancel" //用户取消支付 + case payTemplateDialog = "pay_template_dialog"//详情页面弹出支付模版事件 + } + + ///统计w2a点击 + static func nr_requestStatW2a(data: String) { + + let parameters = [ + "data" : data + ] + + var param = NRNetwork.Parameters(path: "/w2aSelfAttribution") + param.method = .post + param.isLoding = false + param.isToast = false + param.parameters = parameters + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in } + } + + ///事件统计 + static func nr_requestEventStat(orderCode: String?, shortPlayId: String?, videoId: String?, eventKey: EventKey, errorMsg: String?, otherParamenters: [String : Any]? = nil) { + + var eventName = "" + switch eventKey { + case .payRestore: + eventName = "pay restore" + + case .payCallback: + eventName = "pay callback failed" + + case .forceUpdate: + eventName = "force update" + + case .payCancel: + eventName = "user pay canceled" + + default: + eventName = "platform pay failed" + } + + var parameters: [String : Any] = [ + "userId" : NRLoginManager.manager.userInfo?.customer_id ?? "", + "short_play_video_id" : videoId ?? "0", + "short_play_id" : shortPlayId ?? "0", + "event_key" : eventKey.rawValue, + "order_code": orderCode ?? "", + "event_name" : eventName, + ] + + if let errorMsg = errorMsg { + parameters["error_msg"] = errorMsg + } + + + if let otherParamenters = otherParamenters { + otherParamenters.forEach { + parameters[$0] = $1 + } + } + + var param = NRNetwork.Parameters(path: "/event/add") + param.method = .post + param.isLoding = false + param.isToast = false + param.parameters = parameters + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in } + } + + ///进入APP + static func nr_requestEnterApp() { + var param = NRNetwork.Parameters(path: "/customer/enterTheApp") + param.method = .post + param.isLoding = false + param.isToast = false + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in } + } + + ///离开APP + static func nr_requestLeaveApp() { + var param = NRNetwork.Parameters(path: "/customer/leaveApp") + param.method = .post + param.isLoding = false + param.isToast = false + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in } + } + + static func nr_requestStatOnLine() { + var param = NRNetwork.Parameters(path: "/customer/onLine") + param.method = .post + param.isLoding = false + param.isToast = false + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in } + } + + static func nr_requestUploadApnsAuthorizationStatus(_ status: Bool) { + let parameters = [ + "is_open_notice" : status ? 1 : 0 + ] + var param = NRNetwork.Parameters(path: "/customer/uploadNoticeStatus") + param.method = .post + param.isLoding = false + param.isToast = false + param.parameters = parameters + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in } + } + + static func nr_requestStatApnsClick(id: String, title: String) { + let parameters = [ + "message_id" : id, + "title" : title + ] + + var param = NRNetwork.Parameters(path: "/message/sendReport") + param.method = .post + param.isLoding = false + param.isToast = false + param.parameters = parameters + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in } + } + + static func nr_requestUploadApnsDeviceToken(token: String) { + let parameters = [ + "fcm_token": token + ] + + var param = NRNetwork.Parameters(path: "/customer/firebaseToken") + param.method = .post + param.isLoding = false + param.isToast = false + param.parameters = parameters + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in } + } +} + +extension NRStatAPI { + ///更新通知状态 + static func nr_uploadApnsAuthorizationStatus() { + UNUserNotificationCenter.current().getNotificationSettings { settings in + if settings.authorizationStatus == .authorized { + nr_requestUploadApnsAuthorizationStatus(true) + } else if settings.authorizationStatus == .denied { + nr_requestUploadApnsAuthorizationStatus(false) + } + } + } +} diff --git a/ReaderHive/Base/Networking/API/NRStoreAPI.swift b/ReaderHive/Base/Networking/API/NRStoreAPI.swift index 11a5a10..d560e60 100644 --- a/ReaderHive/Base/Networking/API/NRStoreAPI.swift +++ b/ReaderHive/Base/Networking/API/NRStoreAPI.swift @@ -2,12 +2,13 @@ // NRStoreAPI.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/10. +// Created by 澜声世纪 on 2025/12/10. // import UIKit import SmartCodable import Alamofire +import JXIAPManager struct NRStoreAPI { @@ -99,13 +100,17 @@ struct NRStoreAPI { } static func requestRechargeRecord(page: Int, buyType: BuyType, completer: ((_ listModel: NRNetwork.List?) -> Void)?) { + var type = "coins" + if buyType == .subVip { + type = "vip" + } var param = NRNetwork.Parameters(path: "/getCustomerOrder") param.method = .get param.parameters = [ "page_size" : 20, "current_page" : page, - "buy_type" : buyType.rawValue + "buy_type" : type ] NRNetwork.request(parameters: param) { (response: NRNetwork.Response>) in @@ -175,4 +180,20 @@ struct NRStoreAPI { } } + ///获取金币包可领取信息 + static func requestCoinBagCanReceiveInfo() async -> NRCoinPackCanReceiveModel? { + await withCheckedContinuation { continuation in + var param = NRNetwork.Parameters(path: "/getReceiveDayCoin") + param.method = .get + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in + if response.isSuccess { + continuation.resume(returning: response.data) + } else { + continuation.resume(returning: nil) + } + } + } + } + } diff --git a/ReaderHive/Base/Networking/API/NRUserAPI.swift b/ReaderHive/Base/Networking/API/NRUserAPI.swift index 2ae1cd7..6e94396 100644 --- a/ReaderHive/Base/Networking/API/NRUserAPI.swift +++ b/ReaderHive/Base/Networking/API/NRUserAPI.swift @@ -2,7 +2,7 @@ // NRUserAPI.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Base/Networking/NRNetwork.swift b/ReaderHive/Base/Networking/NRNetwork.swift index 0d76c77..5f12cbc 100644 --- a/ReaderHive/Base/Networking/NRNetwork.swift +++ b/ReaderHive/Base/Networking/NRNetwork.swift @@ -2,7 +2,7 @@ // NRNetwork.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/Networking/NRNetworkModel.swift b/ReaderHive/Base/Networking/NRNetworkModel.swift index dbf8fa6..48d68f3 100644 --- a/ReaderHive/Base/Networking/NRNetworkModel.swift +++ b/ReaderHive/Base/Networking/NRNetworkModel.swift @@ -2,7 +2,7 @@ // NRNetworkModel.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/Networking/NRNetworkReachableManager.swift b/ReaderHive/Base/Networking/NRNetworkReachableManager.swift index 4c60ed5..ab678bf 100644 --- a/ReaderHive/Base/Networking/NRNetworkReachableManager.swift +++ b/ReaderHive/Base/Networking/NRNetworkReachableManager.swift @@ -2,7 +2,7 @@ // NRNetworkReachableManager.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/Networking/NRResponseCryptor.swift b/ReaderHive/Base/Networking/NRResponseCryptor.swift index 1c63cd2..55747d7 100644 --- a/ReaderHive/Base/Networking/NRResponseCryptor.swift +++ b/ReaderHive/Base/Networking/NRResponseCryptor.swift @@ -2,7 +2,7 @@ // NRResponseCryptor.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/Networking/NRTargetType.swift b/ReaderHive/Base/Networking/NRTargetType.swift index 6c78b4f..d310680 100644 --- a/ReaderHive/Base/Networking/NRTargetType.swift +++ b/ReaderHive/Base/Networking/NRTargetType.swift @@ -2,7 +2,7 @@ // NRTargetType.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/Networking/NRUrlPath.swift b/ReaderHive/Base/Networking/NRUrlPath.swift index 11ad872..64fdea4 100644 --- a/ReaderHive/Base/Networking/NRUrlPath.swift +++ b/ReaderHive/Base/Networking/NRUrlPath.swift @@ -2,7 +2,7 @@ // NRUrlPath.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/VC/NRAppStartViewController.swift b/ReaderHive/Base/VC/NRAppStartViewController.swift new file mode 100644 index 0000000..da7395a --- /dev/null +++ b/ReaderHive/Base/VC/NRAppStartViewController.swift @@ -0,0 +1,67 @@ +// +// NRAppStartViewController.swift +// ReaderHive +// +// Created by 澜声世纪 on 2025/12/16. +// + +import UIKit +import SnapKit + +class NRAppStartViewController: NRViewController { + + var openAppHandle: (() -> Void)? + + private lazy var lanuchVC: UIViewController? = { + let vc = NRTool.lanuchViewController + return vc + }() + + private lazy var startButton: UIButton = { + var configuration = UIButton.Configuration.plain() + configuration.background.image = UIImage(named: "gradient_color_01") + configuration.background.cornerRadius = 24 + configuration.attributedTitle = AttributedString("Open".localized, attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .medium), + .foregroundColor : UIColor.white + ])) + + let button = UIButton(configuration: configuration, primaryAction: UIAction(handler: { [weak self] _ in + self?.openAppHandle?() + })) + return button + }() + + override func viewDidLoad() { + super.viewDidLoad() + + if let vc = lanuchVC { + addChild(vc) + view.addSubview(vc.view) + } + nrPrint(message: UIScreen.safeBottom) + + view.addSubview(startButton) + + + startButton.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.width.equalTo(150) + make.height.equalTo(48) + make.bottom.equalToSuperview().offset(-(UIScreen.safeBottom + 50)) + } + + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/ReaderHive/Base/VC/NRNavigationController.swift b/ReaderHive/Base/VC/NRNavigationController.swift index 92a23ad..a149ab4 100644 --- a/ReaderHive/Base/VC/NRNavigationController.swift +++ b/ReaderHive/Base/VC/NRNavigationController.swift @@ -2,7 +2,7 @@ // NRNavigationController.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/VC/NRTabBarController.swift b/ReaderHive/Base/VC/NRTabBarController.swift index 12db17f..79d8daf 100644 --- a/ReaderHive/Base/VC/NRTabBarController.swift +++ b/ReaderHive/Base/VC/NRTabBarController.swift @@ -2,7 +2,7 @@ // NRTabBarController.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit @@ -40,6 +40,8 @@ class NRTabBarController: UITabBarController { self.selectedIndex = 1 NRTool.checkUpdates() + + NROpenAppManager.manager.requestIDFAAuthorization() } diff --git a/ReaderHive/Base/VC/NRViewController.swift b/ReaderHive/Base/VC/NRViewController.swift index 3c36cd6..7d64b23 100644 --- a/ReaderHive/Base/VC/NRViewController.swift +++ b/ReaderHive/Base/VC/NRViewController.swift @@ -2,13 +2,14 @@ // NRViewController.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit import SnapKit import JXPagingView import JXSegmentedView +import LYEmptyView class NRViewController: UIViewController { @@ -21,6 +22,14 @@ class NRViewController: UIViewController { return imageView }() + private(set) lazy var notNetworkingEmptyView: LYEmptyView = { + let view = NREmpty.nr_emptyView(image: UIImage(named: "empty_image_02"), title: "not_networking_empty_text".localized, btnTitleStr: "Try again".localized, contentViewOffset: 0) { [weak self] in + self?.handleNotNetworkingEmptyBtn() + } + view.autoShowEmptyView = false + return view + }() + override func viewDidLoad() { super.viewDidLoad() @@ -50,7 +59,11 @@ class NRViewController: UIViewController { func handleFooterRefresh(_ completer: (() -> Void)?) { completer?() } - + + func handleNotNetworkingEmptyBtn() { + + } + } extension NRViewController: JXPagingSmoothViewListViewDelegate, JXPagingViewListViewDelegate, JXSegmentedListContainerViewListDelegate { @@ -67,10 +80,18 @@ extension NRViewController: JXPagingSmoothViewListViewDelegate, JXPagingViewList return UIScrollView() } + func listWillAppear() { + + } + func listDidAppear() { } + func listWillDisappear() { + + } + func listDidDisappear() { } diff --git a/ReaderHive/Base/View/NRCollectionView.swift b/ReaderHive/Base/View/NRCollectionView.swift index 7032cb6..e08bbf0 100644 --- a/ReaderHive/Base/View/NRCollectionView.swift +++ b/ReaderHive/Base/View/NRCollectionView.swift @@ -2,7 +2,7 @@ // NRCollectionView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/View/NRGradientButton.swift b/ReaderHive/Base/View/NRGradientButton.swift index cb2dc0b..aebb5b7 100644 --- a/ReaderHive/Base/View/NRGradientButton.swift +++ b/ReaderHive/Base/View/NRGradientButton.swift @@ -2,7 +2,7 @@ // NRGradientButton.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/5. +// Created by 澜声世纪 on 2025/12/5. // import UIKit diff --git a/ReaderHive/Base/View/NRGradientView.swift b/ReaderHive/Base/View/NRGradientView.swift index a13883c..ae7a62f 100644 --- a/ReaderHive/Base/View/NRGradientView.swift +++ b/ReaderHive/Base/View/NRGradientView.swift @@ -2,7 +2,7 @@ // NRGradientView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Base/View/NRImageView.swift b/ReaderHive/Base/View/NRImageView.swift index 2eb394a..88ff433 100644 --- a/ReaderHive/Base/View/NRImageView.swift +++ b/ReaderHive/Base/View/NRImageView.swift @@ -2,7 +2,7 @@ // NRImageView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Base/View/NRLabel.swift b/ReaderHive/Base/View/NRLabel.swift index a69f924..a809ff8 100644 --- a/ReaderHive/Base/View/NRLabel.swift +++ b/ReaderHive/Base/View/NRLabel.swift @@ -2,7 +2,7 @@ // NRLabel.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Base/View/NRPanModalContentView.swift b/ReaderHive/Base/View/NRPanModalContentView.swift index f1909ed..6fcd239 100644 --- a/ReaderHive/Base/View/NRPanModalContentView.swift +++ b/ReaderHive/Base/View/NRPanModalContentView.swift @@ -2,7 +2,7 @@ // NRPanModalContentView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/28. +// Created by 澜声世纪 on 2025/11/28. // import UIKit diff --git a/ReaderHive/Base/View/NRProgressView.swift b/ReaderHive/Base/View/NRProgressView.swift index bcc89fe..c7f8251 100644 --- a/ReaderHive/Base/View/NRProgressView.swift +++ b/ReaderHive/Base/View/NRProgressView.swift @@ -2,7 +2,7 @@ // NRProgressView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/29. +// Created by 澜声世纪 on 2025/11/29. // import UIKit diff --git a/ReaderHive/Base/View/NRScrollView.swift b/ReaderHive/Base/View/NRScrollView.swift index ae76371..a36bc7a 100644 --- a/ReaderHive/Base/View/NRScrollView.swift +++ b/ReaderHive/Base/View/NRScrollView.swift @@ -2,7 +2,7 @@ // NRScrollView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Base/View/NRTableView.swift b/ReaderHive/Base/View/NRTableView.swift index 6a02165..885eb41 100644 --- a/ReaderHive/Base/View/NRTableView.swift +++ b/ReaderHive/Base/View/NRTableView.swift @@ -2,7 +2,7 @@ // NRTableView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Base/View/NRTableViewCell.swift b/ReaderHive/Base/View/NRTableViewCell.swift index e554091..40e4000 100644 --- a/ReaderHive/Base/View/NRTableViewCell.swift +++ b/ReaderHive/Base/View/NRTableViewCell.swift @@ -2,7 +2,7 @@ // NRTableViewCell.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Base/WebView/NRAppWebViewController.swift b/ReaderHive/Base/WebView/NRAppWebViewController.swift index 49d14ad..a078c6b 100644 --- a/ReaderHive/Base/WebView/NRAppWebViewController.swift +++ b/ReaderHive/Base/WebView/NRAppWebViewController.swift @@ -2,7 +2,7 @@ // NRAppWebViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/10. +// Created by 澜声世纪 on 2025/12/10. // import UIKit @@ -14,7 +14,7 @@ class NRAppWebViewController: NRWebViewController { private var receiveDataCount = 0 - var theme: String? = "theme_2" + var theme: String? = "theme_20" override func viewDidLoad() { super.viewDidLoad() diff --git a/ReaderHive/Base/WebView/NRWebView.swift b/ReaderHive/Base/WebView/NRWebView.swift index 516e34c..fec27be 100644 --- a/ReaderHive/Base/WebView/NRWebView.swift +++ b/ReaderHive/Base/WebView/NRWebView.swift @@ -2,7 +2,7 @@ // NRWebView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Base/WebView/NRWebViewController+Script.swift b/ReaderHive/Base/WebView/NRWebViewController+Script.swift index 86858cd..c99ba9c 100644 --- a/ReaderHive/Base/WebView/NRWebViewController+Script.swift +++ b/ReaderHive/Base/WebView/NRWebViewController+Script.swift @@ -2,12 +2,12 @@ // NRWebViewController+Script.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit internal import WebKit -import ZLPhotoBrowser +import PhotosUI ///APP交互 let kNRWebMessageAPP = "js2app" @@ -75,25 +75,45 @@ extension NRWebViewController { ///打开相册 private func openPhotoPicker() { + var config = PHPickerConfiguration() + config.selectionLimit = 1 + config.filter = .images - ZLPhotoConfiguration.default().allowSelectOriginal = false - ZLPhotoConfiguration.default().maxSelectCount = 1 - ZLPhotoConfiguration.default().allowEditImage = false - ZLPhotoConfiguration.default().allowSelectVideo = false - ZLPhotoConfiguration.default().allowSelectGif = false - ZLPhotoConfiguration.default().allowTakePhotoInLibrary = false - - let picker = ZLPhotoPicker() - picker.selectImageBlock = { [weak self] (results, _) in - guard let self = self else { return } - guard let image = results.first?.image else { return } - guard let imageData = image.jpegData(compressionQuality: 0.8) else { return } - let imageDataStr = imageData.base64EncodedString(options: .endLineWithCarriageReturn) - - let js = "uploadConvertImage('\(imageDataStr)')" - self.webView.evaluateJavaScript(js) - } - - picker.showPhotoLibrary(sender: self) + let picker = PHPickerViewController(configuration: config) + picker.delegate = self + self.present(picker, animated: true) } } + +extension NRWebViewController: PHPickerViewControllerDelegate { + func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { + + picker.dismiss(animated: true) + + guard let result = results.first else { return } + + let provider = result.itemProvider + + guard provider.canLoadObject(ofClass: UIImage.self) else { return } + + provider.loadObject(ofClass: UIImage.self) { object, error in + guard let image = object as? UIImage else { return } + + DispatchQueue.main.async { [weak self] in + guard let self = self else { return } + self.upload(image) + } + } + + } + + private func upload(_ image: UIImage) { + guard let imageData = image.jpegData(compressionQuality: 0.8) else { return } + let imageDataStr = imageData.base64EncodedString(options: .endLineWithCarriageReturn) + let js = "uploadConvertImage('\(imageDataStr)')" + self.webView.evaluateJavaScript(js) + } + + + +} diff --git a/ReaderHive/Base/WebView/NRWebViewController.swift b/ReaderHive/Base/WebView/NRWebViewController.swift index ae4c766..ae5ed69 100644 --- a/ReaderHive/Base/WebView/NRWebViewController.swift +++ b/ReaderHive/Base/WebView/NRWebViewController.swift @@ -2,7 +2,7 @@ // NRWebViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Class/Explore/M/NRExploreNovelMenuItem.swift b/ReaderHive/Class/Explore/M/NRExploreNovelMenuItem.swift index 141b34d..de3c773 100644 --- a/ReaderHive/Class/Explore/M/NRExploreNovelMenuItem.swift +++ b/ReaderHive/Class/Explore/M/NRExploreNovelMenuItem.swift @@ -2,7 +2,7 @@ // NRExploreNovelMenuItem.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Explore/V/NRExploreNovelContentListCell.swift b/ReaderHive/Class/Explore/V/NRExploreNovelContentListCell.swift index 81159cf..d917e77 100644 --- a/ReaderHive/Class/Explore/V/NRExploreNovelContentListCell.swift +++ b/ReaderHive/Class/Explore/V/NRExploreNovelContentListCell.swift @@ -2,7 +2,7 @@ // NRExploreNovelContentListCell.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/26. +// Created by 澜声世纪 on 2025/11/26. // import UIKit diff --git a/ReaderHive/Class/Explore/V/NRExploreNovelGenresCell.swift b/ReaderHive/Class/Explore/V/NRExploreNovelGenresCell.swift index 6356af0..c28047c 100644 --- a/ReaderHive/Class/Explore/V/NRExploreNovelGenresCell.swift +++ b/ReaderHive/Class/Explore/V/NRExploreNovelGenresCell.swift @@ -2,7 +2,7 @@ // NRExploreNovelGenresCell.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/26. +// Created by 澜声世纪 on 2025/11/26. // import UIKit diff --git a/ReaderHive/Class/Explore/V/NRExploreNovelMenuCell.swift b/ReaderHive/Class/Explore/V/NRExploreNovelMenuCell.swift index fd04990..9bba4c2 100644 --- a/ReaderHive/Class/Explore/V/NRExploreNovelMenuCell.swift +++ b/ReaderHive/Class/Explore/V/NRExploreNovelMenuCell.swift @@ -2,7 +2,7 @@ // NRExploreNovelMenuCell.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Explore/V/NRExploreNovelMenuView.swift b/ReaderHive/Class/Explore/V/NRExploreNovelMenuView.swift index c9df68d..cd88738 100644 --- a/ReaderHive/Class/Explore/V/NRExploreNovelMenuView.swift +++ b/ReaderHive/Class/Explore/V/NRExploreNovelMenuView.swift @@ -2,7 +2,7 @@ // NRExploreNovelMenuView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Explore/V/NRNovelGenresCell.swift b/ReaderHive/Class/Explore/V/NRNovelGenresCell.swift index 92bfcd0..5d6f359 100644 --- a/ReaderHive/Class/Explore/V/NRNovelGenresCell.swift +++ b/ReaderHive/Class/Explore/V/NRNovelGenresCell.swift @@ -2,7 +2,7 @@ // NRNovelGenresCell.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/26. +// Created by 澜声世纪 on 2025/11/26. // import UIKit diff --git a/ReaderHive/Class/Explore/VC/NRExploreNovelContentListViewController.swift b/ReaderHive/Class/Explore/VC/NRExploreNovelContentListViewController.swift index 517ffab..a9254c3 100644 --- a/ReaderHive/Class/Explore/VC/NRExploreNovelContentListViewController.swift +++ b/ReaderHive/Class/Explore/VC/NRExploreNovelContentListViewController.swift @@ -2,7 +2,7 @@ // NRExploreNovelContentListViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/26. +// Created by 澜声世纪 on 2025/11/26. // import UIKit @@ -41,11 +41,17 @@ class NRExploreNovelContentListViewController: NRViewController { return collectionView }() + @MainActor deinit { + NotificationCenter.default.removeObserver(self) + } + override func viewDidLoad() { super.viewDidLoad() self.backgroundImageView.isHidden = true self.view.backgroundColor = .clear + NotificationCenter.default.addObserver(self, selector: #selector(networkStatusDidChangeNotification), name: NRNetworkReachableManager.networkStatusDidChangeNotification, object: nil) + nr_setupUI() Task { @@ -53,9 +59,14 @@ class NRExploreNovelContentListViewController: NRViewController { } } - - + @objc private func networkStatusDidChangeNotification() { + guard NRNetworkReachableManager.manager.isReachable == true, self.dataArr.isEmpty else { return } + Task { + await requestDataArr() + } + } + } extension NRExploreNovelContentListViewController { diff --git a/ReaderHive/Class/Explore/VC/NRExploreNovelContentViewController.swift b/ReaderHive/Class/Explore/VC/NRExploreNovelContentViewController.swift index 46513d9..4ed1bc2 100644 --- a/ReaderHive/Class/Explore/VC/NRExploreNovelContentViewController.swift +++ b/ReaderHive/Class/Explore/VC/NRExploreNovelContentViewController.swift @@ -2,7 +2,7 @@ // NRExploreNovelContentViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/26. +// Created by 澜声世纪 on 2025/11/26. // import UIKit diff --git a/ReaderHive/Class/Explore/VC/NRExploreNovelGenresViewController.swift b/ReaderHive/Class/Explore/VC/NRExploreNovelGenresViewController.swift index 55e22bc..cfe840d 100644 --- a/ReaderHive/Class/Explore/VC/NRExploreNovelGenresViewController.swift +++ b/ReaderHive/Class/Explore/VC/NRExploreNovelGenresViewController.swift @@ -2,7 +2,7 @@ // NRExploreNovelGenresViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/26. +// Created by 澜声世纪 on 2025/11/26. // import UIKit @@ -42,11 +42,17 @@ class NRExploreNovelGenresViewController: NRViewController { return collectionView }() + @MainActor deinit { + NotificationCenter.default.removeObserver(self) + } + override func viewDidLoad() { super.viewDidLoad() self.backgroundImageView.isHidden = true self.view.backgroundColor = .clear + NotificationCenter.default.addObserver(self, selector: #selector(networkStatusDidChangeNotification), name: NRNetworkReachableManager.networkStatusDidChangeNotification, object: nil) + nr_setupUI() Task { @@ -54,7 +60,12 @@ class NRExploreNovelGenresViewController: NRViewController { } } - + @objc private func networkStatusDidChangeNotification() { + guard NRNetworkReachableManager.manager.isReachable == true, self.dataArr.isEmpty else { return } + Task { + await requestDataArr() + } + } } diff --git a/ReaderHive/Class/Explore/VC/NRExploreNovelViewController.swift b/ReaderHive/Class/Explore/VC/NRExploreNovelViewController.swift index a70a1ba..b4f17b8 100644 --- a/ReaderHive/Class/Explore/VC/NRExploreNovelViewController.swift +++ b/ReaderHive/Class/Explore/VC/NRExploreNovelViewController.swift @@ -2,7 +2,7 @@ // NRExploreNovelViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Explore/VC/NRExploreViewController.swift b/ReaderHive/Class/Explore/VC/NRExploreViewController.swift index ce2c66e..978ad6d 100644 --- a/ReaderHive/Class/Explore/VC/NRExploreViewController.swift +++ b/ReaderHive/Class/Explore/VC/NRExploreViewController.swift @@ -2,7 +2,7 @@ // NRExploreViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Explore/VC/NRNovelGenresViewController.swift b/ReaderHive/Class/Explore/VC/NRNovelGenresViewController.swift index d677e4c..f400c22 100644 --- a/ReaderHive/Class/Explore/VC/NRNovelGenresViewController.swift +++ b/ReaderHive/Class/Explore/VC/NRNovelGenresViewController.swift @@ -2,7 +2,7 @@ // NRNovelGenresViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/26. +// Created by 澜声世纪 on 2025/11/26. // import UIKit diff --git a/ReaderHive/Class/Explore/VM/NRExploreNovelMenuDataSource.swift b/ReaderHive/Class/Explore/VM/NRExploreNovelMenuDataSource.swift index 2455e46..f9960d3 100644 --- a/ReaderHive/Class/Explore/VM/NRExploreNovelMenuDataSource.swift +++ b/ReaderHive/Class/Explore/VM/NRExploreNovelMenuDataSource.swift @@ -2,7 +2,7 @@ // NRExploreNovelMenuDataSource.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/26. +// Created by 澜声世纪 on 2025/11/26. // import UIKit diff --git a/ReaderHive/Class/Explore/VM/NRExploreNovelViewModel.swift b/ReaderHive/Class/Explore/VM/NRExploreNovelViewModel.swift index 18179de..10fe5bb 100644 --- a/ReaderHive/Class/Explore/VM/NRExploreNovelViewModel.swift +++ b/ReaderHive/Class/Explore/VM/NRExploreNovelViewModel.swift @@ -2,7 +2,7 @@ // NRExploreNovelViewModel.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/11/26. +// Created by 澜声世纪 on 2025/11/26. // import UIKit diff --git a/ReaderHive/Class/Home/C/NRHomeNovelListViewController.swift b/ReaderHive/Class/Home/C/NRHomeNovelListViewController.swift index 4fae946..0b8c91e 100644 --- a/ReaderHive/Class/Home/C/NRHomeNovelListViewController.swift +++ b/ReaderHive/Class/Home/C/NRHomeNovelListViewController.swift @@ -2,7 +2,7 @@ // NRHomeNovelListViewController.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Class/Home/C/NRHomeNovelNewViewController.swift b/ReaderHive/Class/Home/C/NRHomeNovelNewViewController.swift index eb152c4..66962fb 100644 --- a/ReaderHive/Class/Home/C/NRHomeNovelNewViewController.swift +++ b/ReaderHive/Class/Home/C/NRHomeNovelNewViewController.swift @@ -2,7 +2,7 @@ // NRHomeNovelNewViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Class/Home/C/NRHomeNovelViewController.swift b/ReaderHive/Class/Home/C/NRHomeNovelViewController.swift index a06ce21..83aa420 100644 --- a/ReaderHive/Class/Home/C/NRHomeNovelViewController.swift +++ b/ReaderHive/Class/Home/C/NRHomeNovelViewController.swift @@ -2,7 +2,7 @@ // NRHomeNovelViewController.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Class/Home/C/NRHomeViewController.swift b/ReaderHive/Class/Home/C/NRHomeViewController.swift index 1526cdc..2f9f19b 100644 --- a/ReaderHive/Class/Home/C/NRHomeViewController.swift +++ b/ReaderHive/Class/Home/C/NRHomeViewController.swift @@ -2,11 +2,12 @@ // NRHomeViewController.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit import SnapKit +import LYEmptyView class NRHomeViewController: NRViewController { @@ -36,23 +37,52 @@ class NRHomeViewController: NRViewController { return button }() + @MainActor deinit { + NotificationCenter.default.removeObserver(self) + } + override func viewDidLoad() { super.viewDidLoad() - + + NotificationCenter.default.addObserver(self, selector: #selector(networkStatusDidChangeNotification), name: NRNetworkReachableManager.networkStatusDidChangeNotification, object: nil) + nr_setupUI() + + Task { + await requestCoinBagCanReceiveInfo() + } } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: true) } - + + override func handleNotNetworkingEmptyBtn() { + self.nr_setupUI() + } + + @objc private func networkStatusDidChangeNotification() { + guard NRNetworkReachableManager.manager.isReachable == true else { return } + nr_setupUI() + } } extension NRHomeViewController { private func nr_setupUI() { + guard novelVC.view.superview == nil else { return } + + if NRNetworkReachableManager.manager.isReachable != true { + if self.view.ly_emptyView == nil { + self.view.ly_emptyView = self.notNetworkingEmptyView + } + self.view.ly_showEmpty() + return; + } + self.view.ly_hideEmpty() + view.addSubview(searchButton) view.addSubview(titleView) addChild(novelVC) @@ -82,3 +112,22 @@ extension NRHomeViewController { } } + +extension NRHomeViewController { + + private func requestCoinBagCanReceiveInfo() async { + guard let model = await NRStoreAPI.requestCoinBagCanReceiveInfo() else { return } + let coins = model.coins ?? 0 + guard coins > 0 else { return } + + let view = NRCoinsPackAlert(model: model) + view.show(in: self.view) + view.highlightHandle = { [weak self] in + let vc = NRCoinsPackViewController() + self?.navigationController?.pushViewController(vc, animated: true) + } + + } +} + + diff --git a/ReaderHive/Class/Home/C/NRSearchViewController.swift b/ReaderHive/Class/Home/C/NRSearchViewController.swift index 2b84bac..4f16808 100644 --- a/ReaderHive/Class/Home/C/NRSearchViewController.swift +++ b/ReaderHive/Class/Home/C/NRSearchViewController.swift @@ -2,7 +2,7 @@ // NRSearchViewController.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Home/M/NRHomeNovelModuleItem.swift b/ReaderHive/Class/Home/M/NRHomeNovelModuleItem.swift index ab7e62f..2e4c1b1 100644 --- a/ReaderHive/Class/Home/M/NRHomeNovelModuleItem.swift +++ b/ReaderHive/Class/Home/M/NRHomeNovelModuleItem.swift @@ -2,7 +2,7 @@ // NRHomeNovelModuleItem.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/2. +// Created by 澜声世纪 on 2025/12/2. // import UIKit diff --git a/ReaderHive/Class/Home/M/NRReadWhatViewTransformer.swift b/ReaderHive/Class/Home/M/NRReadWhatViewTransformer.swift index e93d7c0..416444d 100644 --- a/ReaderHive/Class/Home/M/NRReadWhatViewTransformer.swift +++ b/ReaderHive/Class/Home/M/NRReadWhatViewTransformer.swift @@ -2,7 +2,7 @@ // NRReadWhatViewTransformer.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeCategoryTagView.swift b/ReaderHive/Class/Home/V/NRHomeCategoryTagView.swift index 9338dd1..b59b206 100644 --- a/ReaderHive/Class/Home/V/NRHomeCategoryTagView.swift +++ b/ReaderHive/Class/Home/V/NRHomeCategoryTagView.swift @@ -2,7 +2,7 @@ // NRHomeCategoryTagView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelHeaderContentView.swift b/ReaderHive/Class/Home/V/NRHomeNovelHeaderContentView.swift index b389c3c..27e100a 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelHeaderContentView.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelHeaderContentView.swift @@ -2,7 +2,7 @@ // NRHomeNovelHeaderContentView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelHeaderView.swift b/ReaderHive/Class/Home/V/NRHomeNovelHeaderView.swift index a6a965e..66a8a06 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelHeaderView.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelHeaderView.swift @@ -2,7 +2,7 @@ // NRHomeNovelHeaderView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/21. +// Created by 澜声世纪 on 2025/11/21. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelHotGridView.swift b/ReaderHive/Class/Home/V/NRHomeNovelHotGridView.swift index 0279bb8..5d90569 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelHotGridView.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelHotGridView.swift @@ -2,7 +2,7 @@ // NRHomeNovelHotGridView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelHotTagCell.swift b/ReaderHive/Class/Home/V/NRHomeNovelHotTagCell.swift index 7a03a30..3082fdc 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelHotTagCell.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelHotTagCell.swift @@ -2,7 +2,7 @@ // NRHomeNovelHotTagCell.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelHotTagView.swift b/ReaderHive/Class/Home/V/NRHomeNovelHotTagView.swift index 1df2f3e..e78bae5 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelHotTagView.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelHotTagView.swift @@ -2,7 +2,7 @@ // NRHomeNovelHotTagView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelListCell.swift b/ReaderHive/Class/Home/V/NRHomeNovelListCell.swift index be091f1..aecba78 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelListCell.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelListCell.swift @@ -2,7 +2,7 @@ // NRHomeNovelListCell.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelListTextCell.swift b/ReaderHive/Class/Home/V/NRHomeNovelListTextCell.swift index 36970ab..251d109 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelListTextCell.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelListTextCell.swift @@ -2,7 +2,7 @@ // NRHomeNovelListTextCell.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelMustReadTodayCell.swift b/ReaderHive/Class/Home/V/NRHomeNovelMustReadTodayCell.swift index 3841377..d93d126 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelMustReadTodayCell.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelMustReadTodayCell.swift @@ -2,7 +2,7 @@ // NRHomeNovelMustReadTodayCell.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelMustReadTodayView.swift b/ReaderHive/Class/Home/V/NRHomeNovelMustReadTodayView.swift index 5bfa8c3..dcc0ea2 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelMustReadTodayView.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelMustReadTodayView.swift @@ -2,7 +2,7 @@ // NRHomeNovelMustReadTodayView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsCell.swift b/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsCell.swift index e6bbe7b..d765220 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsCell.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsCell.swift @@ -2,7 +2,7 @@ // NRHomeNovelNewArrivalsCell.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsView.swift b/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsView.swift index f930383..2bbf510 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsView.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsView.swift @@ -2,7 +2,7 @@ // NRHomeNovelNewArrivalsView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelNextView.swift b/ReaderHive/Class/Home/V/NRHomeNovelNextView.swift index 0853cbb..8808927 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelNextView.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelNextView.swift @@ -2,7 +2,7 @@ // NRHomeNovelNextView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelNextViewCell.swift b/ReaderHive/Class/Home/V/NRHomeNovelNextViewCell.swift index e590613..84d64e8 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelNextViewCell.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelNextViewCell.swift @@ -2,7 +2,7 @@ // NRHomeNovelNextViewCell.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelReadWhatCell.swift b/ReaderHive/Class/Home/V/NRHomeNovelReadWhatCell.swift index 6d0712c..397e82b 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelReadWhatCell.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelReadWhatCell.swift @@ -2,7 +2,7 @@ // NRHomeNovelReadWhatCell.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRHomeNovelReadWhatView.swift b/ReaderHive/Class/Home/V/NRHomeNovelReadWhatView.swift index 6731088..2dc6f4f 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelReadWhatView.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelReadWhatView.swift @@ -2,7 +2,7 @@ // NRHomeNovelReadWhatView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/24. +// Created by 澜声世纪 on 2025/11/24. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRSearchHomeView.swift b/ReaderHive/Class/Home/V/NRSearchHomeView.swift index 67c2f4f..73b76f1 100644 --- a/ReaderHive/Class/Home/V/NRSearchHomeView.swift +++ b/ReaderHive/Class/Home/V/NRSearchHomeView.swift @@ -2,7 +2,7 @@ // NRSearchHomeView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRSearchInputView.swift b/ReaderHive/Class/Home/V/NRSearchInputView.swift index 8fe3fb5..7fe55f9 100644 --- a/ReaderHive/Class/Home/V/NRSearchInputView.swift +++ b/ReaderHive/Class/Home/V/NRSearchInputView.swift @@ -2,7 +2,7 @@ // NRSearchInputView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRSearchRecordCell.swift b/ReaderHive/Class/Home/V/NRSearchRecordCell.swift index e30bffa..900f40d 100644 --- a/ReaderHive/Class/Home/V/NRSearchRecordCell.swift +++ b/ReaderHive/Class/Home/V/NRSearchRecordCell.swift @@ -2,7 +2,7 @@ // NRSearchRecordCell.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRSearchRecordView.swift b/ReaderHive/Class/Home/V/NRSearchRecordView.swift index bedc8f9..fdf1ab9 100644 --- a/ReaderHive/Class/Home/V/NRSearchRecordView.swift +++ b/ReaderHive/Class/Home/V/NRSearchRecordView.swift @@ -2,7 +2,7 @@ // NRSearchRecordView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRSearchResultCell.swift b/ReaderHive/Class/Home/V/NRSearchResultCell.swift index 7add587..869bf99 100644 --- a/ReaderHive/Class/Home/V/NRSearchResultCell.swift +++ b/ReaderHive/Class/Home/V/NRSearchResultCell.swift @@ -2,7 +2,7 @@ // NRSearchResultCell.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRSearchResultView.swift b/ReaderHive/Class/Home/V/NRSearchResultView.swift index 3094d16..5485000 100644 --- a/ReaderHive/Class/Home/V/NRSearchResultView.swift +++ b/ReaderHive/Class/Home/V/NRSearchResultView.swift @@ -2,7 +2,7 @@ // NRSearchResultView.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Home/V/NRStarGradeView.swift b/ReaderHive/Class/Home/V/NRStarGradeView.swift index eae1ad7..a3568e5 100644 --- a/ReaderHive/Class/Home/V/NRStarGradeView.swift +++ b/ReaderHive/Class/Home/V/NRStarGradeView.swift @@ -2,7 +2,7 @@ // NRStarGradeView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/2. +// Created by 澜声世纪 on 2025/12/2. // import UIKit @@ -11,13 +11,15 @@ import Cosmos class NRStarGradeView: UIView { + private let ratio: CGFloat = 2 + //0-10 var grade: CGFloat { set { - cosmosView.rating = newValue + cosmosView.rating = newValue / ratio } get { - return cosmosView.rating + return cosmosView.rating * ratio } } @@ -83,10 +85,12 @@ class NRStarGradeView: UIView { private lazy var cosmosView: CosmosView = { let view = CosmosView(settings: settings) view.didTouchCosmos = { [weak self] rating in - self?.didTouch?(rating) + guard let self = self else { return } + self.didTouch?(rating * self.ratio) } view.didFinishTouchingCosmos = { [weak self] rating in - self?.didFinishTouching?(rating) + guard let self = self else { return } + self.didFinishTouching?(rating * self.ratio) } return view }() diff --git a/ReaderHive/Class/Home/VM/NRHomeNovelViewModel.swift b/ReaderHive/Class/Home/VM/NRHomeNovelViewModel.swift index fe50680..aef1639 100644 --- a/ReaderHive/Class/Home/VM/NRHomeNovelViewModel.swift +++ b/ReaderHive/Class/Home/VM/NRHomeNovelViewModel.swift @@ -2,7 +2,7 @@ // NRHomeNovelViewModel.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/2. +// Created by 澜声世纪 on 2025/12/2. // import UIKit diff --git a/ReaderHive/Class/Home/VM/NRSearchViewModel.swift b/ReaderHive/Class/Home/VM/NRSearchViewModel.swift index d2ebe32..fabf275 100644 --- a/ReaderHive/Class/Home/VM/NRSearchViewModel.swift +++ b/ReaderHive/Class/Home/VM/NRSearchViewModel.swift @@ -2,7 +2,7 @@ // NRSearchViewModel.swift // ReaderHive // -// Created by 湖北秦九 on 2025/11/25. +// Created by 澜声世纪 on 2025/11/25. // import UIKit diff --git a/ReaderHive/Class/Me/M/NRFeedbackCountModel.swift b/ReaderHive/Class/Me/M/NRFeedbackCountModel.swift new file mode 100644 index 0000000..42e500d --- /dev/null +++ b/ReaderHive/Class/Me/M/NRFeedbackCountModel.swift @@ -0,0 +1,16 @@ +// +// NRFeedbackCountModel.swift +// ReaderHive +// +// Created by 澜声世纪 on 2025/12/16. +// + +import UIKit +import SmartCodable + +class NRFeedbackCountModel: NSObject, SmartCodable { + + required override init() { } + + var feedback_notice_num: Int? +} diff --git a/ReaderHive/Class/Me/M/NRLanguageModel.swift b/ReaderHive/Class/Me/M/NRLanguageModel.swift index bc1c1e0..4938d82 100644 --- a/ReaderHive/Class/Me/M/NRLanguageModel.swift +++ b/ReaderHive/Class/Me/M/NRLanguageModel.swift @@ -2,7 +2,7 @@ // NRLanguageModel.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/8. +// Created by 澜声世纪 on 2025/12/8. // import UIKit diff --git a/ReaderHive/Class/Me/M/NRMeItem.swift b/ReaderHive/Class/Me/M/NRMeItem.swift index e2f43ef..f85eacc 100644 --- a/ReaderHive/Class/Me/M/NRMeItem.swift +++ b/ReaderHive/Class/Me/M/NRMeItem.swift @@ -2,7 +2,7 @@ // NRMeItem.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Class/Me/V/NRAboutCell.swift b/ReaderHive/Class/Me/V/NRAboutCell.swift index 88a029c..088e995 100644 --- a/ReaderHive/Class/Me/V/NRAboutCell.swift +++ b/ReaderHive/Class/Me/V/NRAboutCell.swift @@ -2,7 +2,7 @@ // NRAboutCell.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Class/Me/V/NRAboutHeaderView.swift b/ReaderHive/Class/Me/V/NRAboutHeaderView.swift index 1f0c678..0db1d09 100644 --- a/ReaderHive/Class/Me/V/NRAboutHeaderView.swift +++ b/ReaderHive/Class/Me/V/NRAboutHeaderView.swift @@ -2,7 +2,7 @@ // NRAboutHeaderView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Class/Me/V/NRLanguageCell.swift b/ReaderHive/Class/Me/V/NRLanguageCell.swift index 023b24d..9ddba68 100644 --- a/ReaderHive/Class/Me/V/NRLanguageCell.swift +++ b/ReaderHive/Class/Me/V/NRLanguageCell.swift @@ -2,7 +2,7 @@ // NRLanguageCell.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/8. +// Created by 澜声世纪 on 2025/12/8. // import UIKit diff --git a/ReaderHive/Class/Me/V/NRMeCell.swift b/ReaderHive/Class/Me/V/NRMeCell.swift index 6c3c115..aa2fb09 100644 --- a/ReaderHive/Class/Me/V/NRMeCell.swift +++ b/ReaderHive/Class/Me/V/NRMeCell.swift @@ -2,7 +2,7 @@ // NRMeCell.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit @@ -28,6 +28,12 @@ class NRMeCell: NRTableViewCell { label.textColor = .black return label }() + + private(set) lazy var lineView: NRDashedLineView = { + let view = NRDashedLineView() + view.lineColor = .FFEFD_4 + return view + }() override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) @@ -48,6 +54,7 @@ extension NRMeCell { contentView.addSubview(iconImageView) contentView.addSubview(titleLabel) contentView.addSubview(nr_indicatorImageView) + contentView.addSubview(lineView) iconImageView.snp.makeConstraints { make in make.centerY.equalToSuperview() @@ -63,6 +70,12 @@ extension NRMeCell { make.centerY.equalToSuperview() make.right.equalToSuperview().offset(-12) } + + lineView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(12) + make.centerX.equalToSuperview() + make.bottom.equalToSuperview() + } } } diff --git a/ReaderHive/Class/Me/V/NRMeCoinsContentView.swift b/ReaderHive/Class/Me/V/NRMeCoinsContentView.swift index e9769e1..e137623 100644 --- a/ReaderHive/Class/Me/V/NRMeCoinsContentView.swift +++ b/ReaderHive/Class/Me/V/NRMeCoinsContentView.swift @@ -2,7 +2,7 @@ // NRMeCoinsContentView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/8. +// Created by 澜声世纪 on 2025/12/8. // import UIKit diff --git a/ReaderHive/Class/Me/V/NRMeCoinsPackView.swift b/ReaderHive/Class/Me/V/NRMeCoinsPackView.swift index 7a05927..a6dfe93 100644 --- a/ReaderHive/Class/Me/V/NRMeCoinsPackView.swift +++ b/ReaderHive/Class/Me/V/NRMeCoinsPackView.swift @@ -2,7 +2,7 @@ // NRMeCoinsPackView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/10. +// Created by 澜声世纪 on 2025/12/10. // import UIKit diff --git a/ReaderHive/Class/Me/V/NRMeCoinsView.swift b/ReaderHive/Class/Me/V/NRMeCoinsView.swift index a9f55de..0e1241c 100644 --- a/ReaderHive/Class/Me/V/NRMeCoinsView.swift +++ b/ReaderHive/Class/Me/V/NRMeCoinsView.swift @@ -2,7 +2,7 @@ // NRMeCoinsView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/8. +// Created by 澜声世纪 on 2025/12/8. // import UIKit diff --git a/ReaderHive/Class/Me/V/NRMeHeaderView.swift b/ReaderHive/Class/Me/V/NRMeHeaderView.swift index a46f8f8..e1442ce 100644 --- a/ReaderHive/Class/Me/V/NRMeHeaderView.swift +++ b/ReaderHive/Class/Me/V/NRMeHeaderView.swift @@ -2,7 +2,7 @@ // NRMeHeaderView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Class/Me/V/NRMeVipView.swift b/ReaderHive/Class/Me/V/NRMeVipView.swift index c3c48a4..700a710 100644 --- a/ReaderHive/Class/Me/V/NRMeVipView.swift +++ b/ReaderHive/Class/Me/V/NRMeVipView.swift @@ -2,7 +2,7 @@ // NRMeVipView.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/10. +// Created by 澜声世纪 on 2025/12/10. // import UIKit diff --git a/ReaderHive/Class/Me/V/NRNovelHistoryCell.swift b/ReaderHive/Class/Me/V/NRNovelHistoryCell.swift index 4f7dd70..b1b13c8 100644 --- a/ReaderHive/Class/Me/V/NRNovelHistoryCell.swift +++ b/ReaderHive/Class/Me/V/NRNovelHistoryCell.swift @@ -2,7 +2,7 @@ // NRNovelHistoryCell.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Class/Me/VC/NRAboutViewController.swift b/ReaderHive/Class/Me/VC/NRAboutViewController.swift index f33da63..b9c1795 100644 --- a/ReaderHive/Class/Me/VC/NRAboutViewController.swift +++ b/ReaderHive/Class/Me/VC/NRAboutViewController.swift @@ -2,7 +2,7 @@ // NRAboutViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Class/Me/VC/NRFeedbackViewController.swift b/ReaderHive/Class/Me/VC/NRFeedbackViewController.swift index 3be2d73..69ee0c2 100644 --- a/ReaderHive/Class/Me/VC/NRFeedbackViewController.swift +++ b/ReaderHive/Class/Me/VC/NRFeedbackViewController.swift @@ -2,19 +2,74 @@ // NRFeedbackViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/10. +// Created by 澜声世纪 on 2025/12/10. // import UIKit +import SnapKit class NRFeedbackViewController: NRAppWebViewController { - + + + private lazy var rightButton: UIButton = { + let button = UIButton(type: .custom) + button.setImage(UIImage(named: "feedback_list_icon_01"), for: .normal) + button.addTarget(self, action: #selector(openFeedbackList), for: .touchUpInside) + button.snp.makeConstraints { make in + make.width.height.equalTo(44) + } + return button + }() + + private lazy var redView: UIView = { + let view = UIView() + view.backgroundColor = .FF_313_B + view.layer.cornerRadius = 8 + view.isHidden = true + return view + }() + + private lazy var redLabel: UILabel = { + let label = UILabel() + label.font = .font(ofSize: 12, weight: .bold) + label.textColor = .white + return label + }() + override func viewDidLoad() { self.webUrl = kNRFeedBackHomeWebUrl super.viewDidLoad() - - self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named: "feedback_list_icon_01"), style: .plain, target: self, action: #selector(openFeedbackList)) + self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rightButton) + + + rightButton.addSubview(redView) + redView.addSubview(redLabel) + + redView.snp.makeConstraints { make in + make.height.equalTo(16) + make.width.greaterThanOrEqualTo(16) + make.centerY.equalTo(self.rightButton.snp.top).offset(13) + make.centerX.equalTo(self.rightButton.snp.right).offset(-14) +// make.top.equalToSuperview().offset(5) +// make.right.equalToSuperview().offset(-6) + } + + redLabel.snp.makeConstraints { make in + make.center.equalToSuperview() + make.left.greaterThanOrEqualToSuperview().offset(3) + } + + + + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + Task { + await requestRedCount() + } } @objc private func openFeedbackList() { @@ -23,4 +78,15 @@ class NRFeedbackViewController: NRAppWebViewController { self.navigationController?.pushViewController(vc, animated: true) } + private func requestRedCount() async { + guard let model = await NRSettingAPI.requestFeedbackRedCount() else { return } + guard let count = model.feedback_notice_num, count > 0 else { + self.redView.isHidden = true + return + } + self.redLabel.text = "\(count)" + self.redView.isHidden = false + + } + } diff --git a/ReaderHive/Class/Me/VC/NRHistoryViewController.swift b/ReaderHive/Class/Me/VC/NRHistoryViewController.swift index d483845..e80a11f 100644 --- a/ReaderHive/Class/Me/VC/NRHistoryViewController.swift +++ b/ReaderHive/Class/Me/VC/NRHistoryViewController.swift @@ -2,7 +2,7 @@ // NRHistoryViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/4. +// Created by 澜声世纪 on 2025/12/4. // import UIKit diff --git a/ReaderHive/Class/Me/VC/NRLanguageViewController.swift b/ReaderHive/Class/Me/VC/NRLanguageViewController.swift index 4c7c5b1..3cf8746 100644 --- a/ReaderHive/Class/Me/VC/NRLanguageViewController.swift +++ b/ReaderHive/Class/Me/VC/NRLanguageViewController.swift @@ -2,7 +2,7 @@ // NRLanguageViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/8. +// Created by 澜声世纪 on 2025/12/8. // import UIKit diff --git a/ReaderHive/Class/Me/VC/NRMeViewController.swift b/ReaderHive/Class/Me/VC/NRMeViewController.swift index f562813..b4a090f 100644 --- a/ReaderHive/Class/Me/VC/NRMeViewController.swift +++ b/ReaderHive/Class/Me/VC/NRMeViewController.swift @@ -2,7 +2,7 @@ // NRMeViewController.swift // ReaderHive // -// Created by 长沙鸿瑶 on 2025/12/3. +// Created by 澜声世纪 on 2025/12/3. // import UIKit @@ -84,6 +84,12 @@ extension NRMeViewController: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! NRMeCell cell.item = dataArr[indexPath.row] + if indexPath.row == self.dataArr.count - 1 { + cell.lineView.isHidden = true + } else { + cell.lineView.isHidden = false + } + return cell } diff --git a/ReaderHive/Class/Me/VC/NRMyUnlocksCell.swift b/ReaderHive/Class/Me/VC/NRMyUnlocksCell.swift index fc50026..7ddc4d6 100644 --- a/ReaderHive/Class/Me/VC/NRMyUnlocksCell.swift +++ b/ReaderHive/Class/Me/VC/NRMyUnlocksCell.swift @@ -10,6 +10,15 @@ import UIKit class NRMyUnlocksCell: NRTableViewCell { + var model: NRNovelModel? { + didSet { + coverImageView.nr_setImage(model?.image_url) + titleLabel.text = model?.name + chLabel.text = "Ch.##".localizedReplace(text: "\(model?.purchased_num ?? 0)") + "/" + "Ch.##".localizedReplace(text: "\(model?.episode_total ?? 0)") + countLabel.text = "\(model?.all_purchase_num ?? 0)" + } + } + @IBOutlet weak var bgView: UIView! @IBOutlet weak var coverImageView: NRImageView! diff --git a/ReaderHive/Class/Me/VC/NRMyUnlocksCell.xib b/ReaderHive/Class/Me/VC/NRMyUnlocksCell.xib index 23a83eb..ba30e94 100644 --- a/ReaderHive/Class/Me/VC/NRMyUnlocksCell.xib +++ b/ReaderHive/Class/Me/VC/NRMyUnlocksCell.xib @@ -34,7 +34,7 @@ -