删除当前用户切换麦克风时的云信消息发送流程文档,并修复视频时长检查逻辑,将最大时长从555秒更改为10秒,同时更新本地化字符串以反映此更改。确保代码整洁性和可读性。

This commit is contained in:
edwinQQQ
2025-09-19 17:36:35 +08:00
parent 11795a57a1
commit 33e42234ca
12 changed files with 16 additions and 105 deletions

View File

@@ -483,11 +483,11 @@ TZImagePickerControllerDelegate>
// 5 // 5
NSTimeInterval duration = asset.duration; NSTimeInterval duration = asset.duration;
if (duration > 555.0) { if (duration > 5.0) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
@kStrongify(self); @kStrongify(self);
[self hideHUD]; [self hideHUD];
[self showErrorToast:@"视频时长不能超过555秒"]; [self showErrorToast:YMLocalizedString(@"20.20.51_text_30")];
}); });
return; return;
} }

View File

@@ -1109,7 +1109,7 @@ NSString * const kRoomShowTopicKey = @"kRoomShowTopicKey";
NSDictionary *obj = [datas xpSafeObjectAtIndex:0]; NSDictionary *obj = [datas xpSafeObjectAtIndex:0];
if (obj) { if (obj) {
NSArray *results = [obj objectForKey:@"resultIndexes"]; NSArray *results = [obj objectForKey:@"resultIndexes"];
if (results.count > 0) { if ([results isKindOfClass:[NSArray class]] && results.count > 0) {
delay = 2.5; delay = 2.5;
} }
} }

View File

@@ -28,7 +28,7 @@
+ (NSArray<XPRoomMoreMenuAction *> *)createActionsWithContext:(XPRoomMoreMenuActionContext *)context { + (NSArray<XPRoomMoreMenuAction *> *)createActionsWithContext:(XPRoomMoreMenuActionContext *)context {
NSMutableArray *actions = [NSMutableArray array]; NSMutableArray *actions = [NSMutableArray array];
[actions addObject:[XPSocialAction trumpetAction]]; // [actions addObject:[XPSocialAction trumpetAction]];
[actions addObject:[XPTurboModeAction actionWithRoomInfo:context.roomInfo]]; [actions addObject:[XPTurboModeAction actionWithRoomInfo:context.roomInfo]];
[actions addObject:[XPRoomAppManagerAction action]]; [actions addObject:[XPRoomAppManagerAction action]];
[actions addObject:[XPSocialAction reportAction]]; [actions addObject:[XPSocialAction reportAction]];
@@ -78,13 +78,13 @@
// 4. - // 4. -
if (userNotNormal) { if (userNotNormal) {
[actions addObject:[XPSocialAction trumpetAction]]; // [actions addObject:[XPSocialAction trumpetAction]];
[actions addObject:[XPRoomEffectAction action]]; [actions addObject:[XPRoomEffectAction action]];
[actions addObject:[XPRoomSettingAction action]]; [actions addObject:[XPRoomSettingAction action]];
[actions addObject:[XPRoomBackGroundSettingAction action]]; [actions addObject:[XPRoomBackGroundSettingAction action]];
[actions addObject:[XPRoomCleanMessagesAction action]]; [actions addObject:[XPRoomCleanMessagesAction action]];
} else { } else {
[actions addObject:[XPSocialAction trumpetAction]]; // [actions addObject:[XPSocialAction trumpetAction]];
[actions addObject:[XPRoomEffectAction action]]; [actions addObject:[XPRoomEffectAction action]];
} }
@@ -138,7 +138,7 @@
+ (NSArray<XPRoomMoreMenuAction *> *)createSuperAdminActionsWithContext:(XPRoomMoreMenuActionContext *)context { + (NSArray<XPRoomMoreMenuAction *> *)createSuperAdminActionsWithContext:(XPRoomMoreMenuActionContext *)context {
NSMutableArray *actions = [NSMutableArray array]; NSMutableArray *actions = [NSMutableArray array];
[actions addObject:[XPSocialAction trumpetAction]]; // [actions addObject:[XPSocialAction trumpetAction]];
[actions addObject:[XPTurboModeAction actionWithRoomInfo:context.roomInfo]]; [actions addObject:[XPTurboModeAction actionWithRoomInfo:context.roomInfo]];
[actions addObject:[XPRoomAppManagerAction action]]; [actions addObject:[XPRoomAppManagerAction action]];
[actions addObject:[XPSocialAction reportAction]]; [actions addObject:[XPSocialAction reportAction]];

View File

@@ -4146,6 +4146,7 @@ ineHeadView12" = "الحمل";
"20.20.51_text_27" = "١ في كل مرة تقوم فيها بتحميل صورة رمزية ديناميكية سيقوم النظام بخصم %@ عملة من حسابك. يرجى التأكد من أن رصيد حسابك كافٍ\n\n٢ عملية المراجعة: بعد اكتمال التحميل، سيدخل النظام تلقائيًا عملية المراجعة. خلال هذه الفترة، يرجى عدم تحميل صورة رمزية جديدة مرة أخرى لتجنب التأثير على تقدم المراجعة.\n\n٣ نتائج المراجعة \n\nتمت المراجعة بنجاح: ستدخل الصورة الرمزية الديناميكية الجديدة حيز التنفيذ على الفور وسيتم عرضها للمستخدمين الآخرين.\n\nفشل المراجعة: سيقوم النظام تلقائيًا برد %@ عملة أنفقتها بعد اكتمال المراجعة. في نفس الوقت، ستتلقى إشعارًا من النظام.\n\n٤ عملية لا رجعة فيها: يرجى ملاحظة أنه بمجرد مراجعة الصورة الرمزية الديناميكية ودخولها حيز التنفيذ، فلن تتمكن من استعادتها إلى الصورة الرمزية السابقة.\n"; "20.20.51_text_27" = "١ في كل مرة تقوم فيها بتحميل صورة رمزية ديناميكية سيقوم النظام بخصم %@ عملة من حسابك. يرجى التأكد من أن رصيد حسابك كافٍ\n\n٢ عملية المراجعة: بعد اكتمال التحميل، سيدخل النظام تلقائيًا عملية المراجعة. خلال هذه الفترة، يرجى عدم تحميل صورة رمزية جديدة مرة أخرى لتجنب التأثير على تقدم المراجعة.\n\n٣ نتائج المراجعة \n\nتمت المراجعة بنجاح: ستدخل الصورة الرمزية الديناميكية الجديدة حيز التنفيذ على الفور وسيتم عرضها للمستخدمين الآخرين.\n\nفشل المراجعة: سيقوم النظام تلقائيًا برد %@ عملة أنفقتها بعد اكتمال المراجعة. في نفس الوقت، ستتلقى إشعارًا من النظام.\n\n٤ عملية لا رجعة فيها: يرجى ملاحظة أنه بمجرد مراجعة الصورة الرمزية الديناميكية ودخولها حيز التنفيذ، فلن تتمكن من استعادتها إلى الصورة الرمزية السابقة.\n";
"20.20.51_text_28" = "عرض الوقت:%@"; "20.20.51_text_28" = "عرض الوقت:%@";
"20.20.51_text_29" = "يجب أن يكون عدد الماس مضاعفات %@"; "20.20.51_text_29" = "يجب أن يكون عدد الماس مضاعفات %@";
"20.20.51_text_30" = "يجب ألا تتجاوز مدة الفيديو 10 ثوانٍ.";
"20.20.56_text_1" = "عدد المباريات الحالي غير كافٍ، فشلت المباراة. إعادة المباراة مرة أخرى؟"; "20.20.56_text_1" = "عدد المباريات الحالي غير كافٍ، فشلت المباراة. إعادة المباراة مرة أخرى؟";
"20.20.56_text_2" = "فشلت المطابقة، تم إرجاع العملات التي استهلكتها إلى محفظتك"; "20.20.56_text_2" = "فشلت المطابقة، تم إرجاع العملات التي استهلكتها إلى محفظتك";

View File

@@ -3933,6 +3933,7 @@
"20.20.51_text_27" = "1 Each time you upload a dynamic avatar, the system will deduct %@ coins from your account. Please make sure that your account balance is sufficient.\n2 Review process: After the upload is completed, the system will automatically enter the review process. During this period, please do not upload a new avatar again to avoid affecting the review progress.\n3 Review results: \nReview passed: Your new dynamic avatar will take effect immediately and be displayed to other users.\nReview failed: The system will automatically refund the %@ coins you spent after the review is completed. At the same time, you will receive a system notification.\n4 Irreversible operation: Please note that once the dynamic avatar is reviewed and takes effect, you will not be able to restore it to the previous avatar.\n"; "20.20.51_text_27" = "1 Each time you upload a dynamic avatar, the system will deduct %@ coins from your account. Please make sure that your account balance is sufficient.\n2 Review process: After the upload is completed, the system will automatically enter the review process. During this period, please do not upload a new avatar again to avoid affecting the review progress.\n3 Review results: \nReview passed: Your new dynamic avatar will take effect immediately and be displayed to other users.\nReview failed: The system will automatically refund the %@ coins you spent after the review is completed. At the same time, you will receive a system notification.\n4 Irreversible operation: Please note that once the dynamic avatar is reviewed and takes effect, you will not be able to restore it to the previous avatar.\n";
"20.20.51_text_28" = "View Time: %@"; "20.20.51_text_28" = "View Time: %@";
"20.20.51_text_29" = "Number of diamonds needs to be multiples of %@"; "20.20.51_text_29" = "Number of diamonds needs to be multiples of %@";
"20.20.51_text_30" = "Video duration must not exceed 10 seconds.";
"20.20.56_text_1" = "The current number of matches is not enough, the match failed. Re-match again?"; "20.20.56_text_1" = "The current number of matches is not enough, the match failed. Re-match again?";
"20.20.56_text_2" = "Match failed, the coins you consumed has been returned to your wallet"; "20.20.56_text_2" = "Match failed, the coins you consumed has been returned to your wallet";

View File

@@ -3941,6 +3941,7 @@ Revisión fallida: El sistema reembolsará automáticamente las %@ monedas que g
"; ";
"20.20.51_text_28" = "Hora de Vista: %@"; "20.20.51_text_28" = "Hora de Vista: %@";
"20.20.51_text_29" = "El número de diamantes debe ser múltiplo de 1000"; "20.20.51_text_29" = "El número de diamantes debe ser múltiplo de 1000";
"20.20.51_text_30" = "La duración del video no debe exceder los 10 segundos.";
"20.20.56_text_1" = "La cantidad actual de coincidencias no es suficiente, la coincidencia falló. ¿Volver a intentar?"; "20.20.56_text_1" = "La cantidad actual de coincidencias no es suficiente, la coincidencia falló. ¿Volver a intentar?";
"20.20.56_text_2" = "Coincidencia fallida, las monedas que consumiste han sido devueltas a tu billetera"; "20.20.56_text_2" = "Coincidencia fallida, las monedas que consumiste han sido devueltas a tu billetera";

View File

@@ -3229,6 +3229,8 @@
"20.20.51_text_27" = "1 Cada envio de avatar dinâmico deduz %@ moedas. Verifique seu saldo.\n2 Revisão: Após o envio, o sistema entrará em revisão. Não envie novamente para não atrasar.\n3 Resultado: \nAprovado: Seu avatar será exibido.\nReprovado: As moedas serão reembolsadas e você será notificado.\n4 Operação irreversível: Após a aprovação, não é possível reverter."; "20.20.51_text_27" = "1 Cada envio de avatar dinâmico deduz %@ moedas. Verifique seu saldo.\n2 Revisão: Após o envio, o sistema entrará em revisão. Não envie novamente para não atrasar.\n3 Resultado: \nAprovado: Seu avatar será exibido.\nReprovado: As moedas serão reembolsadas e você será notificado.\n4 Operação irreversível: Após a aprovação, não é possível reverter.";
"20.20.51_text_28" = "Horário da Visita: %@"; "20.20.51_text_28" = "Horário da Visita: %@";
"20.20.51_text_29" = "O número de diamantes precisa ser múltiplo de %@"; "20.20.51_text_29" = "O número de diamantes precisa ser múltiplo de %@";
"20.20.51_text_30" = "A duração do vídeo não pode exceder 10 segundos.";
"20.20.56_text_1" = "Número atual de correspondências insuficiente, falha na correspondência. Tentar novamente?"; "20.20.56_text_1" = "Número atual de correspondências insuficiente, falha na correspondência. Tentar novamente?";
"20.20.56_text_2" = "Falha na correspondência, as moedas gastas foram devolvidas à sua carteira."; "20.20.56_text_2" = "Falha na correspondência, as moedas gastas foram devolvidas à sua carteira.";
"20.20.56_text_3" = "Mudar Relacionamento"; "20.20.56_text_3" = "Mudar Relacionamento";

View File

@@ -3930,6 +3930,7 @@
"20.20.51_text_27" = "1 Каждый раз, когда вы загружаете динамический аватар, система списывает %@ монет с вашего аккаунта. Пожалуйста, убедитесь, что баланс вашего аккаунта достаточен.\n2 Процесс проверки: После завершения загрузки система автоматически переходит в процесс проверки. В это время не загружайте новый аватар, чтобы не повлиять на прогресс проверки.\n3 Результаты проверки:\nПроверка пройдена: Ваш новый динамический аватар вступит в силу немедленно и будет отображаться другим пользователям.\nПроверка не пройдена: После завершения проверки система автоматически вернет вам потраченные %@ монеты. В то же время вы получите системное уведомление.\n4 Нереверсивная операция: Пожалуйста, обратите внимание, что после проверки и вступления в силу динамический аватар вы не сможете восстановить предыдущий аватар.\n"; "20.20.51_text_27" = "1 Каждый раз, когда вы загружаете динамический аватар, система списывает %@ монет с вашего аккаунта. Пожалуйста, убедитесь, что баланс вашего аккаунта достаточен.\n2 Процесс проверки: После завершения загрузки система автоматически переходит в процесс проверки. В это время не загружайте новый аватар, чтобы не повлиять на прогресс проверки.\n3 Результаты проверки:\nПроверка пройдена: Ваш новый динамический аватар вступит в силу немедленно и будет отображаться другим пользователям.\nПроверка не пройдена: После завершения проверки система автоматически вернет вам потраченные %@ монеты. В то же время вы получите системное уведомление.\n4 Нереверсивная операция: Пожалуйста, обратите внимание, что после проверки и вступления в силу динамический аватар вы не сможете восстановить предыдущий аватар.\n";
"20.20.51_text_28" = "Время просмотра: %@"; "20.20.51_text_28" = "Время просмотра: %@";
"20.20.51_text_29" = "Количество алмазов должно быть кратно 1000"; "20.20.51_text_29" = "Количество алмазов должно быть кратно 1000";
"20.20.51_text_30" = "Продолжительность видео не должна превышать 10 секунд.";
"20.20.56_text_1" = "Текущее количество матчей недостаточно, матч не удался. Сыграть снова?"; "20.20.56_text_1" = "Текущее количество матчей недостаточно, матч не удался. Сыграть снова?";
"20.20.56_text_2" = "Матч не удался, потраченные вами монеты возвращены в Кошелёк"; "20.20.56_text_2" = "Матч не удался, потраченные вами монеты возвращены в Кошелёк";

View File

@@ -3727,6 +3727,7 @@
"20.20.51_text_27" = "1 Her dinamik avatar yüklediğinizde, sistem hesabınızdan %@ jeton düşecektir. Lütfen hesap bakiyenizin yeterli olduğundan emin olun.\n2 İnceleme süreci: Yükleme tamamlandıktan sonra, sistem otomatik olarak inceleme sürecine girecektir. Bu süre zarfında, inceleme ilerlemesini etkilememek için lütfen tekrar yeni bir avatar yüklemeyin.\n3 İnceleme sonuçları: \nİnceleme geçti: Yeni dinamik avatarınız hemen yürürlüğe girecek ve diğer kullanıcılara gösterilecektir.\nİnceleme başarısız oldu: Sistem, inceleme tamamlandıktan sonra harcadığınız %@ jetonu otomatik olarak iade edecektir. Aynı zamanda, bir sistem bildirimi alacaksınız.\n4 Geri alınamaz işlem: Lütfen dinamik avatar incelendikten ve yürürlüğe girdikten sonra, onu önceki avatarınıza geri yükleyemeyeceğinizi unutmayın.\n"; "20.20.51_text_27" = "1 Her dinamik avatar yüklediğinizde, sistem hesabınızdan %@ jeton düşecektir. Lütfen hesap bakiyenizin yeterli olduğundan emin olun.\n2 İnceleme süreci: Yükleme tamamlandıktan sonra, sistem otomatik olarak inceleme sürecine girecektir. Bu süre zarfında, inceleme ilerlemesini etkilememek için lütfen tekrar yeni bir avatar yüklemeyin.\n3 İnceleme sonuçları: \nİnceleme geçti: Yeni dinamik avatarınız hemen yürürlüğe girecek ve diğer kullanıcılara gösterilecektir.\nİnceleme başarısız oldu: Sistem, inceleme tamamlandıktan sonra harcadığınız %@ jetonu otomatik olarak iade edecektir. Aynı zamanda, bir sistem bildirimi alacaksınız.\n4 Geri alınamaz işlem: Lütfen dinamik avatar incelendikten ve yürürlüğe girdikten sonra, onu önceki avatarınıza geri yükleyemeyeceğinizi unutmayın.\n";
"20.20.51_text_28" = "Görüntüleme Süresi: %@"; "20.20.51_text_28" = "Görüntüleme Süresi: %@";
"20.20.51_text_29" = "Elmas sayısının %@ katları olması gerekir"; "20.20.51_text_29" = "Elmas sayısının %@ katları olması gerekir";
"20.20.51_text_30" = "Video süresi 10 saniyeyi geçemez.";
"20.20.56_text_1" = "Mevcut eşleşme sayısı yeterli değil, eşleşme başarısız oldu. Tekrar eşleşelim mi?"; "20.20.56_text_1" = "Mevcut eşleşme sayısı yeterli değil, eşleşme başarısız oldu. Tekrar eşleşelim mi?";
"20.20.56_text_2" = "Eşleşme başarısız oldu, harcadığınız jetonlar cüzdanınıza iade edildi"; "20.20.56_text_2" = "Eşleşme başarısız oldu, harcadığınız jetonlar cüzdanınıza iade edildi";

View File

@@ -3901,6 +3901,7 @@ Tasdiqlangandan so'ng, sekretar sizga uni chop etishda yordam beradi va sizni xa
"20.20.51_text_27" = "1 Har safar dinamik avatar yuklanganda, tizim hisobingizdan %@ tanga ayirib oladi. Iltimos, hisobingizning balansi etarli ekanligiga ishonch hosil qiling.\n2 Tekshirish jarayoni: Yuklash tugagandan so'ng, tizim avtomatik ravishda tekshirish jarayoniga kiradi. Bu vaqt ichida, qayta tekshirish jarayoniga ta'sir qilmaslik uchun, yangi avatarni yana yuklamang.\n3 Tekshirish natijalari: \nTekshiruv muvaffaqiyatli: Yangi dinamik avatariz darhol kuchga kiradi va boshqa foydalanuvchilarga ko'rsatiladi.\nTekshiruv muvaffaqiyatsiz: Tekshiruv tugagandan so'ng, tizim sarflangan %@ tangalarni avtomatik ravishda qaytaradi. Shu bilan birga, siz tizim xabarnomasini olasiz.\n4 Qaytarilmaydigan operatsiya: E'tibor bering, dinamik avatar tekshirib olingan va kuchga kiritilganidan keyin, uni oldingi avatarga qaytarib bo'lmaydi.\n"; "20.20.51_text_27" = "1 Har safar dinamik avatar yuklanganda, tizim hisobingizdan %@ tanga ayirib oladi. Iltimos, hisobingizning balansi etarli ekanligiga ishonch hosil qiling.\n2 Tekshirish jarayoni: Yuklash tugagandan so'ng, tizim avtomatik ravishda tekshirish jarayoniga kiradi. Bu vaqt ichida, qayta tekshirish jarayoniga ta'sir qilmaslik uchun, yangi avatarni yana yuklamang.\n3 Tekshirish natijalari: \nTekshiruv muvaffaqiyatli: Yangi dinamik avatariz darhol kuchga kiradi va boshqa foydalanuvchilarga ko'rsatiladi.\nTekshiruv muvaffaqiyatsiz: Tekshiruv tugagandan so'ng, tizim sarflangan %@ tangalarni avtomatik ravishda qaytaradi. Shu bilan birga, siz tizim xabarnomasini olasiz.\n4 Qaytarilmaydigan operatsiya: E'tibor bering, dinamik avatar tekshirib olingan va kuchga kiritilganidan keyin, uni oldingi avatarga qaytarib bo'lmaydi.\n";
"20.20.51_text_28" = "Ko'rish vaqti: %@"; "20.20.51_text_28" = "Ko'rish vaqti: %@";
"20.20.51_text_29" = "Almazlar soni 1000 ning multiplei bo'lishi kerak"; "20.20.51_text_29" = "Almazlar soni 1000 ning multiplei bo'lishi kerak";
"20.20.51_text_30" = "Video davomiyligi 10 soniyadan oshmasligi kerak.";
"20.20.56_text_1" = "Joriy mosliklar soni etarli emas, moslik muvaffaqiyatsiz tugadi. Qayta moslashasizmi?"; "20.20.56_text_1" = "Joriy mosliklar soni etarli emas, moslik muvaffaqiyatsiz tugadi. Qayta moslashasizmi?";
"20.20.56_text_2" = "Moslik muvaffaqiyatsiz tugadi, sarflangan tangalar hamyoningizga qaytarildi"; "20.20.56_text_2" = "Moslik muvaffaqiyatsiz tugadi, sarflangan tangalar hamyoningizga qaytarildi";

View File

@@ -3597,6 +3597,7 @@
"20.20.51_text_27" = "1 每次上傳動態頭像,系統都會從您的帳戶中扣除%@金幣。請確保您的帳戶餘額充足。\n2 審核流程:上傳完成後,系統自動進入審核流程。在此期間,請勿再次上傳新頭像,以免影響審核進度。\n3 審核結果: \n審核通過您的新動態頭像將立即生效並顯示給其他使用者。\n審核失敗審核完成後系統將自動退還您花費的%@金幣。同時,您也會收到系統通知。\n4 不可逆操作:請注意,動態頭像一旦審核並生效,將無法恢復為先前的頭像。\n"; "20.20.51_text_27" = "1 每次上傳動態頭像,系統都會從您的帳戶中扣除%@金幣。請確保您的帳戶餘額充足。\n2 審核流程:上傳完成後,系統自動進入審核流程。在此期間,請勿再次上傳新頭像,以免影響審核進度。\n3 審核結果: \n審核通過您的新動態頭像將立即生效並顯示給其他使用者。\n審核失敗審核完成後系統將自動退還您花費的%@金幣。同時,您也會收到系統通知。\n4 不可逆操作:請注意,動態頭像一旦審核並生效,將無法恢復為先前的頭像。\n";
"20.20.51_text_28" = "访客時間:%@"; "20.20.51_text_28" = "访客時間:%@";
"20.20.51_text_29" = "鑽石數量需要是 %@ 的倍數"; "20.20.51_text_29" = "鑽石數量需要是 %@ 的倍數";
"20.20.51_text_30" = "視頻時長不能超過 10 秒";
"20.20.56_text_1" = "目前的匹配次數不足,匹配失敗。再次匹配?"; "20.20.56_text_1" = "目前的匹配次數不足,匹配失敗。再次匹配?";
"20.20.56_text_2" = "匹配失敗,您消耗的硬幣已返回您的錢包"; "20.20.56_text_2" = "匹配失敗,您消耗的硬幣已返回您的錢包";

View File

@@ -1,98 +0,0 @@
# 当前用户切换 mic 时云信消息发送流程
## 修复后的完整流程
```
1. 用户切换 mic (位置A → 位置B)
2. 接收云信通知 NIMChatroomEventTypeQueueChange
- 下麦通知 (changeType == 2)
- 上麦通知 (changeType == 1)
3. 调用 handleMicChangeForCP:queue
4. 在 handleMicChangeForCP 中执行:
a) updateCurrentUserMicStatus:queue
- 检测到麦位变化
- 设置 currentUserMicStatusChanged = YES
b) updateMicMidpointRectManagerSnapshot
c) handleDownMicEventIfNeeded:queue
d) handleMicSwitchScenarioIfNeeded:queue
- 检测到 currentUserMicStatusChanged = YES
- 清除所有CP关系
- 重新构建CP关系
- 🔧 不重置状态标志(关键修复)
e) callMicCpListByUidListOnMicChangeWithQueue:queue
- 调用 micCpListByUidList API
5. API 成功回调 getMicCpListByUidListSuccess:cpList
6. 在 getMicCpListByUidListSuccess 中:
a) 更新 CP 缓存
b) 刷新绘制
c) 检查 currentUserMicStatusChanged = YES
d) 🔧 发送云信消息 sendMicRelationshipNIMessage:cpList
e) 重置状态标志 currentUserMicStatusChanged = NO
7. 其他用户收到云信消息更新CP关系
```
## 关键修复点
### 修复前的问题
- `handleMicSwitchScenarioIfNeeded` 中提前重置 `currentUserMicStatusChanged = NO`
- API 成功回调时状态标志已经是 `NO`
- 无法发送云信消息
### 修复后的逻辑
- `handleMicSwitchScenarioIfNeeded` 中不重置状态标志
- 状态标志保持 `YES` 直到 API 成功回调
- API 成功回调时正确发送云信消息
- 发送消息后重置状态标志
## 代码修改
### 修改前
```objc
// 在 handleMicSwitchScenarioIfNeeded 中
if (hasMicPositionChanged) {
// 处理麦位变化场景
[midpointRectManager removeAllMidpointRects];
[midpointRectManager rebuildMicSnapshotWithStageView:self.stageView micCount:micCount];
[self drawSocialStageMidpointRects];
// ❌ 提前重置状态标志
self.currentUserMicStatusChanged = NO;
}
```
### 修改后
```objc
// 在 handleMicSwitchScenarioIfNeeded 中
if (hasMicPositionChanged) {
// 处理麦位变化场景
[midpointRectManager removeAllMidpointRects];
[midpointRectManager rebuildMicSnapshotWithStageView:self.stageView micCount:micCount];
[self drawSocialStageMidpointRects];
// ✅ 不在这里重置状态标志等待API成功回调后再重置
// 状态标志将在 getMicCpListByUidListSuccess 中重置,确保能发送云信消息
}
```
## 验证要点
1. **当前用户切换mic时**
- ✅ 正确检测到麦位状态变化
- ✅ 重新构建所有CP关系
- ✅ 调用 micCpListByUidList API
- ✅ API成功回调时发送云信消息
- ✅ 状态标志在发送消息后正确重置
2. **其他用户切换mic时**
- ✅ 通过 handleOtherUserMicChange 处理
- ✅ 不发送云信消息(由切换用户发送)
3. **边界情况**
- ✅ 当前用户不在麦上时清理CP数据
- ✅ 只有当前用户一个人时清理CP数据