From 5667b11a5540a10c317260b6fdc3ceab7995dd60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BE=9C=E5=A3=B0=E4=B8=96=E7=BA=AA?= <> Date: Mon, 15 Dec 2025 15:02:56 +0800 Subject: [PATCH] =?UTF-8?q?=20=E7=99=BB=E5=BD=95=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Podfile | 1 + ReaderHive.xcodeproj/project.pbxproj | 54 +++++++++ .../Base/Networking/API/NRUserAPI.swift | 32 +++++ .../WebView/NRWebViewController+Script.swift | 71 +++++++++++ .../Home/V/NRHomeNovelNewArrivalsCell.swift | 1 + ReaderHive/Class/Me/V/NRLoginView.swift | 110 ++++++++++++++++++ ReaderHive/Class/Me/V/NRMeHeaderView.swift | 18 +++ .../Me/VC/NRFeedbackViewController.swift | 14 +-- ReaderHive/Delegate/AppDelegate+Config.swift | 6 + ReaderHive/Delegate/AppDelegate+Open.swift | 33 ++++++ ReaderHive/Delegate/AppDelegate.swift | 3 +- .../Libs/Login/NRLoginManager+Apple.swift | 107 +++++++++++++++++ .../Libs/Login/NRLoginManager+Facebook.swift | 59 ++++++++++ ReaderHive/Libs/Login/NRLoginManager.swift | 74 ++++++++++++ ReaderHive/Libs/Login/NRThirdSignModel.swift | 24 ++++ ReaderHive/ReaderHive.entitlements | 12 ++ .../Apple@2x.png | Bin 0 -> 479 bytes .../Apple@3x.png | Bin 0 -> 674 bytes .../Contents.json | 22 ++++ .../Contents.json | 22 ++++ .../Facebook@2x.png | Bin 0 -> 804 bytes .../Facebook@3x.png | Bin 0 -> 1093 bytes .../Contents.json | 20 ++++ .../Image/login_button.imageset/Contents.json | 22 ++++ .../Image/login_button.imageset/登录@2x.png | Bin 0 -> 1355 bytes .../Image/login_button.imageset/登录@3x.png | Bin 0 -> 1986 bytes .../login_logo_icon.imageset/Contents.json | 22 ++++ .../文字LOGO(ReaderHive)@2x.png | Bin 0 -> 15921 bytes .../文字LOGO(ReaderHive)@3x.png | Bin 0 -> 30765 bytes ReaderHive/Source/Info.plist | 25 ++++ .../Source/en.lproj/Localizable.strings | 2 + 31 files changed, 744 insertions(+), 10 deletions(-) create mode 100644 ReaderHive/Class/Me/V/NRLoginView.swift create mode 100644 ReaderHive/Delegate/AppDelegate+Open.swift create mode 100644 ReaderHive/Libs/Login/NRLoginManager+Apple.swift create mode 100644 ReaderHive/Libs/Login/NRLoginManager+Facebook.swift create mode 100644 ReaderHive/Libs/Login/NRThirdSignModel.swift create mode 100644 ReaderHive/ReaderHive.entitlements create mode 100644 ReaderHive/Source/Assets.xcassets/Image/apple_login_logo_icon.imageset/Apple@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/apple_login_logo_icon.imageset/Apple@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/apple_login_logo_icon.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/facebook_login_logo_icon.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/facebook_login_logo_icon.imageset/Facebook@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/facebook_login_logo_icon.imageset/Facebook@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/feedback_list_icon_01.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/login_button.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/login_button.imageset/登录@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/login_button.imageset/登录@3x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/login_logo_icon.imageset/Contents.json create mode 100644 ReaderHive/Source/Assets.xcassets/Image/login_logo_icon.imageset/文字LOGO(ReaderHive)@2x.png create mode 100644 ReaderHive/Source/Assets.xcassets/Image/login_logo_icon.imageset/文字LOGO(ReaderHive)@3x.png diff --git a/Podfile b/Podfile index 016e1fc..fdf432b 100644 --- a/Podfile +++ b/Podfile @@ -33,5 +33,6 @@ target 'ReaderHive' do pod 'Toast' pod 'SVProgressHUD' pod 'FDFullscreenPopGesture' + pod 'ZLPhotoBrowser' end diff --git a/ReaderHive.xcodeproj/project.pbxproj b/ReaderHive.xcodeproj/project.pbxproj index b316ccc..377bc9d 100644 --- a/ReaderHive.xcodeproj/project.pbxproj +++ b/ReaderHive.xcodeproj/project.pbxproj @@ -96,6 +96,12 @@ 85CF94292EED4664006467E3 /* NRVipRetainAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF94282EED4664006467E3 /* NRVipRetainAlert.swift */; }; 85CF942B2EED47F2006467E3 /* NRVipRetainItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF942A2EED47F2006467E3 /* NRVipRetainItemView.swift */; }; 85CF942D2EED5204006467E3 /* NRPayAlertModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF942C2EED5204006467E3 /* NRPayAlertModel.swift */; }; + 85CF942F2EEFB2CF006467E3 /* NRLoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF942E2EEFB2CF006467E3 /* NRLoginView.swift */; }; + 85CF94312EEFDA88006467E3 /* NRLoginManager+Apple.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF94302EEFDA82006467E3 /* NRLoginManager+Apple.swift */; }; + 85CF94332EEFDAF4006467E3 /* NRThirdSignModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF94322EEFDAF4006467E3 /* NRThirdSignModel.swift */; }; + 85CF94372EEFE27E006467E3 /* FacebookLogin in Frameworks */ = {isa = PBXBuildFile; productRef = 85CF94362EEFE27E006467E3 /* FacebookLogin */; }; + 85CF94392EEFE35A006467E3 /* NRLoginManager+Facebook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF94382EEFE34F006467E3 /* NRLoginManager+Facebook.swift */; }; + 85CF943B2EEFE94C006467E3 /* AppDelegate+Open.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CF943A2EEFE947006467E3 /* AppDelegate+Open.swift */; }; 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 */; }; @@ -327,6 +333,12 @@ 85CF94282EED4664006467E3 /* NRVipRetainAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRVipRetainAlert.swift; sourceTree = ""; }; 85CF942A2EED47F2006467E3 /* NRVipRetainItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRVipRetainItemView.swift; sourceTree = ""; }; 85CF942C2EED5204006467E3 /* NRPayAlertModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRPayAlertModel.swift; sourceTree = ""; }; + 85CF942E2EEFB2CF006467E3 /* NRLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRLoginView.swift; sourceTree = ""; }; + 85CF94302EEFDA82006467E3 /* NRLoginManager+Apple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NRLoginManager+Apple.swift"; sourceTree = ""; }; + 85CF94322EEFDAF4006467E3 /* NRThirdSignModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NRThirdSignModel.swift; sourceTree = ""; }; + 85CF94342EEFDFAC006467E3 /* ReaderHive.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ReaderHive.entitlements; sourceTree = ""; }; + 85CF94382EEFE34F006467E3 /* NRLoginManager+Facebook.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NRLoginManager+Facebook.swift"; sourceTree = ""; }; + 85CF943A2EEFE947006467E3 /* AppDelegate+Open.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Open.swift"; 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 = ""; }; @@ -469,6 +481,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 85CF94372EEFE27E006467E3 /* FacebookLogin in Frameworks */, 67DC33BD353DB9F2D4C0FFE8 /* Pods_ReaderHive.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -588,6 +601,7 @@ 03980F862ED009EB0006E317 /* ReaderHive */ = { isa = PBXGroup; children = ( + 85CF94342EEFDFAC006467E3 /* ReaderHive.entitlements */, 03980F8F2ED00ACD0006E317 /* Delegate */, 039810562ED046030006E317 /* Base */, 039810752ED054090006E317 /* Class */, @@ -615,6 +629,7 @@ 03980F7D2ED009EB0006E317 /* AppDelegate.swift */, 03980F842ED009EB0006E317 /* SceneDelegate.swift */, 0398107B2ED0551C0006E317 /* AppDelegate+Config.swift */, + 85CF943A2EEFE947006467E3 /* AppDelegate+Open.swift */, ); path = Delegate; sourceTree = ""; @@ -728,8 +743,11 @@ isa = PBXGroup; children = ( 0398107E2ED055D10006E317 /* NRLoginManager.swift */, + 85CF94302EEFDA82006467E3 /* NRLoginManager+Apple.swift */, + 85CF94382EEFE34F006467E3 /* NRLoginManager+Facebook.swift */, 039810802ED056090006E317 /* NRLoginToken.swift */, 039810822ED0563D0006E317 /* NRUserInfo.swift */, + 85CF94322EEFDAF4006467E3 /* NRThirdSignModel.swift */, ); path = Login; sourceTree = ""; @@ -1027,6 +1045,7 @@ F349910A2EE16B520039E939 /* NRAboutCell.swift */, F34991172EE1780A0039E939 /* NRNovelHistoryCell.swift */, F3B859382EE676610095A9CC /* NRLanguageCell.swift */, + 85CF942E2EEFB2CF006467E3 /* NRLoginView.swift */, ); path = V; sourceTree = ""; @@ -1222,6 +1241,9 @@ ); mainGroup = 03980F5C2ED009E30006E317; minimizedProjectReferenceProxies = 1; + packageReferences = ( + 85CF94352EEFE27E006467E3 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */, + ); preferredProjectObjectVersion = 77; productRefGroup = 03980F662ED009E30006E317 /* Products */; projectDirPath = ""; @@ -1299,9 +1321,11 @@ files = ( F34991252EE27DB60039E939 /* NRGradientButton.swift in Sources */, F34348FD2ED8561300AA7E70 /* NRNovelReadContentBottomView.swift in Sources */, + 85CF94332EEFDAF4006467E3 /* NRThirdSignModel.swift in Sources */, F34348C52ED6CA4D00AA7E70 /* NRExploreNovelMenuDataSource.swift in Sources */, F343492A2EDD93AD00AA7E70 /* NRReadSettingFontView.swift in Sources */, 039810982ED066B20006E317 /* NRTool.swift in Sources */, + 85CF943B2EEFE94C006467E3 /* AppDelegate+Open.swift in Sources */, F34991272EE2826D0039E939 /* NRNovelReadViewModel+Data.swift in Sources */, F34348CD2ED6DD0900AA7E70 /* NRNovelGenresCell.swift in Sources */, F34348FF2ED85BF200AA7E70 /* NRReadBatteryView.swift in Sources */, @@ -1309,6 +1333,7 @@ 039810BA2ED4377E0006E317 /* NRHomeNovelReadWhatCell.swift in Sources */, F3B8596B2EE91C9F0095A9CC /* NRStoreCoinsCell.swift in Sources */, F3B859712EE94A1B0095A9CC /* NRFeedbackViewController.swift in Sources */, + 85CF94392EEFE35A006467E3 /* NRLoginManager+Facebook.swift in Sources */, F34348C72ED6CCBC00AA7E70 /* NRExploreNovelContentListViewController.swift in Sources */, 039810B82ED431780006E317 /* NRHomeNovelReadWhatView.swift in Sources */, F34349142EDA9AE900AA7E70 /* NRNovelReadSettingView.swift in Sources */, @@ -1435,10 +1460,12 @@ F3B859422EE678FB0095A9CC /* NRSettingAPI.swift in Sources */, 0373D9522ED58A950017DCC7 /* NRSearchViewModel.swift in Sources */, F34990BF2EDEDDCF0039E939 /* NRCategoryModel.swift in Sources */, + 85CF942F2EEFB2CF006467E3 /* NRLoginView.swift in Sources */, F34349242EDD3C2400AA7E70 /* NRNovelReadBottomView.swift in Sources */, 039810622ED04F250006E317 /* NRNetwork.swift in Sources */, 039810782ED054740006E317 /* NRHud.swift in Sources */, F34991032EE160F00039E939 /* NRUserAPI.swift in Sources */, + 85CF94312EEFDA88006467E3 /* NRLoginManager+Apple.swift in Sources */, 85606A9F2EEBE95A005D989D /* NRDashedLineView.swift in Sources */, 039810C42ED459440006E317 /* NRHomeNovelHotTagView.swift in Sources */, F34991122EE170E20039E939 /* NRWebView.swift in Sources */, @@ -1546,6 +1573,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = ReaderHive/ReaderHive.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; @@ -1555,6 +1583,9 @@ INFOPLIST_FILE = ReaderHive/Source/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = ReaderHive; INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; + 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_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = ""; @@ -1587,6 +1618,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = ReaderHive/ReaderHive.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; @@ -1595,6 +1627,9 @@ INFOPLIST_FILE = ReaderHive/Source/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = ReaderHive; INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; + 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_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = ""; @@ -1764,6 +1799,25 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 85CF94352EEFE27E006467E3 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/facebook/facebook-ios-sdk"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 14.1.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 85CF94362EEFE27E006467E3 /* FacebookLogin */ = { + isa = XCSwiftPackageProductDependency; + package = 85CF94352EEFE27E006467E3 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; + productName = FacebookLogin; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 03980F5D2ED009E30006E317 /* Project object */; } diff --git a/ReaderHive/Base/Networking/API/NRUserAPI.swift b/ReaderHive/Base/Networking/API/NRUserAPI.swift index 33696d4..2ae1cd7 100644 --- a/ReaderHive/Base/Networking/API/NRUserAPI.swift +++ b/ReaderHive/Base/Networking/API/NRUserAPI.swift @@ -7,6 +7,7 @@ import UIKit import Alamofire +import SmartCodable struct NRUserAPI { @@ -26,4 +27,35 @@ struct NRUserAPI { } } + + static func requestSignThirdLogin(model: NRThirdSignModel, completer: ((_ token: NRLoginToken?) -> Void)?) { + + var param = NRNetwork.Parameters(path: "/customer/login") + param.method = .post + param.parameters = model.toDictionary() + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in + if response.isSuccess { + completer?(response.data) + } else { + completer?(nil) + } + } + } + + static func requestLogout(completer: ((_ token: NRLoginToken?) -> Void)?) { + var param = NRNetwork.Parameters(path: "/customer/signout") + param.method = .post + param.isLoding = true + + NRNetwork.request(parameters: param) { (response: NRNetwork.Response) in + if response.isSuccess { + completer?(response.data) + } else { + completer?(nil) + } + } + + } + } diff --git a/ReaderHive/Base/WebView/NRWebViewController+Script.swift b/ReaderHive/Base/WebView/NRWebViewController+Script.swift index a88686c..86858cd 100644 --- a/ReaderHive/Base/WebView/NRWebViewController+Script.swift +++ b/ReaderHive/Base/WebView/NRWebViewController+Script.swift @@ -7,6 +7,7 @@ import UIKit internal import WebKit +import ZLPhotoBrowser ///APP交互 let kNRWebMessageAPP = "js2app" @@ -23,6 +24,76 @@ let kNRWebMessageAccountDeletionFinish = "accountLogout" extension NRWebViewController { func nr_webViewUserContentController(didReceive message: WKScriptMessage) { + let name = message.name + let body = message.body + switch name { + case kNRWebMessageOpenFeedbackList: + let vc = NRAppWebViewController() + vc.webUrl = kNRFeedBackListWebUrl + self.navigationController?.pushViewController(vc, animated: true) + + case kNRWebMessageOpenFeedbackDetail: + guard let body = body as? [String : Any] else { return } + guard let id = body["id"] as? Int else { return } + + let vc = NRAppWebViewController() + vc.id = "\(id)" + vc.webUrl = kNRFeedBackDetailWebUrl + self.navigationController?.pushViewController(vc, animated: true) + + case kNRWebMessageOpenPhotoPicker: + openPhotoPicker() + +// case kNRWebMessageAPP: +// guard let body = message.body as? [String : Any] else { return } +// guard let model = FAWebMessageModel.deserialize(from: body) else { return } +// let type = model.type +// let data = model.data +// +// if type == "login" { +//// let view = FALoginView() +//// view.present(in: nil) +// +// } else { +// +// guard let urlStr = data?.link else { return } +// guard let url = URL(string: urlStr) else { return } +// if UIApplication.shared.canOpenURL(url) { +// UIApplication.shared.open(url) +// } +// } + + case kNRWebMessageAccountDeletionFinish: + self.navigationController?.popToRootViewController(animated: true) + NotificationCenter.default.post(name: NRLoginManager.loginStateDidChangeNotification, object: nil) + + default: + break + } + } + + ///打开相册 + private func openPhotoPicker() { + + 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) } } diff --git a/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsCell.swift b/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsCell.swift index 4ed79a6..e6bbe7b 100644 --- a/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsCell.swift +++ b/ReaderHive/Class/Home/V/NRHomeNovelNewArrivalsCell.swift @@ -115,6 +115,7 @@ extension NRHomeNovelNewArrivalsCell { categoryView.snp.makeConstraints { make in make.left.equalToSuperview() + make.right.lessThanOrEqualToSuperview() make.top.equalTo(titleLabel.snp.bottom).offset(4) make.height.equalTo(20) } diff --git a/ReaderHive/Class/Me/V/NRLoginView.swift b/ReaderHive/Class/Me/V/NRLoginView.swift new file mode 100644 index 0000000..0f99b6e --- /dev/null +++ b/ReaderHive/Class/Me/V/NRLoginView.swift @@ -0,0 +1,110 @@ +// +// NRLoginView.swift +// ReaderHive +// +// Created by 澜声世纪 on 2025/12/15. +// + +import UIKit +import HWPanModal +import SnapKit + +class NRLoginView: NRPanModalContentView { + + + private lazy var bgView = UIImageView(image: UIImage(named: "bg_image_01")) + + private lazy var titleView = UIImageView(image: UIImage(named: "login_logo_icon")) + + private lazy var appleLoginButton: UIButton = { + var configuration = UIButton.Configuration.plain() + configuration.background.backgroundColor = .F_2_EFEE + configuration.background.cornerRadius = 24 + configuration.image = UIImage(named: "apple_login_logo_icon") + configuration.imagePadding = 8 + configuration.attributedTitle = AttributedString("Login with Apple".localized, attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .medium), + .foregroundColor : UIColor.black + ])) + + let button = UIButton(configuration: configuration, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + self.login(type: .apple) + })) + return button + }() + + private lazy var facebookLoginButton: UIButton = { + var configuration = UIButton.Configuration.plain() + configuration.background.backgroundColor = .F_2_EFEE + configuration.background.cornerRadius = 24 + configuration.image = UIImage(named: "facebook_login_logo_icon") + configuration.imagePadding = 8 + configuration.attributedTitle = AttributedString("Login with Facebook".localized, attributes: AttributeContainer([ + .font : UIFont.font(ofSize: 14, weight: .medium), + .foregroundColor : UIColor.black + ])) + + let button = UIButton(configuration: configuration, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + self.login(type: .faceBook) + })) + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + contentHeight = 220 + UIScreen.safeBottom + nr_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func login(type: NRLoginManager.LoginType) { + NRHud.show() + NRLoginManager.manager.thirdLogin(type: type, presentingViewController: nil) { [weak self] isFinish in + NRHud.dismiss() + guard let self = self else { return } + guard isFinish else { return } + self.dismiss(animated: true) { + + } + } + + } + +} + +extension NRLoginView { + + private func nr_setupUI() { + addSubview(bgView) + addSubview(titleView) + addSubview(appleLoginButton) + addSubview(facebookLoginButton) + + bgView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + } + + titleView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(24) + } + + appleLoginButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(44) + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(84) + make.height.equalTo(48) + } + + facebookLoginButton.snp.makeConstraints { make in + make.left.right.height.equalTo(appleLoginButton) + make.top.equalTo(appleLoginButton.snp.bottom).offset(16) + } + } + +} diff --git a/ReaderHive/Class/Me/V/NRMeHeaderView.swift b/ReaderHive/Class/Me/V/NRMeHeaderView.swift index 7f547fa..a46f8f8 100644 --- a/ReaderHive/Class/Me/V/NRMeHeaderView.swift +++ b/ReaderHive/Class/Me/V/NRMeHeaderView.swift @@ -8,6 +8,7 @@ import UIKit import SnapKit import YYCategories +import HWPanModal class NRMeHeaderView: UITableViewHeaderFooterView { @@ -21,6 +22,7 @@ class NRMeHeaderView: UITableViewHeaderFooterView { coinsView.userInfo = userInfo + loginButton.isHidden = !(userInfo?.is_tourist ?? false) stackView.nr_removeAllArrangedSubview() stackView.addArrangedSubview(coinsView) @@ -72,6 +74,16 @@ class NRMeHeaderView: UITableViewHeaderFooterView { return button }() + private lazy var loginButton: UIButton = { + let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + let view = NRLoginView() + view.present(in: nil) + })) + button.setImage(UIImage(named: "login_button"), for: .normal) + return button + }() + private lazy var stackView: UIStackView = { let view = UIStackView() view.axis = .vertical @@ -121,6 +133,7 @@ extension NRMeHeaderView { contentView.addSubview(idBgView) idBgView.addSubview(idLabel) idBgView.addSubview(copyButton) + contentView.addSubview(loginButton) contentView.addSubview(stackView) avatarImageView.snp.makeConstraints { make in @@ -152,6 +165,11 @@ extension NRMeHeaderView { make.left.equalTo(idLabel.snp.right).offset(8) } + loginButton.snp.makeConstraints { make in + make.centerY.equalTo(avatarImageView) + make.right.equalToSuperview().offset(-16) + } + stackView.snp.makeConstraints { make in make.left.right.equalToSuperview() make.top.equalTo(avatarImageView.snp.bottom).offset(16) diff --git a/ReaderHive/Class/Me/VC/NRFeedbackViewController.swift b/ReaderHive/Class/Me/VC/NRFeedbackViewController.swift index e73c2d3..3be2d73 100644 --- a/ReaderHive/Class/Me/VC/NRFeedbackViewController.swift +++ b/ReaderHive/Class/Me/VC/NRFeedbackViewController.swift @@ -13,18 +13,14 @@ class NRFeedbackViewController: NRAppWebViewController { self.webUrl = kNRFeedBackHomeWebUrl super.viewDidLoad() + self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named: "feedback_list_icon_01"), style: .plain, target: self, action: #selector(openFeedbackList)) } - - /* - // 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. + @objc private func openFeedbackList() { + let vc = NRAppWebViewController() + vc.webUrl = kNRFeedBackListWebUrl + self.navigationController?.pushViewController(vc, animated: true) } - */ } diff --git a/ReaderHive/Delegate/AppDelegate+Config.swift b/ReaderHive/Delegate/AppDelegate+Config.swift index 2399ea4..18b4e0b 100644 --- a/ReaderHive/Delegate/AppDelegate+Config.swift +++ b/ReaderHive/Delegate/AppDelegate+Config.swift @@ -8,6 +8,7 @@ import UIKit import IQKeyboardManagerSwift import IQKeyboardToolbarManager import MJRefresh +import FacebookCore extension AppDelegate { @@ -30,4 +31,9 @@ extension AppDelegate { UIDevice.current.isBatteryMonitoringEnabled = true } + + func nr_registThirdparty(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) { + ApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) + } + } diff --git a/ReaderHive/Delegate/AppDelegate+Open.swift b/ReaderHive/Delegate/AppDelegate+Open.swift new file mode 100644 index 0000000..4bd1c89 --- /dev/null +++ b/ReaderHive/Delegate/AppDelegate+Open.swift @@ -0,0 +1,33 @@ +// +// AppDelegate+Open.swift +// ReaderHive +// +// Created by 澜声世纪 on 2025/12/15. +// + +import UIKit +import FacebookCore + +extension SceneDelegate { + + func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { + guard let url = URLContexts.first?.url else { + return + } + var result = false + + result = ApplicationDelegate.shared.application(UIApplication.shared, open: url, sourceApplication: nil, annotation: [UIApplication.OpenURLOptionsKey.annotation]) + + + } + + func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { + guard let webpageURL = userActivity.webpageURL else { return } + var result = false + + result = ApplicationDelegate.shared.application(UIApplication.shared, continue: userActivity) + + + } + +} diff --git a/ReaderHive/Delegate/AppDelegate.swift b/ReaderHive/Delegate/AppDelegate.swift index 08714c9..7ec2e35 100644 --- a/ReaderHive/Delegate/AppDelegate.swift +++ b/ReaderHive/Delegate/AppDelegate.swift @@ -6,15 +6,16 @@ // import UIKit +import FacebookCore @main class AppDelegate: UIResponder, UIApplicationDelegate { - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { NRTool.appDelegate = self NRNetworkReachableManager.manager.startMonitoring() + nr_registThirdparty(application, didFinishLaunchingWithOptions: launchOptions) NotificationCenter.default.addObserver(self, selector: #selector(networkStatusDidChangeNotification), name: NRNetworkReachableManager.networkStatusDidChangeNotification, object: nil) diff --git a/ReaderHive/Libs/Login/NRLoginManager+Apple.swift b/ReaderHive/Libs/Login/NRLoginManager+Apple.swift new file mode 100644 index 0000000..ae97453 --- /dev/null +++ b/ReaderHive/Libs/Login/NRLoginManager+Apple.swift @@ -0,0 +1,107 @@ +// +// NRLoginManager+Apple.swift +// ReaderHive +// +// Created by 澜声世纪 on 2025/12/15. +// + +import UIKit +import AuthenticationServices + +extension NRLoginManager { + + private struct AssociatedKeys { + static var appleLoginHandle: Int? + } + + private var appleLoginHandle: ((_ model: NRThirdSignModel?) -> Void)? { + set { + objc_setAssociatedObject(self, &AssociatedKeys.appleLoginHandle, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC) + } + get { + return objc_getAssociatedObject(self, &AssociatedKeys.appleLoginHandle) as? ((_ model: NRThirdSignModel?) -> Void) + } + } + + func nr_appleLogin(completer: ((_ model: NRThirdSignModel?) -> Void)?) { + self.appleLoginHandle = completer + + let appleIDProvider = ASAuthorizationAppleIDProvider() + let request = appleIDProvider.createRequest() + request.requestedScopes = [.fullName, .email] + + let authorizationController = ASAuthorizationController(authorizationRequests: [request]) + authorizationController.delegate = self + authorizationController.presentationContextProvider = self + authorizationController.performRequests() + } + + private func jwtDecode(jwtStr: String) -> [String: Any]? { + let segments = jwtStr.components(separatedBy: ".") + guard segments.count > 1 else { return nil } + + var base64String = segments[1] + + // 处理 Base64 补齐 + let requiredLength = 4 * Int(ceil(Double(base64String.count) / 4.0)) + let paddingLength = requiredLength - base64String.count + if paddingLength > 0 { + base64String += String(repeating: "=", count: paddingLength) + } + + // 替换 URL 安全字符 + base64String = base64String.replacingOccurrences(of: "-", with: "+") + base64String = base64String.replacingOccurrences(of: "_", with: "/") + + // 解码 Base64 数据 + guard let data = Data(base64Encoded: base64String), + let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []), + let payload = jsonObject as? [String: Any] else { + return nil + } + + return payload + } + +} + +//MARK: ASAuthorizationControllerDelegate +extension NRLoginManager: ASAuthorizationControllerDelegate { + + func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { + if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential { + + let userIdentifier = appleIDCredential.user + let fullName = appleIDCredential.fullName + + let identityToken = appleIDCredential.identityToken.flatMap { String(data: $0, encoding: .utf8) } + let identityTokenParams = self.jwtDecode(jwtStr: identityToken ?? "") + + var model = NRThirdSignModel() + model.platform = .apple + model.third_id = userIdentifier + model.giving_name = fullName?.givenName + model.family_name = fullName?.familyName + model.avator = identityTokenParams?["picture"] as? String + model.email = identityTokenParams?["email"] as? String + + appleLoginHandle?(model) + appleLoginHandle = nil + } + } + + func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { + appleLoginHandle?(nil) + appleLoginHandle = nil + } + +} + +//MARK: ASAuthorizationControllerPresentationContextProviding +extension NRLoginManager: ASAuthorizationControllerPresentationContextProviding { + + func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { + return NRTool.keyWindow! + } + +} diff --git a/ReaderHive/Libs/Login/NRLoginManager+Facebook.swift b/ReaderHive/Libs/Login/NRLoginManager+Facebook.swift new file mode 100644 index 0000000..2eae61b --- /dev/null +++ b/ReaderHive/Libs/Login/NRLoginManager+Facebook.swift @@ -0,0 +1,59 @@ +// +// NRLoginManager+Facebook.swift +// ReaderHive +// +// Created by 澜声世纪 on 2025/12/15. +// + +import UIKit +import FacebookLogin + +extension NRLoginManager { + + func nr_facebookLogin(presentingViewController: UIViewController?, completer: ((_ model: NRThirdSignModel?) -> Void)?) { + + let loginManager = LoginManager() + loginManager.logOut() + loginManager.defaultAudience = .everyone + + loginManager.logIn(permissions: ["public_profile", "email"], from: presentingViewController) { result, error in + guard error == nil, let result = result else { + completer?(nil) + return + } + if result.isCancelled { + completer?(nil) + return + } + let request = GraphRequest(graphPath: "me", parameters: ["fields" : "id,name,email,picture"], httpMethod: .get) + request.start { connection, result, error in + guard let result = result as? [String : Any] else { + completer?(nil) + return + } + var model = NRThirdSignModel() + model.platform = .faceBook + model.third_id = result["id"] as? String + model.email = result["email"] as? String + + if let picture = result["picture"] as? [String : Any], + let data = picture["data"] as? [String : Any], + let url = data["url"] as? String + { + model.avator = url + } + + if let name = result["name"] as? String { + model.family_name = name + } else { + model.family_name = result["first_name"] as? String + model.giving_name = result["last_name"] as? String + } + completer?(model) + } + + + } + } + +} diff --git a/ReaderHive/Libs/Login/NRLoginManager.swift b/ReaderHive/Libs/Login/NRLoginManager.swift index 74b770b..394eda2 100644 --- a/ReaderHive/Libs/Login/NRLoginManager.swift +++ b/ReaderHive/Libs/Login/NRLoginManager.swift @@ -6,9 +6,17 @@ // import UIKit +import SmartCodable class NRLoginManager: NSObject { + enum LoginType: String, SmartCaseDefaultable { + case apple = "Apple" + case faceBook = "Facebook" + case google = "Google" + case tiktok = "Tiktok" + } + static let manager = NRLoginManager() private(set) var token = UserDefaults.nr_object(forKey: kNRLoginTokenDefaultsKey, as: NRLoginToken.self) @@ -30,6 +38,72 @@ class NRLoginManager: NSObject { } } + ///第三方登录 + func thirdLogin(type: LoginType, presentingViewController: UIViewController?, completer: ((_ isFinish: Bool) -> Void)?) { + switch type { + case .apple: + nr_appleLogin { [weak self] model in + self?.requestSignThirdLogin(thirdSignModel: model, completer: completer) + } + + case .faceBook: + nr_facebookLogin(presentingViewController: presentingViewController) { [weak self] model in + self?.requestSignThirdLogin(thirdSignModel: model, completer: completer) + } + + default: + break + } + } + + ///后台验证三方登录 + private func requestSignThirdLogin(thirdSignModel: NRThirdSignModel?, completer: ((_ isFinish: Bool) -> Void)?) { + guard let thirdSignModel = thirdSignModel else { + completer?(false) + return + } +// FAStatAPI.requestLeaveApp() + NRUserAPI.requestSignThirdLogin(model: thirdSignModel) { [weak self] token in + guard let self = self else { return } + guard let token = token else { + completer?(false) + return + } + self.setAccountToken(token) + self.userInfo?.is_tourist = false + Task { + await self.updateUserInfo() + } +// FAStatAPI.requestEnterApp() +// FAStatAPI.requestStatOnLine() + completer?(true) + NotificationCenter.default.post(name: NRLoginManager.userInfoUpdateNotification, object: nil) + NotificationCenter.default.post(name: NRLoginManager.loginStateDidChangeNotification, object: nil) + } + } + + func logout(completer: ((_ isFinish: Bool) -> Void)?) { +// FAStatAPI.requestLeaveApp() + + NRUserAPI.requestLogout { [weak self] token in + guard let self = self else { return } + if let token = token { + self.setAccountToken(token) + self.userInfo?.is_tourist = true + Task { + await self.updateUserInfo() + } +// FAStatAPI.requestEnterApp() +// FAStatAPI.requestStatOnLine() + completer?(true) + NotificationCenter.default.post(name: NRLoginManager.userInfoUpdateNotification, object: nil) + NotificationCenter.default.post(name: NRLoginManager.loginStateDidChangeNotification, object: nil) + } else { + completer?(false) + } + } + + } } diff --git a/ReaderHive/Libs/Login/NRThirdSignModel.swift b/ReaderHive/Libs/Login/NRThirdSignModel.swift new file mode 100644 index 0000000..f0180c3 --- /dev/null +++ b/ReaderHive/Libs/Login/NRThirdSignModel.swift @@ -0,0 +1,24 @@ +// +// NRThirdSignModel.swift +// ReaderHive +// +// Created by 澜声世纪 on 2025/12/15. +// + +import UIKit +import SmartCodable + +struct NRThirdSignModel: SmartCodable { + + var third_id: String? + var email: String? + //姓 + var family_name: String? + //名 + var giving_name: String? + + var avator: String? + + var platform: NRLoginManager.LoginType? + +} diff --git a/ReaderHive/ReaderHive.entitlements b/ReaderHive/ReaderHive.entitlements new file mode 100644 index 0000000..d705386 --- /dev/null +++ b/ReaderHive/ReaderHive.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.developer.applesignin + + Default + + keychain-access-groups + + + diff --git a/ReaderHive/Source/Assets.xcassets/Image/apple_login_logo_icon.imageset/Apple@2x.png b/ReaderHive/Source/Assets.xcassets/Image/apple_login_logo_icon.imageset/Apple@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dea1972f575f42ab514313aef8cd2ca0178a3711 GIT binary patch literal 479 zcmV<50U-W~P)oWysj$~4o%3u?*c@l$W_@k1&x^TDw3rIq@{CA3x0K#{*89Fg zM&P!<`C`t?At2$(fZNARk{KBr+!F~R0<=4`H44PCFl3N1{f+d-ax+gPADG+L3omq&4$|Tf-NSi@Mf!RA{Vxb;Ps)RBM zchV&i64<~;WSI^dF~w2_HZXJVn9hWG<5Y-vZbJ04&6NG@`{z(&y0fE=M4+i&`32XW V_C`a+hAjX9002ovPDHLkV1j04#BBfo literal 0 HcmV?d00001 diff --git a/ReaderHive/Source/Assets.xcassets/Image/apple_login_logo_icon.imageset/Apple@3x.png b/ReaderHive/Source/Assets.xcassets/Image/apple_login_logo_icon.imageset/Apple@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ff555d247feebd0a0d4a392a6e94ede520bf08 GIT binary patch literal 674 zcmV;T0$u%yP)I=l)!Axd=cO+Um}#vMRX%G>s8+r0k8|a%!m4BN?-&-;~piOgWdSPMQqS_)S%0 ziVNIltRO=Q{H97W{& zSY6X(!~OnE6Y#UuQ~P@eH}}Tsv(+d5FUz`>JJur!Peh02ZPVH(S19)McM)CoLXLA> zUeyUV=3W3JP;NPECUOfH zfvRXK=p+Vb5vCoHXut?lMIcxBjY;EM=s=&bYvl11I?!iKAq&?` z*P(-RGB&ES_Zge5$y|dgE|i>%sWF3n#%g4t7;$;{jDRDwv59FhW!^ zBMKQy@<4(;nJr*e)|Nzk2h2*^lMq)W*LY`EvB2(`V*E=BH{P9)a^hUYLMZ&-Mw!-x zyCybg<`)cSzhtEi+=A0vfjhhII@IBZ_&4^R#$?s%fr%Z@UkmBDCDth{r~m)}07*qo IM6N<$f*-3YVE_OC literal 0 HcmV?d00001 diff --git a/ReaderHive/Source/Assets.xcassets/Image/apple_login_logo_icon.imageset/Contents.json b/ReaderHive/Source/Assets.xcassets/Image/apple_login_logo_icon.imageset/Contents.json new file mode 100644 index 0000000..e1641ae --- /dev/null +++ b/ReaderHive/Source/Assets.xcassets/Image/apple_login_logo_icon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Apple@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Apple@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ReaderHive/Source/Assets.xcassets/Image/facebook_login_logo_icon.imageset/Contents.json b/ReaderHive/Source/Assets.xcassets/Image/facebook_login_logo_icon.imageset/Contents.json new file mode 100644 index 0000000..215149c --- /dev/null +++ b/ReaderHive/Source/Assets.xcassets/Image/facebook_login_logo_icon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Facebook@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Facebook@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ReaderHive/Source/Assets.xcassets/Image/facebook_login_logo_icon.imageset/Facebook@2x.png b/ReaderHive/Source/Assets.xcassets/Image/facebook_login_logo_icon.imageset/Facebook@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..28337f5c04a5c654eeed372067e57d1a7f0461f0 GIT binary patch literal 804 zcmV+<1Ka$GP)%or7E04JI^yC(geljtot7hvFv6MaqPKsF_M4qwuZZ zubD(heWoNbKGY?q!J11fP39kK@lR9v2uwH9W@UL(qD*sxqNutfCRr3~@9bSf&jML# zED8C$vjtO8vB%XzbdrvA3hK&1HOed|`hcR)oe`YmAQM2NfL{FAv<hi|R=)FKyehwshjXr_v=#Yh$z z;!hL=2}Rag5YCoC7&MHpuo9L1eLyXxT!M^I@C|zg!_19deL`e5)bs)S0@wCAAe>VR zy4V+(x;!Y{-k&GBWkpQP12}opu(rCbItl7^a&VvBmAHe zdc&{OMS>6#K*T^}UwhaiGD2dbH3p<`%{{tGLgd22D#yAqe83TR=y*{v0rdGnwT9oQ zg9TYg*y^D^f`?`bg63IRU@T$ma#jALOaAO2Tl!G=z%JU4dV`AEP^_d!xP1drLX|w+ zt~K;=)EgpMtlZG2{MAH0Xbvx^71k(JSou(k>(!Ab2%X_M9RxQCAeW*hgoyJUW5)gR zDoWtK*&*V@X)&27IBIC40I-0QKNr+?oS#Lebea7!Sfdg_!ZNL}HNO5Ic6+Y{;2DG<`Nmg9UJh2>~Tl#Bwh?^%fq9h2}jOrb1pe6tfBAmG7?V(BM3Mv zucJL^(;&({Ci3xc@46-~xw?*x$#0dWH;J_}5@k{r8izsU{m|%5*dodoV5hyXmn5{mo$Cl z%JTgA7s8}UTO^m1zPc*Q&V0;n#}q+a%e9*+_$Hbh{xtb3^~&ulxUzk85|}~rjdkQx z+?DN{FQKIY`vZA$%T|~uAyUmlOfFlYZ#i4q9ng~?_j^v{VvY<_&fT`m#$DF%+A9C; zH&M8VRi!dptLL=AcO7IQaB8J&4BCN zq1{C@ar;_?d3E-$O+8+-@t*kBn0eWGTzuI!FT#vBJ>=tC8c2ixy0>o*jBC-|00000 LNkvXXu0mjfRkro} literal 0 HcmV?d00001 diff --git a/ReaderHive/Source/Assets.xcassets/Image/feedback_list_icon_01.imageset/Contents.json b/ReaderHive/Source/Assets.xcassets/Image/feedback_list_icon_01.imageset/Contents.json new file mode 100644 index 0000000..a19a549 --- /dev/null +++ b/ReaderHive/Source/Assets.xcassets/Image/feedback_list_icon_01.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ReaderHive/Source/Assets.xcassets/Image/login_button.imageset/Contents.json b/ReaderHive/Source/Assets.xcassets/Image/login_button.imageset/Contents.json new file mode 100644 index 0000000..ad8c567 --- /dev/null +++ b/ReaderHive/Source/Assets.xcassets/Image/login_button.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "登录@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "登录@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ReaderHive/Source/Assets.xcassets/Image/login_button.imageset/登录@2x.png b/ReaderHive/Source/Assets.xcassets/Image/login_button.imageset/登录@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..396cd8ea7307caf5e1bafb7eeceac17e973478b0 GIT binary patch literal 1355 zcmV-R1+@B!P)gmcBuc+PyA_BFhj#A>x`=ys4_pwaS#F$4`2vI! zoajOeNN~VC(VJJIt*Y)O)Au~%)OM4NJ+VDA+5DtL&SclI|9bCv{QTZ{Xb=(o+Xfy5 zwAG`JCjgJO(N*6D*}wKedfTUQdSQ=V_h@_1>%2WcgLtSJDaykQ+B^>_MjP`pphMpU z{DIebBSekVB2Z409_nSlVtJjn`lx|Q1yU|_g|@Du8cQidNT<^$tJZ^0k~M95oj1S79B2!q;>>5Xc@=iE4XkZ>os;{}KuaJI z{S^SiA7P)>Od|wZ=X7F|kCI528s3IG;xGXpvxxqDA0;Uz5d8oJVvjAybRgD&j(K!b zM0ZPtgu()e=nslFqiwj)b$KquC=`RFKkDi>H3rFf&d}9>T$K16<+)Dgh#(zL0s|~QfjZZTOms03{Z4Vm zU(mQSjmhz7iUs-CaqRGJOmelA{D7PzIw;I&_a1_AJZCz01O z`%Hh3S1qvtM;V2`;^3=`l%)L+dU#jzR+MwG(IvPZm>)mD@P{v;Nn2Ubn4CcFT2GqM z{lB44){4e4h+@x%$=H+d!lyq&hfM4uE1H8OpB~?aq%25W!jgpZ$wn-Y49>MbeQ=3h z;%3T%Mm;Ra5xZF;kQw(H{`57yzJaC0Zk7b;9vUVuPV4Lku#7IdnJ;t9%`*JuyNo!N zT2fp`KrZHW(J*{VfEQoMjM*uY==mn*KHjUZWA);fE{GIc&}kUJ5s_FRa~VSiL^{nD zWHhB}yGScl#h`ieIMZN}7=u%Qp!B2XrZH_v)(d1B>ji3^{m|$vdqq~0&L4+#^EiyS z{|^qo{TSl$|Cw>q;t-*63$j=oW}gHa?ZFV1i^H%$T%g@N4v542=BtYKMsY+OhGUR7 zK*R7;2M5Ffw?2?SPeR0HAkES0zMB!lPI1U|=vn=W*IC~e(OnMIJv0c5q7K7KaS*pS zJWILWf`PQ_Gm&hBn`Oo`>4QF&%iZV4XPdh#{X&sDjK=r+ZmRoA+Cs(@n8sgwD^=kh_yiZ0{W;creH zoir%xg%=}W7i4Ez>*my6jbr3$A+WYStz~oB%%a=O!pMIV7qGDSmuK~{&P>{?{)J5} z9)()Q3q944oq3{?MtwUFTSdAJnNn@xsv*|(MwiW^;xMKA=2fc{ue9J=;O6<=g|f@* zEEg7-f!32%`9lZmj!Y(Z-2>F(2-W97VTR%udcdpUyY-p!a z8Hty-br&>AQ}F^z9Gea|3<*`KFbTD-VW!%vSg0QAWq>%JzSgf&n1luvd1I^MW|_*w zN>;_IO_VgX3zSE#Sk;w9TXBtcTUOdmTqY2zJm;SL%yk4Wg>{RP<|%9u@`Jb0e*FLd N002ovPDHLkV1h-pfWH6$ literal 0 HcmV?d00001 diff --git a/ReaderHive/Source/Assets.xcassets/Image/login_button.imageset/登录@3x.png b/ReaderHive/Source/Assets.xcassets/Image/login_button.imageset/登录@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..816314467c173ec26fe422e9fd7b4e0e1299dfdb GIT binary patch literal 1986 zcmV;z2R-E9;3WJxyWLz@oG76~MIFFPm@g%DN{ zNl~;}9)->p3cy^22~q!Dp;v2=6Y8?WfhW(}oad;Ui!itQO9SYCNH3dElh(Y%AKs5W*jYGX+4V?Wolu5a>4V}3N#ZisJQ&} zYFcTjglSnxNiS_?VOrL#q?0z2FfA)BvrC&XOXLJY%bFc`#jmL*Cb2M)rs`}k1Ddm> z{E0%M+x?jexPxoZWQT>O@$B+e+;5L9%r7@_1w)?{XA8|^)|t3vtOOy^s|{*d*;C_V zD-yZs#1cj|F`ghB(8!|UU)h+-)R5?3&$sfJYNA$wY=k)w9AUAH5107|*`|>+D6Cr_VzYlr=7$h^m527-8NrG@TU=;r{tM zc5i)*olo9^+xr6&s7NX`Z7X>9C;)lcbbfnzwM*r0RxJD|i<#eF_{s z7WwrOORModTQtJ@4Jd?BJ62(7hinpND7Qwwy3z(b!rTTFq>|E1<2VU3k3&%^CvAW_ zXNgKLw5gah9$|*^E2AnTt+wEAyP6BK)(Xajr7;SZv1-bP#H1)b(rTISgrfo~ORJ)gA_&SNZW=1o3SL}gh-Z$WIrpHHSJasA%@TK5SzC@3zA>6w1F1f{8nEXEV& zKw&B*i}8g014XHrEY3I_E=@U5kjlwo2JQo{);my)O3L!EIxMUWg{ZD9#&t}8%N#W_ z#mA2-EQ=F7WOo;m{a^=KJomIcw{EGSL6KSB|#mGiLPcz^Ws<(9>Gj)D<( z6AIx;3(2W~ECjiRzqWptLgFG+f+Y!z3dmv(xA~(d%&4E~x!rC4gbjt*msWcA`f`RZ zuiS#Bpcs2QmWG7ww4f;{`{&Ag!Z<9#PaQRd;y|a{;VaHMEEW#qzy{7k!o09psVmS0 z#~E%%ybyjPvc-GX>6P-^7tMPOWG0xSQ`DG6IJ=TF^IkK zebuqfz6~juXpP&;K4O{M;s!L+IeHA{ilnV%$BZs!tT16#kFtpz^>4tCLB!}{7NUQu zzeYdFJFw_|e?yowXBjWO2J`Gi7*9O|3G|{y7c;TZ0A-9DWyl!S!re6Lr#7O#IzU&Z$6~?&TZO(pl z|4grfF<3Y1ue6XMnG0k54z)b5HBe0)E;l8qV8lhr)iehFZtNipoFP)Jgi;*(I z!qB{C``y+XC^rsY&x&)2Bn{Gq1^5Zc6_jso>xoEmS7Bj9hg+{ppp9bDhIbp* zQfr=~0tzE6K#V%>$2nJdZ4^jSn8FDQBiaZ)v_(TYug95<>|r4tf3K386!JPnlN6@V z!p0%mXK_a+Zt`Pr8xnfWrwZIK!P{AN__U$t@4DI(dqaA!ABauSp0ufW?LZ;^2kXx0 UtW~-TR{#J207*qoM6N<$f~-fTk^lez literal 0 HcmV?d00001 diff --git a/ReaderHive/Source/Assets.xcassets/Image/login_logo_icon.imageset/Contents.json b/ReaderHive/Source/Assets.xcassets/Image/login_logo_icon.imageset/Contents.json new file mode 100644 index 0000000..4ebe70e --- /dev/null +++ b/ReaderHive/Source/Assets.xcassets/Image/login_logo_icon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "文字LOGO(ReaderHive)@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "文字LOGO(ReaderHive)@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ReaderHive/Source/Assets.xcassets/Image/login_logo_icon.imageset/文字LOGO(ReaderHive)@2x.png b/ReaderHive/Source/Assets.xcassets/Image/login_logo_icon.imageset/文字LOGO(ReaderHive)@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ebfd8e72ba4ce85410d1e1f22d9dc22a91cf64 GIT binary patch literal 15921 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 Q?h7U + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + fb1155849519865831 + + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + readerhiveapp + + + + FacebookAppID + 1155849519865831 + FacebookClientToken + 696d03750f4bc7a888c815b071be555d + FacebookDisplayName + $(PRODUCT_NAME) UIApplicationSceneManifest UIApplicationSupportsMultipleScenes diff --git a/ReaderHive/Source/en.lproj/Localizable.strings b/ReaderHive/Source/en.lproj/Localizable.strings index 4a0dc6c..024d87d 100644 --- a/ReaderHive/Source/en.lproj/Localizable.strings +++ b/ReaderHive/Source/en.lproj/Localizable.strings @@ -129,6 +129,8 @@ "Balance" = "Balance"; "Daily Coins" = "Daily Coins"; "Buy Now" = "Buy Now"; +"Login with Apple" = "Login with Apple"; +"Login with Facebook" = "Login with Facebook"; "retain_alert_text" = "Unlock every show you love!";