Commit 36383ed2 authored by Alex朱枝文's avatar Alex朱枝文

七鱼SDK引入

parent f003b1b5
......@@ -103,6 +103,8 @@ target 'galaxy' do
pod 'DragCardContainer', '1.2.0'
#列表截图
pod 'TYSnapshotScroll', '0.4.0'
#七鱼SDK
pod 'QY_iOS_SDK', '9.7.0'
end
......
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1520"
LastUpgradeVersion = "1540"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1520"
LastUpgradeVersion = "1540"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1520"
LastUpgradeVersion = "1540"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
......
......@@ -66,8 +66,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate {
YHOneKeyLoginManager.shared.configOneKeyLogin()
YHOSSManager.share.getOSSID()
//for test hjl
AGCInstance.startUp()
AGCAppLinking.instance().handle { (link, error) in
......@@ -76,6 +74,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate {
print(deepLink as Any)
}
// QiYu SDK初始化
YHButlerServiceManager.shared.setupSDK()
//设置主窗口
setupRootVC()
return true
......
......@@ -49,6 +49,7 @@ extension AppDelegate: JPUSHRegisterDelegate {
print("deviceToken:\(deviceTokenStr)")
JPUSHService.registerDeviceToken(deviceToken)
YHLoginManager.shared.deviceTokenModel.deviceToken = deviceTokenStr
YHButlerServiceManager.shared.updateApnsToken(token: deviceToken)
}
//获取token 失败
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { //可选
......
//
// YHButlerServiceMessage.swift
// galaxy
//
// Created by alexzzw on 2024/9/5.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
// Mark: - 管家消息简单模型
class YHButlerServiceMessage: NSObject {
var id: String = ""
var content: String = ""
var isRead: Bool = true
}
// Mark: - 用于首页显示与否
class YHButlerServiceHomeInfoMessage: YHButlerServiceMessage {
var showButler: Bool = false
}
//
// YHButlerServiceViewModel.swift
// galaxy
//
// Created by alexzzw on 2024/9/5.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import Foundation
class YHButlerServiceViewModel {
//获取透传个人信息
func getUserInfomation(_ id: String, callBackBlock:@escaping (_ dataString: String?, _ error:YHErrorModel?)->()) {
let params: [String : Any] = ["yh_id": id]
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.QiYu.userInfomation
let _ = YHNetRequest.getRequest(url: strUrl, params: params) { json, code in
let dic = json.data
guard let data = json.data, let jsonData = try? JSONSerialization.data(withJSONObject: data, options: []), let dataString = jsonData.string(encoding: .utf8) else {
callBackBlock(nil, YHErrorModel())
return
}
callBackBlock(dataString, nil)
} failBlock: { err in
callBackBlock(nil, err)
}
}
}
//
// YHButlerServiceManager.swift
// galaxy
//
// Created by alexzzw on 2024/9/4.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import IQKeyboardManagerSwift
class YHButlerServiceManager: NSObject {
static let shared = YHButlerServiceManager()
private weak var conversationManager = QYSDK.shared().conversationManager()
private lazy var getUserInfoViewModel: YHButlerServiceViewModel = YHButlerServiceViewModel()
private override init() {
super.init()
conversationManager?.setDelegate(self)
NotificationCenter.default.addObserver(self, selector: #selector(loginSuccess), name: YhConstant.YhNotification.didLoginSuccessNotifiction, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(logoutSuccess), name: YhConstant.YhNotification.didLogoutSuccessNotifiction, object: nil)
}
func setupSDK() {
let qyOption = QYSDKOption(appKey: YhConstant.QiYuSDK.appKey)
qyOption.appName = YhConstant.QiYuSDK.appName
QYSDK.shared().register(with: qyOption)
}
func updateUserInfo(userId: String, userData: String, completion: @escaping (Bool) -> Void) {
let userInfo = QYUserInfo()
userInfo.userId = userId
userInfo.data = userData
QYSDK.shared().setUserInfo(userInfo) { success, error in
completion(success)
}
}
func updateApnsToken(token: Data) {
QYSDK.shared().updateApnsToken(token)
}
@MainActor func gotoButlerServiceSessionVC(sourceTitle: String? = nil, sourceUrl: String? = nil, sessionTitle: String = "银河管家", navigationController: UINavigationController?, completion: @escaping (Bool) -> Void) {
func gotoSessionVC() {
let source = QYSource()
source.title = sourceTitle
source.urlString = sourceUrl
IQKeyboardManager.shared.disabledDistanceHandlingClasses.append(QYSessionViewController.self)
guard let sessionViewController = QYSDK.shared().sessionViewController() else {
completion(false)
return
}
sessionViewController.sessionTitle = sessionTitle
sessionViewController.source = source
sessionViewController.hidesBottomBarWhenPushed = true
navigationController?.pushViewController(sessionViewController, completion: {
completion(true)
})
}
guard let userId = YHLoginManager.shared.userModel?.id, userId.count > 0 else {
completion(false)
return
}
/// YHHUD.show(.progress(message: "加载中..."))
getUserInfoViewModel.getUserInfomation(userId) { [weak self] dataString, error in
/// YHHUD.hide()
guard let dataString = dataString else {
completion(false)
return
}
self?.updateUserInfo(userId: userId, userData: dataString, completion: { success in
gotoSessionVC()
})
}
}
private func logoutCurrentUser(completion: @escaping (Bool) -> Void) {
QYSDK.shared().logout { flag in
completion(flag)
}
}
}
extension YHButlerServiceManager {
// MARK: - 私有登录登出的处理逻辑
@objc private func loginSuccess() {
guard let userId = YHLoginManager.shared.userModel?.id, userId.count > 0 else {
return
}
getUserInfoViewModel.getUserInfomation(userId) { [weak self] dataString, error in
guard let dataString = dataString else {
return
}
self?.updateUserInfo(userId: userId, userData: dataString, completion: { _ in })
}
}
@objc private func logoutSuccess() {
logoutCurrentUser { _ in
//
}
}
}
extension YHButlerServiceManager {
// MARK: - conversationManager方法
/// 获取所有会话的列表;非平台电商用户,只有一个会话项,平台电商用户,有多个会话项
func getSessionList() -> [QYSessionInfo] {
return conversationManager?.getSessionList() ?? []
}
/// 所有的未读数
func allUnreadCount() -> Int {
return conversationManager?.allUnreadCount() ?? 0
}
/// 清空未读数
func clearUnreadCount() {
conversationManager?.clearUnreadCount()
}
}
extension YHButlerServiceManager: QYConversationManagerDelegate {
// MARK: - QYConversationManagerDelegate
/// 会话列表变化;非平台电商用户,只有一个会话项,平台电商用户,有多个会话项
func onSessionListChanged(_ sessionList: [QYSessionInfo]!) {
//
}
/// 接收消息
func onReceiveMessage(_ message: QYMessageInfo!) {
//
}
/// 会话未读数变化
func onUnreadCountChanged(_ count: Int) {
//
}
}
//
// YHGalaxyManagerTipsItemView.swift
// galaxy
//
// Created by alexzzw on 2024/9/5.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHGalaxyManagerTipsItemView: UIView {
static let viewH = 52.0
private let dotWidth = 6.0
var buttonClickEvent: (() -> Void)?
private var isMessageRead: Bool = true {
didSet {
dotView.isHidden = isMessageRead
}
}
// 银河管家
private lazy var lableGalaxyMgr: UILabel = {
let lable : UILabel = UILabel()
lable.text = "银河管家"
lable.font = UIFont.PFSC_R(ofSize: 13)
lable.textColor = UIColor.mainTextColor
return lable
}()
// 分割线
private lazy var segmentationView: UIView = {
let view : UIView = UIView()
view.backgroundColor = UIColor.mainTextColor18
return view
}()
// 一对一专属服务
private lazy var lableMessage: UILabel = {
let lable : UILabel = UILabel()
lable.text = "一对一专属服务"
lable.font = UIFont.PFSC_R(ofSize: 13)
lable.textColor = UIColor.mainTextColor70
lable.lineBreakMode = .byTruncatingTail
return lable
}()
private lazy var dotView: UIView = {
let view = UIView()
view.backgroundColor = .failColor
view.layer.cornerRadius = self.dotWidth/2.0
view.isHidden = true
return view
}()
// 右箭头
private lazy var rightIconImageV: UIImageView = {
let imgV : UIImageView = UIImageView()
imgV.contentMode = .scaleAspectFill
imgV.image = UIImage(named: "home_order_tips_right_arrow")
return imgV
}()
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension YHGalaxyManagerTipsItemView {
func updateMessageState(didReadMessage: Bool) {
self.isMessageRead = didReadMessage
}
func updateManagerTipsItemView(message: String?, didReadMessage: Bool = true) {
lableMessage.text = message
updateMessageState(didReadMessage: didReadMessage)
}
}
extension YHGalaxyManagerTipsItemView {
@objc private func tapButton(gestureRecognizer:UITapGestureRecognizer) {
buttonClickEvent?()
}
private func setupUI() {
backgroundColor = UIColor(hex: 0xffffff, alpha: 0.65)
layer.borderWidth = 0.5
layer.borderColor = UIColor.white.cgColor
addSubview(lableGalaxyMgr)
lableGalaxyMgr.setContentCompressionResistancePriority(.required, for: .horizontal)
lableGalaxyMgr.snp.makeConstraints { make in
make.centerY.equalToSuperview()
make.left.equalTo(12)
make.height.equalTo(18)
make.width.equalTo(60)
}
addSubview(segmentationView)
lableGalaxyMgr.setContentCompressionResistancePriority(.required, for: .horizontal)
segmentationView.snp.makeConstraints { make in
make.left.equalTo(lableGalaxyMgr.snp.right).offset(8)
make.height.equalTo(10)
make.width.equalTo(1)
make.centerY.equalToSuperview()
}
addSubview(rightIconImageV)
rightIconImageV.setContentCompressionResistancePriority(.required, for: .horizontal)
rightIconImageV.snp.makeConstraints { make in
make.right.equalTo(-12)
make.centerY.equalToSuperview()
make.width.height.equalTo(12)
}
addSubview(dotView)
dotView.setContentCompressionResistancePriority(.required, for: .horizontal)
dotView.snp.makeConstraints { make in
make.width.height.equalTo(dotWidth)
make.right.equalTo(rightIconImageV.snp.left).offset(-12)
make.centerY.equalToSuperview()
}
addSubview(lableMessage)
lableMessage.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
lableMessage.snp.makeConstraints { make in
make.left.equalTo(segmentationView.snp.right).offset(8)
make.height.equalTo(18)
make.centerY.equalToSuperview()
make.right.lessThanOrEqualTo(dotView.snp.left).offset(-12)
}
let tap = UITapGestureRecognizer(target: self, action: #selector(tapButton(gestureRecognizer:)))
addGestureRecognizer(tap)
}
}
......@@ -9,25 +9,37 @@
import UIKit
import AttributedString
class YHOrderTipsView: UIView {
private static let viewH : CGFloat = 91.0
private static let viewH2 : CGFloat = 162.0
private static let viewH3 : CGFloat = 226.0
enum YHOrderTipsViewStyleType: Int {
case none = 0
case onlyMgr = 1
case onlyOneOrder = 2
case mgrAndOrder = 3
var tipViewH : CGFloat {
guard let arr = arrLastTwoMessage else {
func getHeight() -> CGFloat {
switch self {
case .none:
return YHOrderTipsView.viewH
}
if arr.count > 1 {
return YHOrderTipsView.viewH3
} else if arr.count == 1 {
case .onlyMgr, .onlyOneOrder:
return YHOrderTipsView.viewH2
case .mgrAndOrder:
return YHOrderTipsView.viewH3
}
return YHOrderTipsView.viewH
}
}
class YHOrderTipsView: UIView {
fileprivate static let viewH : CGFloat = 91.0
fileprivate static let viewH2 : CGFloat = 162.0
fileprivate static let viewH3 : CGFloat = 226.0
private var orderTipsViewStyle: YHOrderTipsViewStyleType = .none
var tipViewH : CGFloat {
return orderTipsViewStyle.getHeight()
}
var galaxyManagerItemClickEvent: (() -> Void)?
override init(frame: CGRect) {
super.init(frame: frame)
......@@ -37,7 +49,6 @@ class YHOrderTipsView: UIView {
addGestureRecognizer(tap)
}
var dataModelForBasicInfo : YHSignerInfoModel? {
didSet {
updateBasicInfo()
......@@ -47,10 +58,20 @@ class YHOrderTipsView: UIView {
var arrLastTwoMessage : [YHHomeLastMessageModel]? {
didSet {
updateLastTwoMessges()
updateItems()
}
}
var customerServiceMessage: YHButlerServiceHomeInfoMessage? {
didSet {
if let oldId = oldValue?.id, oldId.count > 0, oldId == customerServiceMessage?.id, oldValue?.showButler == customerServiceMessage?.showButler, oldValue?.isRead != customerServiceMessage?.isRead {
mgrItem.updateMessageState(didReadMessage: customerServiceMessage?.isRead ?? true)
} else {
updateItems()
}
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
......@@ -85,33 +106,58 @@ class YHOrderTipsView: UIView {
make.edges.equalToSuperview()
}
if let arr = arrLastTwoMessage {
if arr.count > 1 {
firstItem.snp.makeConstraints { make in
make.top.equalTo(lableName.snp.bottom).offset(20)
make.left.equalTo(kMargin)
make.right.equalTo(-20)
make.height.equalTo(YHOrderTipsItemView.viewH)
}
secondItem.snp.makeConstraints { make in
make.top.equalTo(firstItem.snp.bottom).offset(12)
make.left.equalTo(kMargin)
make.right.equalTo(-20)
make.height.equalTo(YHOrderTipsItemView.viewH)
}
} else if arr.count == 1 {
firstItem.snp.makeConstraints { make in
make.top.equalTo(lableName.snp.bottom).offset(20)
make.left.equalTo(kMargin)
make.right.equalTo(-kMargin)
make.height.equalTo(YHOrderTipsItemView.viewH)
}
switch orderTipsViewStyle {
case .none:
mgrItem.snp.remakeConstraints { make in
make.top.equalTo(lableName.snp.bottom).offset(20)
make.left.equalTo(kMargin)
make.width.height.equalTo(0)
}
firstItem.snp.remakeConstraints { make in
make.top.equalTo(mgrItem.snp.bottom).offset(20)
make.left.equalTo(kMargin)
make.width.height.equalTo(0)
}
case .onlyMgr:
mgrItem.snp.remakeConstraints { make in
make.top.equalTo(lableName.snp.bottom).offset(20)
make.left.equalTo(kMargin)
make.right.equalTo(-kMargin)
make.height.equalTo(YHGalaxyManagerTipsItemView.viewH)
}
firstItem.snp.remakeConstraints { make in
make.top.equalTo(mgrItem.snp.bottom).offset(20)
make.left.equalTo(kMargin)
make.width.height.equalTo(0)
}
case .onlyOneOrder:
mgrItem.snp.makeConstraints { make in
make.top.equalTo(lableName.snp.bottom).offset(20)
make.left.equalTo(kMargin)
make.width.height.equalTo(0)
}
firstItem.snp.remakeConstraints { make in
make.top.equalTo(lableName.snp.bottom).offset(20)
make.left.equalTo(kMargin)
make.right.equalTo(-kMargin)
make.height.equalTo(YHOrderTipsItemView.viewH)
}
case .mgrAndOrder:
mgrItem.snp.remakeConstraints { make in
make.top.equalTo(lableName.snp.bottom).offset(20)
make.left.equalTo(kMargin)
make.right.equalTo(-kMargin)
make.height.equalTo(YHGalaxyManagerTipsItemView.viewH)
}
firstItem.snp.remakeConstraints { make in
make.top.equalTo(mgrItem.snp.bottom).offset(20)
make.left.equalTo(kMargin)
make.right.equalTo(-kMargin)
make.height.equalTo(YHOrderTipsItemView.viewH)
}
}
}
//智能助理
lazy var lableTip: UILabel = {
let lable : UILabel = UILabel()
......@@ -165,17 +211,19 @@ class YHOrderTipsView: UIView {
lazy var firstItem: YHOrderTipsItemView = {
let itemView : YHOrderTipsItemView = YHOrderTipsItemView()
// itemView.indexItem = 1
itemView.isHidden = true
return itemView
}()
lazy var secondItem: YHOrderTipsItemView = {
let itemView : YHOrderTipsItemView = YHOrderTipsItemView()
// itemView.indexItem = 2
private lazy var mgrItem: YHGalaxyManagerTipsItemView = {
let itemView: YHGalaxyManagerTipsItemView = YHGalaxyManagerTipsItemView()
itemView.isHidden = true
itemView.buttonClickEvent = { [weak self] in
self?.galaxyManagerItemClickEvent?()
}
return itemView
}()
}
private extension YHOrderTipsView {
......@@ -215,33 +263,36 @@ private extension YHOrderTipsView {
layoutIfNeeded()
}
func updateLastTwoMessges() {
guard let arr = arrLastTwoMessage else {
firstItem.isHidden = true
secondItem.isHidden = true
return
private func updateItems() {
if let mgrMessage = customerServiceMessage, mgrMessage.showButler {
mgrItem.isHidden = false
mgrItem.updateManagerTipsItemView(message: mgrMessage.content, didReadMessage: mgrMessage.isRead)
} else {
mgrItem.isHidden = true
mgrItem.updateManagerTipsItemView(message: nil, didReadMessage: true)
}
if arr.count > 1 {
firstItem.isHidden = false
secondItem.isHidden = false
} else if arr.count == 1 {
if let first = arrLastTwoMessage?.first {
firstItem.message = first
firstItem.isHidden = false
secondItem.isHidden = true
} else {
firstItem.isHidden = true
secondItem.isHidden = true
firstItem.message = nil
}
if let first = arrLastTwoMessage?.first, let last = arrLastTwoMessage?.last {
firstItem.message = first
secondItem.message = last
if mgrItem.isHidden == false, firstItem.isHidden == false {
orderTipsViewStyle = .mgrAndOrder
} else if mgrItem.isHidden == true, firstItem.isHidden == false {
orderTipsViewStyle = .onlyOneOrder
} else if mgrItem.isHidden == false, firstItem.isHidden == true {
orderTipsViewStyle = .onlyOneOrder
} else {
orderTipsViewStyle = .none
}
setNeedsLayout()
layoutIfNeeded()
}
@objc func tapButton(gestureRecognizer:UITapGestureRecognizer) {
goTabBarBy(tabType: .service)
}
......@@ -334,9 +385,8 @@ private extension YHOrderTipsView {
// make.right.equalTo(-kMargin)
}
addSubview(mgrItem)
addSubview(firstItem)
addSubview(secondItem)
layoutIfNeeded()
setNeedsLayout()
......
......@@ -138,6 +138,8 @@ class YHMessageListVC: YHBaseViewController {
}
@objc func didCleanButtonClicked() {
// gotoYinHeManager()
// return
let unreadMessages = self.msgArr.filter { $0.unreadCount > 0 }
if unreadMessages.count <= 0 {
YHHUD.flash(message: "暂无未读消息~")
......@@ -314,6 +316,17 @@ class YHMessageListVC: YHBaseViewController {
}
}
extension YHMessageListVC {
private func gotoYinHeManager() {
guard let userId = YHLoginManager.shared.userModel?.id, userId.count > 0 else {
return
}
YHButlerServiceManager.shared.gotoButlerServiceSessionVC(navigationController: navigationController, completion: { _ in })
}
}
extension YHMessageListVC {
@objc func didEnableNotifyBtnClicked() {
......
......@@ -210,6 +210,16 @@ extension YhConstant {
}
// MARK: - 七鱼客服系统SDK
struct QiYuSDK {
static let appKey = "7922dbeb48141b15d2ae2e91cc156af5"
#if DEBUG
static let appName = "银河港生活iOS-Dev"
#else
static let appName = "银河港生活iOS"
#endif
}
// MARK: - 通知相关 名称
class YhNotification {
//登录成功
......
......@@ -510,4 +510,10 @@ class YHAllApiName {
static let dependentsCheck = "super-app/order/information/dependents/check"
}
// 七鱼透传信息获取
struct QiYu {
// 获取个人信息
static let userInfomation = "super-app/qiyu/user/information"
}
}
......@@ -18,6 +18,8 @@
#import <UserNotifications/UserNotifications.h>
// 列表截图
#import "TYSnapshotScroll.h"
// 七鱼SDK
#import <QYSDK/QYSDK.h>
#endif
......
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