No Description

RCTAgora.m 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. //
  2. // RCTAgora.m
  3. // RCTAgora
  4. //
  5. // Created by 邓博 on 2017/6/13.
  6. // Copyright © 2017年 Syan. All rights reserved.
  7. //
  8. #import "RCTAgora.h"
  9. #import <React/RCTEventDispatcher.h>
  10. #import <React/RCTBridge.h>
  11. #import <React/RCTUIManager.h>
  12. #import <React/RCTView.h>
  13. #import "AgoraConst.h"
  14. @interface RCTAgora ()
  15. @property (strong, nonatomic) AgoraRtcEngineKit *rtcEngine;
  16. @end
  17. @implementation RCTAgora
  18. RCT_EXPORT_MODULE();
  19. @synthesize bridge = _bridge;
  20. //销毁引擎实例
  21. - (void)dealloc {
  22. [AgoraRtcEngineKit destroy];
  23. }
  24. //导出常量
  25. - (NSDictionary *)constantsToExport {
  26. return @{};
  27. }
  28. /**
  29. * 初始化AgoraKit
  30. *
  31. * @param appid
  32. * @param channelProfile 设置频道模式
  33. * @param videoProfile 视频模式
  34. * @param clientRole 创建角色
  35. * @param channelName 频道名称
  36. * @param info 附加字段
  37. * @param reactTag 绑定view的tag
  38. * @return 0 when executed successfully. return negative value if failed.
  39. */
  40. RCT_EXPORT_METHOD(init:(NSDictionary *)options) {
  41. [AgoraConst share].appid = options[@"appid"];
  42. self.rtcEngine = [AgoraRtcEngineKit sharedEngineWithAppId:options[@"appid"] delegate:self];
  43. //频道模式
  44. [self.rtcEngine setChannelProfile:[options[@"channelProfile"] integerValue]];
  45. //启用双流模式
  46. [self.rtcEngine enableDualStreamMode:YES];
  47. [self.rtcEngine enableVideo];
  48. [self.rtcEngine setVideoProfile:[options[@"videoProfile"] integerValue]swapWidthAndHeight:YES];
  49. [self.rtcEngine setClientRole:[options[@"clientRole"] integerValue] withKey:nil];
  50. //开启预览
  51. [self.rtcEngine startPreview];
  52. //Agora Native SDK 与 Agora Web SDK 间的互通
  53. [self.rtcEngine enableWebSdkInteroperability:YES];
  54. }
  55. //加入房间
  56. RCT_EXPORT_METHOD(joinChannel:(NSString *)channelName) {
  57. [self.rtcEngine joinChannelByKey:nil channelName:channelName info:nil uid:0 joinSuccess:NULL];
  58. }
  59. //离开频道
  60. RCT_EXPORT_METHOD(leaveChannel){
  61. [self.rtcEngine leaveChannel:^(AgoraRtcStats *stat) {
  62. NSMutableDictionary *params = @{}.mutableCopy;
  63. params[@"type"] = @"onLeaveChannel";
  64. [self sendEvent:params];
  65. }];
  66. }
  67. //设置 本地 视频显示属性
  68. RCT_EXPORT_METHOD(setupLocalVideo:(NSDictionary *)options){
  69. AgoraRtcVideoCanvas *canvas = [[AgoraRtcVideoCanvas alloc] init];
  70. canvas.uid = [options[@"uid"] integerValue];
  71. canvas.view = [self.bridge.uiManager viewForReactTag:options[@"reactTag"]];
  72. canvas.renderMode = [options[@"renderMode"] integerValue];
  73. [self.rtcEngine setupLocalVideo:canvas];
  74. }
  75. //设置 远端 视频显示视图
  76. RCT_EXPORT_METHOD(setupRemoteVideo:(NSDictionary *)options){
  77. AgoraRtcVideoCanvas *canvas = [[AgoraRtcVideoCanvas alloc] init];
  78. canvas.uid = [options[@"uid"] integerValue];
  79. canvas.view = [self.bridge.uiManager viewForReactTag:options[@"reactTag"]];
  80. canvas.renderMode = [options[@"renderMode"] integerValue];
  81. [self.rtcEngine setupRemoteVideo:canvas];
  82. }
  83. //切换前置/后置摄像头
  84. RCT_EXPORT_METHOD(switchCamera){
  85. [self.rtcEngine switchCamera];
  86. }
  87. //开启视频模式
  88. RCT_EXPORT_METHOD(enableVideo){
  89. [self.rtcEngine enableVideo];
  90. }
  91. //关闭视频
  92. RCT_EXPORT_METHOD(disableVideo){
  93. [self.rtcEngine disableVideo];
  94. }
  95. //开启扬声器 Yes: 音频输出至扬声器 No: 音频输出至听筒
  96. RCT_EXPORT_METHOD(setEnableSpeakerphone:(BOOL)enableSpeaker){
  97. [self.rtcEngine setEnableSpeakerphone: enableSpeaker];
  98. }
  99. //将自己静音
  100. RCT_EXPORT_METHOD(muteLocalAudioStream:(BOOL)mute){
  101. [self.rtcEngine muteLocalAudioStream:mute];
  102. }
  103. //静音所有远端 音频
  104. RCT_EXPORT_METHOD(muteAllRemoteAudioStreams:(BOOL)mute){
  105. [self.rtcEngine muteAllRemoteAudioStreams:mute];
  106. }
  107. //静音指定用户 音频
  108. RCT_EXPORT_METHOD(muteRemoteAudioStream:(NSUInteger)uid muted:(BOOL)mute){
  109. [self.rtcEngine muteRemoteAudioStream:uid mute:mute];
  110. }
  111. //暂停发送本地 视频流
  112. RCT_EXPORT_METHOD(muteLocalVideoStream:(BOOL)muted){
  113. [self.rtcEngine muteLocalVideoStream:muted];
  114. }
  115. //禁用本地视频功能
  116. RCT_EXPORT_METHOD(enableLocalVideo:(BOOL)enabled){
  117. [self.rtcEngine enableLocalVideo:enabled];
  118. }
  119. //暂停所有远端视频流
  120. RCT_EXPORT_METHOD(muteAllRemoteVideoStreams:(BOOL)muted){
  121. [self.rtcEngine muteAllRemoteVideoStreams:muted];
  122. }
  123. //暂停指定远端视频流
  124. RCT_EXPORT_METHOD(muteRemoteVideoStream:(NSUInteger)uid mute:(BOOL)mute){
  125. [self.rtcEngine muteRemoteVideoStream:uid mute:mute];
  126. }
  127. //启动服务端录制服务
  128. RCT_EXPORT_METHOD(startRecordingService:(NSString*)recordingKey){
  129. [self.rtcEngine startRecordingService:recordingKey];
  130. }
  131. //停止服务端录制服务
  132. RCT_EXPORT_METHOD(stopRecordingService:(NSString*)recordingKey){
  133. [self.rtcEngine stopRecordingService:recordingKey];
  134. }
  135. //获取版本号
  136. RCT_EXPORT_METHOD(getSdkVersion:(RCTResponseSenderBlock)callback){
  137. callback(@[[AgoraRtcEngineKit getSdkVersion]]);
  138. }
  139. /*
  140. 该回调方法表示SDK运行时出现了(网络或媒体相关的)错误。通常情况下,SDK上报的错误意味着SDK无法自动恢复,需要应用程序干预或提示用户。
  141. 比如启动通话失败时,SDK会上报AgoraRtc_Error_StartCall(1002)错误。
  142. 应用程序可以提示用户启动通话失败,并调用leaveChannel退出频道。
  143. */
  144. - (void)rtcEngine:(AgoraRtcEngineKit *)engine didOccurError:(AgoraRtcErrorCode)errorCode{
  145. NSMutableDictionary *params = @{}.mutableCopy;
  146. params[@"type"] = @"onError";
  147. params[@"err"] = [NSNumber numberWithInteger:errorCode];;
  148. [self sendEvent:params];
  149. }
  150. /*
  151. 警告
  152. */
  153. - (void)rtcEngine:(AgoraRtcEngineKit *)engine didOccurWarning:(AgoraRtcWarningCode)warningCode {
  154. NSMutableDictionary *params = @{}.mutableCopy;
  155. params[@"type"] = @"onWarning";
  156. params[@"err"] = [NSNumber numberWithInteger:warningCode];;
  157. [self sendEvent:params];
  158. }
  159. /*
  160. 客户端成功加入了指定的频道
  161. */
  162. - (void)rtcEngine:(AgoraRtcEngineKit *)engine didJoinChannel:(NSString*)channel withUid:(NSUInteger)uid elapsed:(NSInteger) elapsed {
  163. NSMutableDictionary *params = @{}.mutableCopy;
  164. params[@"type"] = @"onJoinChannelSuccess";
  165. params[@"uid"] = [NSNumber numberWithInteger:uid];
  166. params[@"channel"] = channel;
  167. [self sendEvent:params];
  168. }
  169. /*
  170. 远端首帧视频接收解码回调
  171. */
  172. - (void)rtcEngine:(AgoraRtcEngineKit *)engine firstRemoteVideoDecodedOfUid:(NSUInteger)uid size:(CGSize)size elapsed:(NSInteger)elapsed {
  173. NSMutableDictionary *params = @{}.mutableCopy;
  174. params[@"type"] = @"onFirstRemoteVideoDecoded";
  175. params[@"uid"] = [NSNumber numberWithInteger:uid];
  176. [self sendEvent:params];
  177. }
  178. /*
  179. 用户加入回调
  180. */
  181. - (void)rtcEngine:(AgoraRtcEngineKit *)engine didJoinedOfUid:(NSUInteger)uid elapsed:(NSInteger)elapsed {
  182. NSMutableDictionary *params = @{}.mutableCopy;
  183. params[@"type"] = @"onUserJoined";
  184. params[@"uid"] = [NSNumber numberWithInteger:uid];
  185. [self sendEvent:params];
  186. }
  187. /*
  188. 用户离线回调
  189. */
  190. - (void)rtcEngine:(AgoraRtcEngineKit *)engine didOfflineOfUid:(NSUInteger)uid reason:(AgoraRtcUserOfflineReason)reason {
  191. NSMutableDictionary *params = @{}.mutableCopy;
  192. params[@"type"] = @"onUserOffline";
  193. params[@"uid"] = [NSNumber numberWithInteger:uid];
  194. [self sendEvent:params];
  195. }
  196. - (void)sendEvent:(NSDictionary *)params {
  197. [_bridge.eventDispatcher sendDeviceEventWithName:@"agoraEvent" body:params];
  198. }
  199. - (dispatch_queue_t)methodQueue {
  200. return dispatch_get_main_queue();
  201. }
  202. //RCT_EXPORT_METHOD(getViewWithTag:(nonnull NSNumber *)reactTag) {
  203. //
  204. // UIView *view = [self.bridge.uiManager viewForReactTag:reactTag];
  205. // NSLog(@"%@",view);
  206. //
  207. //}
  208. @end