Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
pidan
/
FuSiLive
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
c1c6a8ae
authored
May 25, 2026
by
suolong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改bug
parent
9a06339a
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
191 additions
and
17 deletions
DevelopmentPods/FUSCommon/FUSCommon/FUSRouter/Routers/ChatRouter/FUSChatPublicDefine.h
DevelopmentPods/FUSCommon/FUSCommon/FUSRouter/Routers/ChatRouter/FUSChatPublicDefine.m
DevelopmentPods/FUSFoundation/FUSFoundation/Classes/FUSFoundation/Views/StreamView/LiveStreamView/Push/Capture/TTSDK/Base/FUSStreamCatureHelper.m
Modules/FUSChatCenterModule/FUSChatCenterModule/Features/InstantMessaging/Other/FUSIMChatService.m
Modules/FUSChatCenterModule/FUSChatCenterModule/Features/InstantMessaging/Other/FUSIMUserService.h
Modules/FUSChatCenterModule/FUSChatCenterModule/Features/InstantMessaging/Other/FUSIMUserService.m
Modules/FUSChatCenterModule/FUSChatCenterModule/Features/ZhaiXin/Main/View/FUSZhaiXinTableView.m
Modules/FUSShowRoomModule/FUSShowRoomModule/Features/NewLive/Main/Controller/FUSLiveMainViewController.m
Modules/FUSShowRoomModule/FUSShowRoomModule/Features/NewLive/Main/Other/FUSLiveHelper.m
Modules/FUSShowRoomModule/FUSShowRoomModule/Router/FUSShowRoomRouter.m
Modules/FUSUserCenterModule/FUSUserCenterModule/Features/Zone/Controller/FireFlyMyZone/FUSMyZoneViewController.m
DevelopmentPods/FUSCommon/FUSCommon/FUSRouter/Routers/ChatRouter/FUSChatPublicDefine.h
View file @
c1c6a8ae
...
...
@@ -84,6 +84,9 @@ NS_ASSUME_NONNULL_BEGIN
// 寨信刷新
+
(
NSString
*
)
fus_ZhaiXin_Refresh
;
// 环信登录状态刷新
+
(
NSString
*
)
fus_IM_Login_State_Refresh
;
// 官方或者通知刷新
+
(
NSString
*
)
fus_OFFICIAL_MESSAGE_REFRESH
;
...
...
DevelopmentPods/FUSCommon/FUSCommon/FUSRouter/Routers/ChatRouter/FUSChatPublicDefine.m
View file @
c1c6a8ae
...
...
@@ -133,6 +133,11 @@
return
@"ZhaiXinRefresh"
;
}
// 环信登录状态刷新
+
(
NSString
*
)
fus_IM_Login_State_Refresh
{
return
@"fus_IM_Login_State_Refresh"
;
}
// 官方或者通知刷新
+
(
NSString
*
)
fus_OFFICIAL_MESSAGE_REFRESH
{
return
@"OfficialMessageRefresh"
;
...
...
DevelopmentPods/FUSFoundation/FUSFoundation/Classes/FUSFoundation/Views/StreamView/LiveStreamView/Push/Capture/TTSDK/Base/FUSStreamCatureHelper.m
View file @
c1c6a8ae
...
...
@@ -593,6 +593,11 @@
[
self
.
livePusher
destroy
];
self
.
livePusher
=
nil
;
// 单流直播结束后,主动释放系统音频会话,避免系统继续显示麦克风占用中。
[[
AVAudioSession
sharedInstance
]
setActive
:
NO
withOptions
:
AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation
error
:
nil
];
[
self
fus_offTorch
];
[[
FUSBeautyHelper
shareInstance
]
fus_destroyBeautyEngine
];
...
...
Modules/FUSChatCenterModule/FUSChatCenterModule/Features/InstantMessaging/Other/FUSIMChatService.m
View file @
c1c6a8ae
...
...
@@ -22,6 +22,7 @@
#import "FUSIMChatHttpHelper.h"
#import "FUSSingleChatDBOperate.h"
#import "FUSHttpHelper.h"
#import "FUSVideoChatFailAlertView.h"
#import "FUSSingleLiveEndedPopView.h"
...
...
@@ -69,7 +70,7 @@ typedef NS_ENUM(NSInteger, FUSIMChatMessageType) {
#define kmessageTypeToStr(type) [NSString stringWithFormat:@"%ld",type]
@interface
FUSIMChatService
()
<
EMChatManagerDelegate
>
@interface
FUSIMChatService
()
<
EMChatManagerDelegate
,
EMClientDelegate
>
/**
当前的会话对象
...
...
@@ -87,6 +88,11 @@ typedef NS_ENUM(NSInteger, FUSIMChatMessageType) {
临时保存未点击过的未接听通话消息的数组 <EMMessage *>
*/
@property
(
nonatomic
,
strong
)
NSMutableArray
*
tempUnacceptedConversationMsgArr
;
/**
是否已经安排了掉线后的登录校验,避免重复触发兜底重连
*/
@property
(
nonatomic
,
assign
)
BOOL
hasPendingReconnectCheck
;
/**
整个通话流程中对方的昵称
*/
...
...
@@ -272,15 +278,108 @@ typedef NS_ENUM(NSInteger, FUSIMChatMessageType) {
{
// 防止重复绑定
[
self
fus_endSdkChatDelegate
];
// 注册环信客户端状态回调
[[
EMClient
sharedClient
]
addDelegate
:
self
delegateQueue
:
dispatch_get_main_queue
()];
// 注册消息回调
[[
EMClient
sharedClient
].
chatManager
addDelegate
:
self
delegateQueue
:
nil
];
}
-
(
void
)
fus_endSdkChatDelegate
{
[[
EMClient
sharedClient
]
removeDelegate
:
self
];
[[
EMClient
sharedClient
].
chatManager
removeDelegate
:
self
];
}
/**
同步刷新环信登录状态,供私信列表等界面更新使用
*/
-
(
void
)
fus_notifyIMLoginStateChanged
{
dispatch_async
(
dispatch_get_main_queue
(),
^
{
[[
NSNotificationCenter
defaultCenter
]
postNotificationName
:
FUSChatNotificationKeys
.
fus_IM_Login_State_Refresh
object
:
nil
];
});
}
/**
环信断线后延迟做一次兜底校验,优先等待 SDK 自身恢复
*/
-
(
void
)
fus_delayCheckAndReconnectIMIfNeeded
{
if
(
self
.
hasPendingReconnectCheck
)
{
return
;
}
self
.
hasPendingReconnectCheck
=
YES
;
dispatch_after
(
dispatch_time
(
DISPATCH_TIME_NOW
,
(
int64_t
)(
5
*
NSEC_PER_SEC
)),
dispatch_get_main_queue
(),
^
{
self
.
hasPendingReconnectCheck
=
NO
;
if
([
EMClient
sharedClient
].
isConnected
)
{
[
self
fus_notifyIMLoginStateChanged
];
return
;
}
if
([
FUSHttpHelper
getNetworkStatus
]
==
AFNetworkReachabilityStatusNotReachable
)
{
return
;
}
[[
FUSIMUserService
shareInstance
]
fus_retryLoginIfNeeded
];
});
}
#pragma mark - EMClientDelegate
-
(
void
)
connectionStateDidChange
:
(
EMConnectionState
)
aConnectionState
{
if
(
aConnectionState
==
EMConnectionConnected
)
{
self
.
hasPendingReconnectCheck
=
NO
;
[
self
fus_notifyIMLoginStateChanged
];
[
self
fus_delayUpdateTalkListToLastMessage
];
return
;
}
[
self
fus_notifyIMLoginStateChanged
];
[
self
fus_delayCheckAndReconnectIMIfNeeded
];
}
-
(
void
)
autoLoginDidCompleteWithError
:
(
EMError
*
)
aError
{
[
self
fus_notifyIMLoginStateChanged
];
if
(
aError
)
{
FUSLogInfo
(
@"环信SDK自动登录失败——%@"
,
aError
.
errorDescription
);
[
self
fus_delayCheckAndReconnectIMIfNeeded
];
return
;
}
[
self
fus_delayUpdateTalkListToLastMessage
];
}
-
(
void
)
userAccountDidLoginFromOtherDevice
{
[
self
fus_notifyIMLoginStateChanged
];
[
FUSRouter
.
userRouter
showDifferentLoginWithTime
:
@""
];
}
-
(
void
)
userAccountDidForcedToLogout
:
(
EMError
*
)
aError
{
[
self
fus_notifyIMLoginStateChanged
];
FUSLogInfo
(
@"环信SDK被强制退出——%@"
,
aError
.
errorDescription
);
[
FUSRouter
.
userRouter
showDifferentLoginWithTime
:
@""
];
}
-
(
void
)
userAccountDidRemoveFromServer
{
[
self
fus_notifyIMLoginStateChanged
];
[
FUSDialogView
fus_showDialog
:[
NSString
fus_versionLocalString
:
@"聊天账号已失效,请重新登录"
]];
[
FUSRouter
.
userRouter
logOut
];
}
-
(
void
)
userDidForbidByServer
{
[
self
fus_notifyIMLoginStateChanged
];
[
FUSDialogView
fus_showDialog
:[
NSString
fus_versionLocalString
:
@"聊天账号已被限制,请重新登录"
]];
[
FUSRouter
.
userRouter
logOut
];
}
#pragma mark - 会话列表相关
-
(
NSString
*
)
fus_analysisLastMsgSkeletonizeWithMsg
:
(
EMMessage
*
)
msg
{
...
...
Modules/FUSChatCenterModule/FUSChatCenterModule/Features/InstantMessaging/Other/FUSIMUserService.h
View file @
c1c6a8ae
...
...
@@ -43,6 +43,11 @@
*/
-
(
void
)
fus_autoLoginWithAccount
:(
NSString
*
)
account
;
/**
环信掉线后的兜底重登
*/
-
(
void
)
fus_retryLoginIfNeeded
;
// 环信登录成功回调
@property
(
nonatomic
,
copy
)
void
(
^
imLoginSucceedHandler
)(
void
);
...
...
Modules/FUSChatCenterModule/FUSChatCenterModule/Features/InstantMessaging/Other/FUSIMUserService.m
View file @
c1c6a8ae
...
...
@@ -24,6 +24,11 @@
*/
@property
(
nonatomic
,
assign
)
NSInteger
retryCount
;
/**
当前是否正在执行环信登录,避免掉线时重复触发多次登录
*/
@property
(
nonatomic
,
assign
)
BOOL
isLoggingIn
;
// 老的数据
@property
(
nonatomic
,
strong
)
NSMutableArray
<
EMMessage
*>
*
oldDBArr
;
// 除去本地生成的消息
...
...
@@ -160,6 +165,15 @@
-
(
void
)
fus_autoLoginWithAccount
:
(
NSString
*
)
account
{
if
([
NSString
isNull
:
account
]
||
[
NSString
isNull
:
self
.
myUserPwd
])
{
return
;
}
if
(
self
.
isLoggingIn
)
{
return
;
}
self
.
isLoggingIn
=
YES
;
_myUserID
=
account
;
// 启动环信的代理服务
...
...
@@ -167,7 +181,7 @@
[
self
loginWithAccount
:
account
passWord
:
_myUserPwd
success
:^
{
dispatch_async
(
dispatch_get_main_queue
(),
^
{
[[
NSNotificationCenter
defaultCenter
]
postNotificationName
:
@"refresh_hyLogin_state"
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
postNotificationName
:
FUSChatNotificationKeys
.
fus_IM_Login_State_Refresh
object
:
nil
];
if
(
self
.
imLoginSucceedHandler
)
{
self
.
imLoginSucceedHandler
();
self
.
imLoginSucceedHandler
=
nil
;
...
...
@@ -181,6 +195,7 @@
// 重置重试次数
self
.
retryCount
=
0
;
self
.
isLoggingIn
=
NO
;
}
failure
:^
(
NSString
*
errorMsg
)
{
...
...
@@ -188,13 +203,18 @@
self
.
retryCount
++
;
if
(
self
.
retryCount
<=
3
)
{
// 重试3次
self
.
isLoggingIn
=
NO
;
dispatch_after
(
dispatch_time
(
DISPATCH_TIME_NOW
,
(
int64_t
)(
1
*
NSEC_PER_SEC
)),
dispatch_get_main_queue
(),
^
{
[
self
fus_autoLoginWithAccount
:
account
];
});
}
else
{
// 重置重试次数
self
.
retryCount
=
0
;
self
.
isLoggingIn
=
NO
;
dispatch_async
(
dispatch_get_main_queue
(),
^
{
[[
NSNotificationCenter
defaultCenter
]
postNotificationName
:
FUSChatNotificationKeys
.
fus_IM_Login_State_Refresh
object
:
nil
];
// 更新到最新的离线会话
[[
FUSIMChatService
shareInstance
]
fus_delayUpdateTalkListToLastMessage
];
});
...
...
@@ -202,6 +222,28 @@
}];
}
-
(
void
)
fus_retryLoginIfNeeded
{
if
(
self
.
isLoggingIn
)
{
return
;
}
if
([
EMClient
sharedClient
].
isLoggedIn
&&
[
EMClient
sharedClient
].
isConnected
)
{
return
;
}
NSString
*
account
=
self
.
myUserID
;
if
([
NSString
isNull
:
account
])
{
account
=
[
FUSCacheDataShare
shareStore
].
userVerifyInfo
.
uid
;
}
if
([
NSString
isNull
:
account
]
||
[
NSString
isNull
:
self
.
myUserPwd
])
{
return
;
}
[
self
fus_autoLoginWithAccount
:
account
];
}
-
(
void
)
fus_bindAPNsToken
{
dispatch_async
(
dispatch_get_global_queue
(
DISPATCH_QUEUE_PRIORITY_DEFAULT
,
0
),
^
{
NSData
*
token
=
[[
NSUserDefaults
standardUserDefaults
]
objectForKey
:
FUSChatUDKeys
.
fus_DEVICE_TOKEN_DATA
];
...
...
Modules/FUSChatCenterModule/FUSChatCenterModule/Features/ZhaiXin/Main/View/FUSZhaiXinTableView.m
View file @
c1c6a8ae
...
...
@@ -68,7 +68,7 @@
[
self
registerNib
:[
UINib
nibWithNibName
:
EASEMOB_CELL_IDENTIFIER
bundle
:[
FUSChatCenterBunble
bundle
]]
forCellReuseIdentifier
:
EASEMOB_CELL_IDENTIFIER
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
zhaiXinRefresh
)
name
:
FUSChatNotificationKeys
.
fus_ZhaiXin_Refresh
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
fus_checkHyLoginState
)
name
:
@"refresh_hyLogin_state"
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
fus_checkHyLoginState
)
name
:
FUSChatNotificationKeys
.
fus_IM_Login_State_Refresh
object
:
nil
];
[
self
fus_checkHyLoginState
];
...
...
Modules/FUSShowRoomModule/FUSShowRoomModule/Features/NewLive/Main/Controller/FUSLiveMainViewController.m
View file @
c1c6a8ae
...
...
@@ -1079,6 +1079,8 @@ typedef NS_ENUM(NSInteger, FUSStreamState) {
weakSelf
.
pushView
=
nil
;
}];
}
else
{
// 单流直播结束时,需要显式销毁采集 helper,确保底层 pusher 与系统音频会话一起释放。
[
self
.
pushView
.
captureHelper
fus_destroy
];
self
.
pushView
=
nil
;
}
...
...
@@ -1204,6 +1206,7 @@ typedef NS_ENUM(NSInteger, FUSStreamState) {
[
self
.
liveFunctionView
.
linkMicroView
fus_destroyLinkMic
];
// 推流
[
self
.
pushView
.
captureHelper
fus_stopStreamPush
];
[
self
.
pushView
.
captureHelper
fus_pauseAudioCapture
];
[
self
.
liveFunctionView
fus_cleanFunctionView
];
if
(
self
.
pushView
.
streamType
==
FUSStreamTypeRTC
)
{
...
...
@@ -1212,6 +1215,8 @@ typedef NS_ENUM(NSInteger, FUSStreamState) {
weakSelf
.
pushView
=
nil
;
}];
}
else
{
// 单流直播关闭房间时,补齐采集与音频会话销毁,避免麦克风继续被占用。
[
self
.
pushView
.
captureHelper
fus_destroy
];
self
.
pushView
=
nil
;
}
...
...
Modules/FUSShowRoomModule/FUSShowRoomModule/Features/NewLive/Main/Other/FUSLiveHelper.m
View file @
c1c6a8ae
...
...
@@ -1995,7 +1995,8 @@ static NSInteger const kFUSPayRoomCompanionPopViewTagLeft = 90917002;
[[
FUSLiveHelper
shareInstance
].
liveMinimizeView
removeFromSuperview
];
[
FUSLiveHelper
shareInstance
].
liveMinimizeView
=
nil
;
if
([[
FUSLiveHelper
shareInstance
]
liveType
]
==
FUSLiveTypeAnchor
)
{
[[[[
FUSLiveHelper
shareInstance
]
liveVC
]
pushView
].
captureHelper
fus_stopStreamPush
];
// 预览开播页与直播中的退出,统一走完整销毁,确保相机/麦克风采集链路被彻底释放。
[[[[
FUSLiveHelper
shareInstance
]
liveVC
]
pushView
].
captureHelper
fus_destroy
];
[[[[
FUSLiveHelper
shareInstance
]
liveVC
]
playView
]
fus_stopWithUID
:[
FUSLiveHelper
shareInstance
].
roomInfoModel
.
roomId
];
[[[[
FUSLiveHelper
shareInstance
]
liveVC
]
liveFunctionView
]
fus_cleanFunctionView
];
}
else
if
([[
FUSLiveHelper
shareInstance
]
liveType
]
==
FUSLiveTypeAudience
)
{
...
...
Modules/FUSShowRoomModule/FUSShowRoomModule/Router/FUSShowRoomRouter.m
View file @
c1c6a8ae
...
...
@@ -776,18 +776,15 @@
}
-
(
void
)
initTTSDK
{
NSInteger
appId
=
100667
;
NSString
*
currentBundleIdentifier
=
NSBundle
.
mainBundle
.
bundleIdentifier
?:
@""
;
NSString
*
formalBundleIdentifier
=
@"com.fusi.meet.live.chat.video.among.friends"
;
// 根据系统当前包名判断播放器配置,正式包走正式 license 与 appid。
BOOL
useFormalTTSDKConfig
=
[
currentBundleIdentifier
isEqualToString
:
formalBundleIdentifier
];
NSInteger
appId
=
useFormalTTSDKConfig
?
642006
:
100667
;
NSString
*
appname
=
FUSConfig
.
sharedInstanced
.
appConfigs
.
appName
;
NSString
*
channel
=
[
FUSDeviceHelper
fus_getChannelId
];
NSString
*
bundleID
=
@"com.ft.chat.ios"
;
NSString
*
lisenceFilePath
=
@"TTSDKLisenceFileForTest"
;
// NSInteger appId = 980302338;
// NSString *appname = @"FusiClub";
// NSString *channel = [FUSDeviceHelper fus_getChannelId];
// NSString *bundleID = @"com.fusi.meet.live.chat.video.among.friends";
// NSString *lisenceFilePath = @"TTSDKLisenceFile";
NSString
*
bundleID
=
currentBundleIdentifier
;
NSString
*
lisenceFilePath
=
useFormalTTSDKConfig
?
@"TTSDKLisenceFile"
:
@"TTSDKLisenceFileForTest"
;
TTSDKConfiguration
*
configuration
=
[
TTSDKConfiguration
defaultConfigurationWithAppID
:
@
(
appId
).
description
];
configuration
.
appName
=
appname
;
...
...
Modules/FUSUserCenterModule/FUSUserCenterModule/Features/Zone/Controller/FireFlyMyZone/FUSMyZoneViewController.m
View file @
c1c6a8ae
...
...
@@ -136,7 +136,7 @@
-
(
void
)
viewDidLayoutSubviews
{
[
super
viewDidLayoutSubviews
];
self
.
tableView
.
width
=
self
.
scollView
.
width
;
CGRect
frame
=
CGRectMake
(
0
,
self
.
tableView
.
bottom
,
self
.
scollView
.
width
,
self
.
scollView
.
height
-
self
.
topView
.
height
);
CGRect
frame
=
CGRectMake
(
0
,
self
.
tableView
.
bottom
,
self
.
scollView
.
width
,
[
self
fus_feedListVisibleHeight
]
);
if
(
!
CGRectEqualToRect
(
frame
,
self
.
newsFeedListView
.
frame
))
{
self
.
newsFeedListView
.
maxHeight
=
CGRectGetHeight
(
frame
);
self
.
newsFeedListView
.
frame
=
frame
;
...
...
@@ -199,12 +199,14 @@
self
.
tableView
.
tableContentHeightDidChangedHandler
=
^
(
CGFloat
height
)
{
if
(
weakSelf
.
tableView
.
height
!=
height
)
{
CGFloat
feedListVisibleHeight
=
[
weakSelf
fus_feedListVisibleHeight
];
weakSelf
.
tableView
.
width
=
weakSelf
.
scollView
.
width
;
weakSelf
.
tableView
.
height
=
height
;
weakSelf
.
newsFeedListView
.
maxHeight
=
weakSelf
.
scollView
.
height
-
weakSelf
.
topView
.
height
;
// 个人页底部有悬浮操作栏,动态列表区域至少要保留可视高度,避免内容较少时无法滚动到“分享/相册/点赞”区域。
weakSelf
.
newsFeedListView
.
maxHeight
=
feedListVisibleHeight
;
weakSelf
.
newsFeedListView
.
width
=
weakSelf
.
scollView
.
width
;
weakSelf
.
newsFeedListView
.
height
=
weakSelf
.
scollView
.
height
-
weakSelf
.
topView
.
h
eight
;
weakSelf
.
newsFeedListView
.
height
=
feedListVisibleH
eight
;
weakSelf
.
newsFeedListView
.
y
=
weakSelf
.
tableView
.
bottom
;
weakSelf
.
scollView
.
contentSize
=
CGSizeMake
(
weakSelf
.
scollView
.
width
,
weakSelf
.
tableView
.
height
+
weakSelf
.
newsFeedListView
.
height
);
}
...
...
@@ -253,6 +255,10 @@
};
self
.
newsFeedListView
.
heightDidChangedHandler
=
^
(
CGFloat
height
)
{
CGFloat
feedListVisibleHeight
=
[
weakSelf
fus_feedListVisibleHeight
];
if
(
height
<
feedListVisibleHeight
)
{
height
=
feedListVisibleHeight
;
}
CGFloat
newContentOffsetHeight
=
height
+
weakSelf
.
tableView
.
height
;
CGFloat
contentOffsetY
=
newContentOffsetHeight
-
weakSelf
.
scollView
.
height
;
...
...
@@ -813,6 +819,12 @@
return
self
.
tableView
.
height
-
self
.
topView
.
height
;
}
/// 个人页下半部分列表的可视高度,避开顶部导航和底部悬浮栏,保证“分享/相册/点赞”区域始终可达。
-
(
CGFloat
)
fus_feedListVisibleHeight
{
CGFloat
height
=
self
.
scollView
.
height
-
self
.
topView
.
height
-
self
.
bottomView
.
height
;
return
MAX
(
height
,
0
);
}
#pragma mark - Animation Images
-
(
NSMutableArray
*
)
onliveAnimationImgArr
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment