App.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <script>
  2. import timPresenceManager from '@/utils/tim-presence-manager.js';
  3. import timManager from '@/utils/tim-manager.js';
  4. export default {
  5. onLaunch: function () {
  6. console.log('=== App启动 ===');
  7. // 初始化TIM(全局)
  8. this.initGlobalTIM();
  9. // 延迟挂载全局方法(等待 App 实例创建完成)
  10. setTimeout(() => {
  11. const app = getApp();
  12. if (app) {
  13. app.globalData.initGlobalTIM = this.initGlobalTIM.bind(this);
  14. app.globalData.initPresenceManager = this.initPresenceManager.bind(this);
  15. console.log('✅ 全局方法挂载成功');
  16. }
  17. }, 100);
  18. },
  19. onShow: function () {
  20. console.log('=== App显示 ===');
  21. console.log(' 当前时间:', new Date().toLocaleTimeString());
  22. // 延迟检查TIM连接状态,避免在登录过程中重复调用
  23. setTimeout(() => {
  24. console.log('⏰ 开始执行 checkTIMConnection...');
  25. this.checkTIMConnection();
  26. }, 500); // 缩短延迟时间到 500ms
  27. },
  28. onHide: function () {
  29. console.log('=== App隐藏 ===');
  30. // App切换到后台时,不断开连接,保持在线状态
  31. },
  32. methods: {
  33. /**
  34. * 初始化全局TIM
  35. */
  36. async initGlobalTIM() {
  37. try {
  38. // 获取当前登录用户ID
  39. const userInfo = uni.getStorageSync('userInfo');
  40. const userId = uni.getStorageSync('userId') || userInfo?.userId || userInfo?.id;
  41. if (!userId) {
  42. console.log('⚠️ 未登录,跳过TIM初始化');
  43. return;
  44. }
  45. // 如果TIM已经登录且用户ID匹配,跳过
  46. if (timManager.isLogin && String(timManager.userId) === String(userId)) {
  47. console.log('✅ TIM已登录,用户ID:', userId);
  48. return;
  49. }
  50. console.log('🚀 开始初始化全局TIM,用户ID:', userId);
  51. // 初始化TIM SDK(只在首次初始化)
  52. const SDKAppID = 1600109674;
  53. if (!timManager.tim) {
  54. timManager.init(SDKAppID);
  55. console.log('✅ TIM SDK 初始化完成');
  56. }
  57. // 如果用户ID不匹配,先登出旧用户
  58. if (timManager.isLogin && timManager.userId && String(timManager.userId) !== String(userId)) {
  59. console.log('⚠️ 检测到用户切换,先登出旧用户...');
  60. try {
  61. await timManager.logout();
  62. console.log('✅ 旧用户已登出');
  63. } catch (e) {
  64. console.warn('⚠️ 登出失败,继续登录新用户:', e.message);
  65. }
  66. }
  67. // 获取UserSig
  68. const res = await uni.request({
  69. url: `http://localhost:8083/api/im/getUserSig?userId=${userId}`,
  70. method: 'GET'
  71. });
  72. if (res[1].data.code === 200) {
  73. const userSig = res[1].data.data.userSig;
  74. // 登录TIM
  75. await timManager.login(String(userId), userSig);
  76. console.log('✅ 全局TIM登录成功');
  77. // TIM 登录成功后,初始化在线状态管理器
  78. await this.initPresenceManager(userId);
  79. } else {
  80. throw new Error('获取UserSig失败');
  81. }
  82. } catch (error) {
  83. console.error('❌ 初始化全局TIM失败:', error);
  84. }
  85. },
  86. /**
  87. * 初始化在线状态管理器
  88. */
  89. async initPresenceManager(userId) {
  90. try {
  91. console.log('🌐 初始化在线状态管理器,用户ID:', userId);
  92. // 初始化 TIM + WebSocket 混合状态管理器
  93. await timPresenceManager.init(String(userId));
  94. console.log('✅ 在线状态管理器初始化成功');
  95. } catch (error) {
  96. console.error('❌ 初始化在线状态管理器失败:', error);
  97. }
  98. },
  99. /**
  100. * 检查TIM连接状态和WebSocket连接状态
  101. */
  102. checkTIMConnection() {
  103. console.log('🔍 ========== 开始检查连接状态 ==========');
  104. // 获取当前登录用户ID
  105. const userId = uni.getStorageSync('userId');
  106. console.log(' 当前用户ID:', userId);
  107. if (!userId) {
  108. console.log('⚠️ 未登录,跳过连接检查');
  109. console.log('=========================================');
  110. return;
  111. }
  112. // 检查 TIM 是否登录
  113. console.log(' TIM 登录状态:', timManager.isLogin);
  114. console.log(' TIM 用户ID:', timManager.userId);
  115. if (!timManager.isLogin) {
  116. console.log('⚠️ TIM未登录,尝试重新初始化');
  117. console.log('=========================================');
  118. this.initGlobalTIM();
  119. return;
  120. }
  121. // 检查 WebSocket 是否连接
  122. console.log(' WebSocket 连接状态:', timPresenceManager.isConnected);
  123. if (!timPresenceManager.isConnected) {
  124. console.log('⚠️ WebSocket未连接,尝试重新初始化在线状态管理器');
  125. console.log('=========================================');
  126. this.initPresenceManager(userId);
  127. } else {
  128. console.log('✅ TIM和WebSocket连接正常');
  129. console.log('=========================================');
  130. }
  131. }
  132. },
  133. globalData: {
  134. }
  135. }
  136. </script>
  137. <style lang="scss">
  138. /*每个页面公共css */
  139. page {
  140. min-height: 100vh;
  141. width: 750rpx;
  142. background-color: #fff;
  143. padding-bottom: constant(safe-area-inset-bottom);
  144. padding-bottom: env(safe-area-inset-bottom);
  145. }
  146. .content {
  147. display: flex;
  148. flex-direction: column;
  149. }
  150. </style>