diff --git a/Podfile b/Podfile index 2b8ac15..7dd17c9 100644 --- a/Podfile +++ b/Podfile @@ -21,21 +21,21 @@ target 'Thimra' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! - pod 'Moya' #网络框架 - pod 'SnapKit' #布局 - pod 'SmartCodable' #数据解析 - pod 'YYKit' #工具类 - pod 'MJRefresh' #刷新控件 - pod 'Toast' #吐司提示 - pod 'ZFPlayer/AVPlayer' #播放器 - pod 'KTVHTTPCache' #视频缓存 - pod 'HWPanModal' #底部弹出控制器 - pod 'Kingfisher' #图片加载 - pod 'EmptyStateKit' #空数据页面 - pod 'ReachabilitySwift' #网络状态监控 - pod 'WMZPageController' #分页控制器 - pod 'SVProgressHUD' #HUD - + pod 'Moya' #网络框架 + pod 'SnapKit' #布局 + pod 'SmartCodable' #数据解析 + pod 'YYKit' #工具类 + pod 'MJRefresh' #刷新控件 + pod 'Toast' #吐司提示 + pod 'ZFPlayer/AVPlayer' #播放器 + pod 'KTVHTTPCache' #视频缓存 + pod 'HWPanModal' #底部弹出控制器 + pod 'Kingfisher' #图片加载 + pod 'EmptyStateKit' #空数据页面 + pod 'ReachabilitySwift' #网络状态监控 + pod 'WMZPageController' #分页控制器 + pod 'SVProgressHUD' #HUD + pod 'TZImagePickerController' #相册 end diff --git a/Podfile.lock b/Podfile.lock index e6ab7a9..13d5574 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -18,6 +18,11 @@ PODS: - SVProgressHUD/Core (= 2.3.1) - SVProgressHUD/Core (2.3.1) - Toast (4.1.1) + - TZImagePickerController (3.8.8): + - TZImagePickerController/Basic (= 3.8.8) + - TZImagePickerController/Location (= 3.8.8) + - TZImagePickerController/Basic (3.8.8) + - TZImagePickerController/Location (3.8.8) - WMZPageController (1.5.5) - YYKit (1.0.9): - YYKit/no-arc (= 1.0.9) @@ -38,6 +43,7 @@ DEPENDENCIES: - SnapKit - SVProgressHUD - Toast + - TZImagePickerController - WMZPageController - YYKit - ZFPlayer/AVPlayer @@ -57,6 +63,7 @@ SPEC REPOS: - SnapKit - SVProgressHUD - Toast + - TZImagePickerController - WMZPageController - YYKit - ZFPlayer @@ -75,10 +82,11 @@ SPEC CHECKSUMS: SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a SVProgressHUD: 4837c74bdfe2e51e8821c397825996a8d7de6e22 Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e + TZImagePickerController: d084a7b97c82d387e7669dd86dc9a9057500aacf WMZPageController: 87dd82d1e3528cd362de19b9a74fd6890d6e1906 YYKit: 7cda43304a8dc3696c449041e2cb3107b4e236e7 ZFPlayer: 5cf39e8d9f0c2394a014b0db4767b5b5a6bffe13 -PODFILE CHECKSUM: a2c39b60a617ef47e0a8a03d4115500405588542 +PODFILE CHECKSUM: 5a3089e2bc6a1255307675b5887c43caad0168a6 COCOAPODS: 1.16.2 diff --git a/Thimra.xcodeproj/project.pbxproj b/Thimra.xcodeproj/project.pbxproj index f59e295..23220ff 100644 --- a/Thimra.xcodeproj/project.pbxproj +++ b/Thimra.xcodeproj/project.pbxproj @@ -231,6 +231,8 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = Thimra/Source/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Thimra; + 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 = ""; @@ -273,6 +275,8 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = Thimra/Source/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Thimra; + 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 = ""; diff --git a/Thimra/Base/Networking/Base/SPURLPath.swift b/Thimra/Base/Networking/Base/SPURLPath.swift index 57d5124..59645a4 100644 --- a/Thimra/Base/Networking/Base/SPURLPath.swift +++ b/Thimra/Base/Networking/Base/SPURLPath.swift @@ -45,6 +45,9 @@ let SPCivizatioConventionWebUrl = SPWebBaseURL + "/civizatio_convention" ///反馈首页 let SPFeedBackHomeWebUrl = SPCampaignWebURL + "/pages/leave/index" - +///反馈列表 +let SPFeedBackListWebUrl = SPCampaignWebURL + "/pages/leave/list" +///反馈详情 +let SPFeedBackDetailWebUrl = SPCampaignWebURL + "/pages/leave/detail" diff --git a/Thimra/Base/WebView/SPCampaignWebViewController.swift b/Thimra/Base/WebView/SPCampaignWebViewController.swift new file mode 100644 index 0000000..40999f8 --- /dev/null +++ b/Thimra/Base/WebView/SPCampaignWebViewController.swift @@ -0,0 +1,55 @@ +// +// SPCampaignWebViewController.swift +// Thimra +// +// Created by 佳尔 on 2025/4/25. +// + +import UIKit + +class SPCampaignWebViewController: SPWebViewController { + + var id: String? + + override func viewDidLoad() { + super.viewDidLoad() + + } + + + override func webViewDidFinishLoad(_ webView: SPWebView) { + super.webViewDidFinishLoad(webView) + receiveDataFromNative() + } + +} + +extension SPCampaignWebViewController { + ///设置登录信息 + func receiveDataFromNative() { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in + guard let self = self else { return } + var dic = [ + "token" : SPLoginManager.manager.token?.token ?? "", + "time_zone" : String.timeZone(), + "lang" : SPLocalizedManager.shared.currentLocalizedKey, + "type" : "ios", + "theme" : "theme_1", + ] + if let id = id { + dic["id"] = id + } + + + if let json = dic.toJsonString() { + let js = "receiveDataFromNative(\(json))" + self.webView.evaluateJavaScript(js) { _, error in + + } + } + } + + } + +} + diff --git a/Thimra/Base/WebView/SPWebView.swift b/Thimra/Base/WebView/SPWebView.swift index 86c8c36..4e17d28 100644 --- a/Thimra/Base/WebView/SPWebView.swift +++ b/Thimra/Base/WebView/SPWebView.swift @@ -14,6 +14,9 @@ class SPWebView: WKWebView { private(set) var scriptMessageHandlerArray: [SPWebViewMessageName] = [ WebMessageAPP, + WebMessageOpenFeedbackList, + WebMessageOpenFeedbackDetail, + WebMessageOpenPhotoPicker, ] diff --git a/Thimra/Base/WebView/SPWebViewController+ScriptMessage.swift b/Thimra/Base/WebView/SPWebViewController+ScriptMessage.swift index ab5ede8..0de6e1d 100644 --- a/Thimra/Base/WebView/SPWebViewController+ScriptMessage.swift +++ b/Thimra/Base/WebView/SPWebViewController+ScriptMessage.swift @@ -12,6 +12,12 @@ typealias SPWebViewMessageName = String ///APP交互 let WebMessageAPP: SPWebViewMessageName = "js2app" +///打开反馈列表 +let WebMessageOpenFeedbackList: SPWebViewMessageName = "openFeedbackList" +///打开反馈详情 +let WebMessageOpenFeedbackDetail: SPWebViewMessageName = "openFeedbackDetail" +///打开相册 +let WebMessageOpenPhotoPicker: SPWebViewMessageName = "openPhotoPicker" extension SPWebViewController { @@ -20,9 +26,42 @@ extension SPWebViewController { let name = message.name let body = message.body + spLog(message: body) + + if name == WebMessageOpenFeedbackList { + let vc = SPCampaignWebViewController() + vc.urlStr = SPFeedBackListWebUrl + self.navigationController?.pushViewController(vc, animated: true) + + } else if name == WebMessageOpenFeedbackDetail { + guard let body = message.body as? [String : Any] else { return } + guard let id = body["id"] as? Int else { return } + + let vc = SPCampaignWebViewController() + vc.id = "\(id)" + vc.urlStr = SPFeedBackDetailWebUrl + self.navigationController?.pushViewController(vc, animated: true) + + } else if name == WebMessageOpenPhotoPicker { + let vc = SPImagePickerManager.createImagePicker(delegate: self) + self.present(vc, animated: true) + } -// let js = "window.returnGPSposition('{\"longitude\":\(placemark.longitude ?? 0),\"latitude\":\(placemark.latitude ?? 0)}')" -// self.webView.evaluateJavaScript(js, completionHandler: nil) } } + +//MARK: -------------- TZImagePickerControllerDelegate -------------- +extension SPWebViewController: TZImagePickerControllerDelegate { + + func imagePickerController(_ picker: TZImagePickerController!, didFinishPickingPhotos photos: [UIImage]!, sourceAssets assets: [Any]!, isSelectOriginalPhoto: Bool) { + guard let image = photos.first 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) + + } + +} diff --git a/Thimra/Base/WebView/SPWebViewController.swift b/Thimra/Base/WebView/SPWebViewController.swift index ad397a4..34d212c 100644 --- a/Thimra/Base/WebView/SPWebViewController.swift +++ b/Thimra/Base/WebView/SPWebViewController.swift @@ -12,7 +12,7 @@ class SPWebViewController: SPViewController { var urlStr: String? - private lazy var webView: SPWebView = { + private(set) lazy var webView: SPWebView = { let controller = WKUserContentController() let config = WKWebViewConfiguration() @@ -79,9 +79,6 @@ extension SPWebViewController: SPWebViewDelegate { func webViewDidFinishLoad(_ webView: SPWebView) { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in - self?.receiveDataFromNative() - } } @@ -90,24 +87,3 @@ extension SPWebViewController: SPWebViewDelegate { } } -extension SPWebViewController { - - func receiveDataFromNative() { - let dic = [ - "token" : SPLoginManager.manager.token?.token ?? "", - "time_zone" : String.timeZone(), - "lang" : SPLocalizedManager.shared.currentLocalizedKey, - "type" : "ios", - "theme" : "theme_1", - ] - - if let json = dic.toJsonString() { - let js = "receiveDataFromNative(\(json))" - self.webView.evaluateJavaScript(js) { _, error in - - } - } - - } - -} diff --git a/Thimra/Class/Mine/Controller/SPFeedbackViewController.swift b/Thimra/Class/Mine/Controller/SPFeedbackViewController.swift new file mode 100644 index 0000000..decfa75 --- /dev/null +++ b/Thimra/Class/Mine/Controller/SPFeedbackViewController.swift @@ -0,0 +1,28 @@ +// +// SPFeedbackViewController.swift +// Thimra +// +// Created by 佳尔 on 2025/4/25. +// + +import UIKit + +class SPFeedbackViewController: SPCampaignWebViewController { + + + + override func viewDidLoad() { + self.urlStr = SPFeedBackHomeWebUrl + super.viewDidLoad() + self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named: "feed_back_icon_02"), style: .plain, target: self, action: #selector(handleRightButton)) + + } + + + @objc private func handleRightButton() { + let vc = SPCampaignWebViewController() + vc.urlStr = SPFeedBackListWebUrl + self.navigationController?.pushViewController(vc, animated: true) + } + +} diff --git a/Thimra/Class/Mine/Controller/SPMineViewController.swift b/Thimra/Class/Mine/Controller/SPMineViewController.swift index 400c32c..4d4a088 100644 --- a/Thimra/Class/Mine/Controller/SPMineViewController.swift +++ b/Thimra/Class/Mine/Controller/SPMineViewController.swift @@ -118,8 +118,7 @@ extension SPMineViewController: UITableViewDelegate, UITableViewDataSource { self.navigationController?.pushViewController(vc, animated: true) case .feedBack: - let vc = SPWebViewController() - vc.urlStr = SPFeedBackHomeWebUrl + let vc = SPFeedbackViewController() self.navigationController?.pushViewController(vc, animated: true) default: diff --git a/Thimra/Libs/ImagePickerManager/SPImagePickerManager.swift b/Thimra/Libs/ImagePickerManager/SPImagePickerManager.swift new file mode 100644 index 0000000..0dd1bf0 --- /dev/null +++ b/Thimra/Libs/ImagePickerManager/SPImagePickerManager.swift @@ -0,0 +1,36 @@ +// +// SPImagePickerManager.swift +// Thimra +// +// Created by 佳尔 on 2025/4/25. +// + +import UIKit + +class SPImagePickerManager: NSObject { + static func createImagePicker(maxImagesCount: Int = 1, + allowCrop: Bool = false, + delegate: TZImagePickerControllerDelegate) -> TZImagePickerController { + + let imagePickerVc = TZImagePickerController(maxImagesCount: 1, columnNumber: 4, delegate: delegate, pushPhotoPickerVc: true) + imagePickerVc?.photoWidth = 375 + imagePickerVc?.photoPreviewMaxWidth = 500 + imagePickerVc?.allowTakeVideo = false + imagePickerVc?.allowPickingVideo = false + imagePickerVc?.allowPickingImage = true + ///相机按钮 + imagePickerVc?.allowTakePicture = true + + ///原图按钮 + imagePickerVc?.allowPickingOriginalPhoto = false + imagePickerVc?.maxImagesCount = maxImagesCount + imagePickerVc?.allowCrop = allowCrop +// allowsEditing + imagePickerVc?.scaleAspectFillCrop = true + imagePickerVc?.cropRect = CGRect(x: 0, y: (kSPScreenHeight - kSPScreenWidth) / 2 , width: kSPScreenWidth, height: kSPScreenWidth) + + imagePickerVc?.modalPresentationStyle = .fullScreen + + return imagePickerVc! + } +} diff --git a/Thimra/Source/Assets.xcassets/icon/feed_back_icon_02.imageset/Contents.json b/Thimra/Source/Assets.xcassets/icon/feed_back_icon_02.imageset/Contents.json new file mode 100644 index 0000000..7445735 --- /dev/null +++ b/Thimra/Source/Assets.xcassets/icon/feed_back_icon_02.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Vector@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Vector@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/Thimra/Source/Assets.xcassets/icon/feed_back_icon_02.imageset/Vector@2x.png b/Thimra/Source/Assets.xcassets/icon/feed_back_icon_02.imageset/Vector@2x.png new file mode 100644 index 0000000..32f77e4 Binary files /dev/null and b/Thimra/Source/Assets.xcassets/icon/feed_back_icon_02.imageset/Vector@2x.png differ diff --git a/Thimra/Source/Assets.xcassets/icon/feed_back_icon_02.imageset/Vector@3x.png b/Thimra/Source/Assets.xcassets/icon/feed_back_icon_02.imageset/Vector@3x.png new file mode 100644 index 0000000..01eb044 Binary files /dev/null and b/Thimra/Source/Assets.xcassets/icon/feed_back_icon_02.imageset/Vector@3x.png differ diff --git a/Thimra/Source/Thimra-Bridging-Header.h b/Thimra/Source/Thimra-Bridging-Header.h index 2cf3878..173331c 100644 --- a/Thimra/Source/Thimra-Bridging-Header.h +++ b/Thimra/Source/Thimra-Bridging-Header.h @@ -16,3 +16,4 @@ #import #import "WMPageController.h" #import +#import