FloatJSWindow.m 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. //
  2. // FloatingWindow.m
  3. // AIIM
  4. //
  5. // Created by gan on 2025/7/9.
  6. //
  7. #import <Foundation/Foundation.h>
  8. #import "FloatJSWindow.h"
  9. #import "APPLocker.h"
  10. #import "GDBManager.h"
  11. #import "UserNetApi.h"
  12. #import "GWebSocket.h"
  13. @interface FloatJSWindow ()<JitsiMeetViewDelegate>
  14. @property (nonatomic,strong) JitsiMeetView *jitsiView;
  15. @property (nonatomic, strong) JitsiMeetConferenceOptions * currentOptions;
  16. @property (nonatomic, assign) NSUInteger reconnectAttempt;
  17. @property (nonatomic, assign) BOOL isInConference;
  18. @property (nonatomic, assign) BOOL isReconnecting;
  19. @property (nonatomic) BOOL isSpeacker;
  20. @property (nonatomic) BOOL isjoin;
  21. @property (nonatomic) BOOL floadViewState;
  22. @property (nonatomic,strong) AVAudioPlayer * audioPlayer;
  23. @property (nonatomic) NSInteger startTime;
  24. @end
  25. @implementation FloatJSWindow {
  26. }
  27. - (instancetype)initWithFrame:(CGRect)frame {
  28. self = [super initWithFrame:frame];
  29. if (self) {
  30. self.backgroundColor = [UIColor clearColor];
  31. self.isfirstShow=YES;
  32. UIImageView * bgImageView = [[UIImageView alloc] initWithImage:kImageMake(@"loginBG")];
  33. [self addSubview:bgImageView];
  34. [bgImageView mas_makeConstraints:^(MASConstraintMaker *make) {
  35. make.left.right.top.bottom.mas_equalTo(0);
  36. }];
  37. _jitsiView = [(JitsiMeetView*)[UIView alloc] initWithFrame:frame];
  38. [self addSubview:_jitsiView];
  39. _jitsiView.delegate = self;
  40. }
  41. return self;
  42. }
  43. - (void)show {
  44. self.hidden = NO;
  45. }
  46. - (void)hide {
  47. self.hidden = YES;
  48. }
  49. #pragma mark JitsiMeetView act
  50. -(void)initjsView{
  51. // Attach this controller as the delegate.
  52. JitsiMeetConferenceOptions *options=nil;
  53. if(self.isCaller){
  54. // create the room.JitsiMeetConferenceOptions
  55. options = [JitsiMeetConferenceOptions fromBuilder:^(JitsiMeetConferenceOptionsBuilder *builder) {
  56. builder.serverURL = [NSURL URLWithString:JitsiMeetSV];
  57. builder.room = self.room;
  58. builder.audioOnly = self.audioOnly;
  59. [builder setFeatureFlag:@"welcomepage.enabled" withBoolean:NO];
  60. [builder setFeatureFlag:@"pip.enabled" withBoolean:YES];
  61. [builder setFeatureFlag:@"ios.screensharing.enabled" withBoolean:YES];
  62. [builder setFeatureFlag:@"chat.enabled" withBoolean:NO];
  63. [builder setFeatureFlag:@"invite.enabled" withBoolean:NO];
  64. [builder setFeatureFlag:@"add-people.enabled" withBoolean:NO];
  65. [builder setFeatureFlag:@"video-share.enabled" withBoolean:NO];
  66. [builder setFeatureFlag:@"call-integration.enabled" withBoolean:NO];
  67. [builder setFeatureFlag:@"startWithAudioMuted" withBoolean:NO];
  68. [builder setFeatureFlag:@"prejoinpage.enabled" withBoolean:NO];
  69. [builder setFeatureFlag:@"reconnect.enabled" withBoolean:YES];
  70. [builder setConfigOverride:@"iceTransportPolicy" withValue:@"relay"];
  71. [builder setConfigOverride:@"enableNetworkMonitor" withBoolean:YES];
  72. [builder setConfigOverride:@"toolbarButtons" withArray:@[@"microphone",@"camera"]];
  73. // //界面优化 - 隐藏不必要的会议功能
  74. // [builder setFeatureFlag:@"live-streaming.enabled" withBoolean:NO];
  75. // [builder setFeatureFlag:@"recording.enabled" withBoolean:NO];
  76. // [builder setFeatureFlag:@"kick-out.enabled" withBoolean:NO];
  77. // [builder setFeatureFlag:@"security-options.enabled" withBoolean:NO];
  78. //
  79. // // 界面简化 - 更适合一对一场景
  80. // [builder setFeatureFlag:@"toolbox.alwaysVisible" withBoolean:NO];
  81. // [builder setFeatureFlag:@"filmstrip.enabled" withBoolean:NO];
  82. // [builder setFeatureFlag:@"thumbnail.enabled" withBoolean:NO];
  83. // [builder setFeatureFlag:@"disableRtx" withBoolean:YES];// 一对一不需要RTX
  84. // [builder setFeatureFlag:@"disableNS" withBoolean:YES]; // 降噪可关闭
  85. //
  86. // [builder setFeatureFlag:@"ios.audio-handler" withBoolean:NO];
  87. [builder setConfigOverride:@"toolbarButtons" withArray:@[@"microphone",@"camera"]];
  88. }];
  89. }
  90. else{
  91. // Join the room.
  92. options
  93. = [JitsiMeetConferenceOptions fromBuilder:^(JitsiMeetConferenceOptionsBuilder *builder) {
  94. builder.room = self.room;
  95. builder.audioOnly = self.audioOnly;
  96. [builder setFeatureFlag:@"welcomepage.enabled" withBoolean:NO];
  97. [builder setFeatureFlag:@"pip.enabled" withBoolean:YES];
  98. [builder setFeatureFlag:@"ios.screensharing.enabled" withBoolean:YES];
  99. [builder setFeatureFlag:@"chat.enabled" withBoolean:NO];
  100. [builder setFeatureFlag:@"invite.enabled" withBoolean:NO];
  101. [builder setFeatureFlag:@"add-people.enabled" withBoolean:NO];
  102. [builder setFeatureFlag:@"video-share.enabled" withBoolean:NO];
  103. [builder setFeatureFlag:@"call-integration.enabled" withBoolean:NO];
  104. [builder setFeatureFlag:@"startWithAudioMuted" withBoolean:NO];
  105. [builder setFeatureFlag:@"prejoinpage.enabled" withBoolean:NO];
  106. [builder setFeatureFlag:@"reconnect.enabled" withBoolean:YES];
  107. [builder setConfigOverride:@"iceTransportPolicy" withValue:@"relay"];
  108. [builder setConfigOverride:@"enableNetworkMonitor" withBoolean:YES];
  109. [builder setConfigOverride:@"toolbarButtons" withArray:@[@"microphone",@"camera"]];
  110. }];
  111. }
  112. self.currentOptions = options;
  113. }
  114. - (void)conferenceWillJoin:(NSDictionary *)data {
  115. NSLog(@"About to join conference---- %@", self.room);
  116. self.isInConference = NO;
  117. if (self.isCaller) {
  118. // [self sendCall];
  119. }
  120. else{
  121. NSLog(@"self.audioPlayer-----------");
  122. // [self.audioPlayer play];
  123. }
  124. if (!self.audioOnly) {
  125. // [self setupPictureInPicture];
  126. }
  127. // [[AudioRouteManager sharedManager] setOutputToEarpiece];
  128. }
  129. - (void)conferenceJoined:(NSDictionary *)data {
  130. _reconnectAttempt = 0;
  131. _isInConference = YES;
  132. NSLog(@"Conference %@ joined----11222-------", self.room);
  133. if(!self.isCaller){
  134. [self.audioPlayer stop];
  135. }
  136. }
  137. - (void)conferenceTerminated:(NSDictionary *)data {
  138. NSLog(@"conferenceTerminated----------------------");
  139. _isInConference = NO;
  140. NSString *error = data[@"error"];
  141. if (error) {
  142. if ([error isEqualToString:@"connection.otherError"]) {
  143. // [self reconnectConference];
  144. } else {
  145. NSLog(@"%@",error);
  146. }
  147. }
  148. }
  149. - (void)readyToClose:(NSDictionary *)data {
  150. NSLog(@"readyToClose-----:%@",data);
  151. if (_isReconnecting) {
  152. return;
  153. }
  154. // [self endCall];
  155. [_jitsiView closeChat];
  156. // [self dismissViewControllerAnimated:YES completion:nil];
  157. }
  158. - (void)customButtonPressed:(NSDictionary *)data {
  159. NSLog(@"---------Custom button pressed %@", data);
  160. }
  161. -(void)participantJoined:(NSDictionary *)data{
  162. NSLog(@"------1-------participantJoined");
  163. if(_startTime==0){
  164. NSDate *now = [NSDate date];
  165. NSTimeInterval trt = [now timeIntervalSince1970];
  166. _startTime = trt*1000;
  167. }
  168. [self.audioPlayer stop];
  169. // 使用GCD创建一个在3秒后执行的定时器
  170. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  171. NSLog(@"Timer fired using GCD!");
  172. [self inispeacker];
  173. });
  174. }
  175. - (void)participantLeft:(NSDictionary *)data{
  176. NSLog(@"participantLeft:%@",data);
  177. //p2p 一方退出,就挂掉
  178. // [self endCall];
  179. [_jitsiView closeChat];
  180. // [self dismissViewControllerAnimated:YES completion:nil];
  181. }
  182. -(void)inispeacker{
  183. if(self.audioOnly){
  184. _isSpeacker=NO;
  185. [_jitsiView changeAudioSession:NO];
  186. }
  187. else{
  188. _isSpeacker=YES;
  189. [_jitsiView changeAudioSession:YES];
  190. }
  191. }
  192. @end