Commit e6c0d9f1 authored by Alex朱枝文's avatar Alex朱枝文

腾讯IM消息处理逻辑剥离成类

parent c2dff21e
......@@ -1180,6 +1180,7 @@
047A96902D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047A968B2D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift */; };
047A96932D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047A96922D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift */; };
0487C1C72E8940D000CE6472 /* YHCustomSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0487C1C62E8940D000CE6472 /* YHCustomSearchView.swift */; };
0487C1D82E8B78B600CE6472 /* YHTXIMMessageHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0487C1D72E8B78B600CE6472 /* YHTXIMMessageHandler.swift */; };
048D6ADB2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADA2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift */; };
048D6ADD2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADC2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift */; };
048D6ADF2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADE2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift */; };
......@@ -2550,6 +2551,7 @@
047A968B2D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHGCIncomeRecordWorkExperienceViewController.swift; sourceTree = "<group>"; };
047A96922D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHInfoQuestionSelectionCell.swift; sourceTree = "<group>"; };
0487C1C62E8940D000CE6472 /* YHCustomSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHCustomSearchView.swift; sourceTree = "<group>"; };
0487C1D72E8B78B600CE6472 /* YHTXIMMessageHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHTXIMMessageHandler.swift; sourceTree = "<group>"; };
048D6ADA2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterViewController.swift; sourceTree = "<group>"; };
048D6ADC2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterHeaderView.swift; sourceTree = "<group>"; };
048D6ADE2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterHeaderBannerCell.swift; sourceTree = "<group>"; };
......@@ -3185,6 +3187,7 @@
045C0A612D12CA5E00BD2DC0 /* VM */,
045C0A622D12CA5E00BD2DC0 /* YHButlerMessageReportHandler.swift */,
045C0A632D12CA5E00BD2DC0 /* YHButlerServiceManager.swift */,
0487C1D72E8B78B600CE6472 /* YHTXIMMessageHandler.swift */,
045C0A642D12CA5E00BD2DC0 /* YHButlerServiceMessageHandler.swift */,
043F0EB02DE85717003354EB /* YHTencentDeskManager.swift */,
043F0EB12DE85717003354EB /* YHTUIMessageListManager.swift */,
......@@ -8516,6 +8519,7 @@
045C12A42D12CA5F00BD2DC0 /* YHEducationInfoCell.swift in Sources */,
045C12A52D12CA5F00BD2DC0 /* YHTravelHKDLGuideSheetView.swift in Sources */,
045C12A62D12CA5F00BD2DC0 /* YHTravelDocsPreparationTipsCell.swift in Sources */,
0487C1D82E8B78B600CE6472 /* YHTXIMMessageHandler.swift in Sources */,
04AFEF592D6C8CE00007A011 /* YHVipLevelRightHeaderView.swift in Sources */,
045C12A72D12CA5F00BD2DC0 /* YHMainInfoPreviewModel.swift in Sources */,
045C12A82D12CA5F00BD2DC0 /* YHActivityTravelitemView.swift in Sources */,
......
// YHIMMessageHandler.swift
import UIKit
import SafariServices
import TUIConversation
import TUIChat
import IQKeyboardManagerSwift
class YHIMMessageHandler: NSObject {
weak var viewController: UIViewController?
weak var navigationController: UINavigationController?
private lazy var previewFileTool: YHFilePreviewTool = {
guard let vc = viewController else { fatalError("ViewController不能为空") }
return YHFilePreviewTool(targetVC: vc)
}()
init(viewController: UIViewController,
navigationController: UINavigationController?) {
self.viewController = viewController
self.navigationController = navigationController
super.init()
}
}
// MARK: - TUIYHCustomCellClickDelegate
extension YHIMMessageHandler: TUIYHCustomCellClickDelegate {
func didTap(inFileCell cellData: TUIFileMessageCellData) {
var isExist: ObjCBool = false
let path = cellData.getFilePath(&isExist)
if isExist.boolValue {
let url = URL(fileURLWithPath: path)
previewFileTool.openXLSXFile(at: url, fileName: cellData.fileName)
} else {
cellData.downloadFile()
}
}
func didTapCustomOrderCell(_ cellData: TUIOrderCellData) {
let linkAddress = cellData.link ?? ""
// 处理普通URL
if linkAddress.count > 0,
linkAddress.isValidHttpUrl || linkAddress.isValidHttpsUrl || linkAddress.isValidFileUrl,
let url = URL(string: linkAddress) {
showSafari(url: url)
return
}
// 处理自定义消息
handleCustomMessage(linkAddress)
}
private func handleCustomMessage(_ content: String?) {
guard let dicData = content,
!dicData.isEmpty,
let data = dicData.data(using: .utf8),
let jsonObject = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
!jsonObject.isEmpty else {
printLog("消息解析失败")
return
}
let msgType = jsonObject["msg_type"] as? String ?? ""
let navH5Url = jsonObject["nav_h5_url"] as? String ?? ""
let orderID = jsonObject["order_id"] as? Int ?? -1
let type = jsonObject["type"] as? Int ?? -1
let batchId = jsonObject["batch_id"] as? Int ?? 0
if msgType == "card_msg", navH5Url.count > 0 {
let title = jsonObject["title"] as? String ?? ""
showH5Page(baseUrl: navH5Url, title: title)
} else if orderID > -1, type > -1 {
showOrderMessage(type: type, orderId: orderID, batchId: batchId)
}
}
}
// MARK: - 公开方法
extension YHIMMessageHandler {
/// 处理IM消息点击
/// - Parameter conversationData: 会话数据
@MainActor func handleIMMessageTap(conversationData: TUIConversationCellData) {
updateNavigateBarBeforeEnterChatVC()
let params: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: conversationData.title,
TUICore_TUIChatObjectFactory_ChatViewController_UserID: conversationData.userID,
TUICore_TUIChatObjectFactory_ChatViewController_GroupID: conversationData.groupID,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarImage: conversationData.avatarImage,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: conversationData.faceUrl,
TUICore_TUIChatObjectFactory_ChatViewController_ConversationID: conversationData.conversationID,
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: conversationData.atTipsStr,
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: conversationData.atMsgSeqs,
TUICore_TUIChatObjectFactory_ChatViewController_Draft: conversationData.draftText
]
pushToChatViewController(with: params)
}
/// 处理远程通知
/// - Parameter userInfo: 通知数据
@MainActor func handleRemoteNotification(_ userInfo: [AnyHashable: Any]) {
let extString = userInfo["ext"] as? String ?? "{}"
let extData = extString.data(using: .utf8) ?? Data()
let ext = (try? JSONSerialization.jsonObject(with: extData, options: [])) as? [String: Any] ?? [:]
let entity = ext["entity"] as? [String: Any] ?? [:]
let chatType = entity["chatType"] as? Int ?? 0
let senderID = entity["sender"] as? String ?? ""
let nickName = entity["nickname"] as? String ?? ""
let aps = userInfo["aps"] as? [String: Any] ?? [:]
let alert = aps["alert"] as? [String: Any] ?? [:]
let title = alert["title"] as? String ?? nickName
guard senderID.count > 0 else { return }
updateNavigateBarBeforeEnterChatVC()
var param: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: title,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: "",
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: "",
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: [],
TUICore_TUIChatObjectFactory_ChatViewController_Draft: ""
]
if chatType == 2 { // 群聊
param[TUICore_TUIChatObjectFactory_ChatViewController_GroupID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "group_\(senderID)"
} else { // 单聊
param[TUICore_TUIChatObjectFactory_ChatViewController_UserID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "c2c_\(senderID)"
}
pushToChatViewController(with: param)
}
@MainActor func gotoChatVC(senderID: String, isGroupChat: Bool = false) {
guard senderID.count > 0 else { return }
updateNavigateBarBeforeEnterChatVC()
var param: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: "",
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: "",
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: "",
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: [],
TUICore_TUIChatObjectFactory_ChatViewController_Draft: ""
]
if isGroupChat { // 群聊
param[TUICore_TUIChatObjectFactory_ChatViewController_GroupID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "group_\(senderID)"
} else { // 单聊
param[TUICore_TUIChatObjectFactory_ChatViewController_UserID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "c2c_\(senderID)"
}
pushToChatViewController(with: param)
}
}
// MARK: - 私有方法
extension YHIMMessageHandler {
/// 跳转到聊天页面(统一方法)
private func pushToChatViewController(with params: [String: Any]) {
let vc = navigationController?.push(
TUICore_TUIChatObjectFactory_ChatViewController_Classic,
param: params,
forResult: nil
)
if let chatVC = vc as? TUIBaseChatViewController {
chatVC.navigationItem.rightBarButtonItem = nil
chatVC.navigationItem.rightBarButtonItems = nil
chatVC.yhCustomCellClickDelegate = self
}
}
/// 更新导航栏配置
@MainActor private func updateNavigateBarBeforeEnterChatVC() {
IQKeyboardManager.shared.isEnabled = false
navigationController?.gk_hideNavigationBar = false
navigationController?.isNavigationBarHidden = false
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .white
appearance.shadowImage = UIImage()
appearance.shadowColor = .clear
navigationController?.navigationBar.tintColor = .black
navigationController?.navigationBar.standardAppearance = appearance
navigationController?.navigationBar.scrollEdgeAppearance = appearance
}
/// 显示Safari浏览器
private func showSafari(url: URL) {
let safariVC = SFSafariViewController(url: url)
safariVC.dismissButtonStyle = .close
safariVC.modalPresentationStyle = .fullScreen
viewController?.present(safariVC, animated: true)
}
/// 显示H5页面(带Token)
private func showH5Page(baseUrl: String, title: String) {
var finalUrl = baseUrl
if YHLoginManager.shared.isLogin() {
let token = YHLoginManager.shared.h5Token
let separator = baseUrl.contains("?") ? "&" : "?"
finalUrl = baseUrl + separator + "param=" + token
}
let webVC = YHH5WebViewVC()
webVC.isFullScreenFlag = false
webVC.navTitle = title
webVC.url = finalUrl
navigationController?.pushViewController(webVC)
}
/// 显示订单消息页面
private func showOrderMessage(type: Int, orderId: Int, batchId: Int) {
YHServiceOrderListViewController.jumpToMessageController(
type: type,
orderId: orderId,
batchId
)
}
}
......@@ -20,6 +20,14 @@ class YHResourceViewController: YHBaseViewController {
return viewModel
}()
// 消息处理器
private lazy var messageHandler: YHIMMessageHandler = {
return YHIMMessageHandler(
viewController: self,
navigationController: navigationController
)
}()
// 筛选条件
var selectedCategories: [YHResourceCategory] = []
......@@ -464,8 +472,11 @@ private extension YHResourceViewController {
return
}
YHGrayCommonAlertView.show("需联系银河管家进行发布信息", "联系银河管家发布企业服务与企业需求,快来与我们联系吧~", "返回", "前往联系", fullGuestureEnable: false) {
//
YHGrayCommonAlertView.show("需联系银河管家进行发布信息", "联系银河管家发布企业服务与企业需求,快来与我们联系吧~", "返回", "前往联系", fullGuestureEnable: false) { [weak self] in
guard let self = self else {
return
}
self.messageHandler.gotoChatVC(senderID: "")
} callBack: {
//
}
......
......@@ -28,10 +28,13 @@ class YHMessageListVC: YHBaseViewController {
private let serviceCenterViewModel = YHServiceCenterViewModel()
var isNotifyEnabled = false
private lazy var previewFileTool: YHFilePreviewTool = {
let tool = YHFilePreviewTool(targetVC: self)
return tool
// 消息处理器
private lazy var messageHandler: YHIMMessageHandler = {
return YHIMMessageHandler(
viewController: self,
navigationController: navigationController
)
}()
lazy var tableView: UITableView = {
......@@ -465,46 +468,7 @@ extension YHMessageListVC {
}
func handleRemoteNotification(_ userInfo: [AnyHashable: Any]) {
let extString = userInfo["ext"] as? String ?? "{}"
let extData = extString.data(using: .utf8) ?? Data()
let ext = (try? JSONSerialization.jsonObject(with: extData, options: [])) as? [String: Any] ?? [:]
let entity = ext["entity"] as? [String: Any] ?? [:]
let chatType = entity["chatType"] as? Int ?? 0 // 1: 单聊, 2: 群聊
let senderID = entity["sender"] as? String ?? ""
let nickName = entity["nickname"] as? String ?? ""
let aps = userInfo["aps"] as? [String: Any] ?? [:]
let alert = aps["alert"] as? [String: Any] ?? [:]
let title = alert["title"] as? String ?? nickName // 备用昵称
guard senderID.count > 0 else {
return
}
updateNavigateBarBeforeEnterChatVC()
var param: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: title,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: "", // 通知无头像 URL
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: "",
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: [],
TUICore_TUIChatObjectFactory_ChatViewController_Draft: ""
]
// 5. 区分单聊/群聊
if chatType == 2 { // 群聊
param[TUICore_TUIChatObjectFactory_ChatViewController_GroupID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "group_\(senderID)"
} else { // 单聊
param[TUICore_TUIChatObjectFactory_ChatViewController_UserID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "c2c_\(senderID)"
}
// 3. 跳转
let vc = navigationController?.push(TUICore_TUIChatObjectFactory_ChatViewController_Classic, param: param, forResult: nil)
if let vc = vc as? TUIBaseChatViewController {
vc.navigationItem.rightBarButtonItem = nil
vc.navigationItem.rightBarButtonItems = nil
vc.yhCustomCellClickDelegate = self
}
messageHandler.handleRemoteNotification(userInfo)
}
private func updateNavigateBarBeforeEnterChatVC() {
......@@ -566,29 +530,12 @@ extension YHMessageListVC: UITableViewDelegate, UITableViewDataSource {
}
return
} else if msgItem.type == YHMessageType.txIM.rawValue {
let item = msgArr[indexPath.row]
guard let data = messageListManager.getMessageList().first(where: { $0.conversationID == item.conversationID }) else {
guard let data = messageListManager.getMessageList()
.first(where: { $0.conversationID == msgItem.conversationID }) else {
return
}
updateNavigateBarBeforeEnterChatVC()
let param: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: data.title,
TUICore_TUIChatObjectFactory_ChatViewController_UserID: data.userID,
TUICore_TUIChatObjectFactory_ChatViewController_GroupID: data.groupID,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarImage: data.avatarImage,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: data.faceUrl,
TUICore_TUIChatObjectFactory_ChatViewController_ConversationID: data.conversationID,
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: data.atTipsStr,
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: data.atMsgSeqs,
TUICore_TUIChatObjectFactory_ChatViewController_Draft: data.draftText
]
let vc = navigationController?.push(TUICore_TUIChatObjectFactory_ChatViewController_Classic, param: param, forResult: nil)
if let vc = vc as? TUIBaseChatViewController {
vc.navigationItem.rightBarButtonItem = nil
vc.navigationItem.rightBarButtonItems = nil
vc.yhCustomCellClickDelegate = self
}
messageHandler.handleIMMessageTap(conversationData: data)
return
}
......@@ -721,78 +668,4 @@ extension YHMessageListVC: YHMessageListDelegate {
return nil
}
}
extension YHMessageListVC: TUIYHCustomCellClickDelegate {
func didTap(inFileCell cellData: TUIFileMessageCellData) {
var isExist: ObjCBool = false
let path = cellData.getFilePath(&isExist)
if isExist.boolValue {
let url = URL(fileURLWithPath: path)
previewFileTool.openXLSXFile(at: url, fileName: cellData.fileName)
} else {
cellData.downloadFile()
}
}
func didTapCustomOrderCell(_ cellData: TUIOrderCellData) {
let linkAddress = cellData.link ?? ""
guard linkAddress.count > 0, linkAddress.isValidHttpUrl || linkAddress.isValidHttpsUrl || linkAddress.isValidFileUrl, let url = URL(string: linkAddress) else {
handelMessageType(linkAddress)
return
}
let safariViewController = SFSafariViewController(url: url)
safariViewController.dismissButtonStyle = .close
safariViewController.modalPresentationStyle = .fullScreen
UIViewController.current?.present(safariViewController, animated: true, completion: nil)
}
private func handelMessageType(_ content: String?) {
if let dicData = content, dicData.count > 0, let data = dicData.data(using: .utf8) {
do {
if let jsonObject = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
// 转换成功,jsonObject 是一个字典
printLog("JSON字符串转换为字典成功: \(jsonObject)")
/*
"{\"order_id\":151824,\"type\":27}"
*/
if !jsonObject.isEmpty {
let msgType: String = jsonObject["msg_type"] as? String ?? ""
let navH5Url: String = jsonObject["nav_h5_url"] as? String ?? ""
let orderID: Int = jsonObject["order_id"] as? Int ?? -1
let type: Int = jsonObject["type"] as? Int ?? -1
let batchId: Int = jsonObject["batch_id"] as? Int ?? 0
if msgType == "card_msg", navH5Url.count > 0 {
let title = jsonObject["title"] as? String ?? ""
var url = ""
if YHLoginManager.shared.isLogin() {
let token = YHLoginManager.shared.h5Token
if navH5Url.contains("?") {
url = navH5Url + "&param=" + token
} else {
url = navH5Url + "?param=" + token
}
} else {
url = navH5Url
}
let vc = YHH5WebViewVC()
vc.isFullScreenFlag = false
vc.navTitle = title
vc.url = url
UIViewController.current?.navigationController?.pushViewController(vc)
} else if orderID > -1, type > -1 {
YHServiceOrderListViewController.jumpToMessageController(type: type, orderId: orderID, batchId)
}
} else {
printLog("ddddd")
}
} else {
printLog("JSON字符串不是有效的字典格式")
}
} catch {
printLog("JSON解析错误: \(error)")
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment