# Send emoji reactions > The code on this page works with either the **default UI** or the **custom UI**. The code on this page works with either the default UI or the custom UI. Send and receive emoji reactions and feedback with the SDK through the `ZoomSDKReactionController`. ```swift if let reactionCtrl = ZoomSDK.shared().getMeetingService()?.getReactionController() { } ``` ```objectivec ZoomSDKReactionController *reactionCtrl = [[[ZoomSDK sharedSDK] getMeetingService] ZoomSDKReactionController *reactionCtrl = [[[ZoomSDK sharedSDK] getMeetingService] getReactionController]; if (reactionCtrl) { } ``` To send reactions, first check that reactions are supported in the current meeting. Then, use `sendEmojiReaction`. ```swift if reactionCtrl.isEmojiReactionEnabled() { reactionCtrl.send(ZoomSDKEmojiReactionType_Clap) } ``` ```objectivec if (reactionCtrl.isEmojiReactionEnabled) { [reactionCtrl sendEmojiReaction: ZoomSDKEmojiReactionType_Clap]; } ``` ## Supported emojis and feedback The `ZoomSDKEmojiReactionType` enum currently supports only these unicode emojis. - `ZoomSDKEmojiReactionType_Clap` - `ZoomSDKEmojiReactionType_Thumbsup` - `ZoomSDKEmojiReactionType_Heart` - `ZoomSDKEmojiReactionType_Joy` - `ZoomSDKEmojiReactionType_Openmouth` - `ZoomSDKEmojiReactionType_Tada` Emoji feedback is also supported, but is done through a separate method. ```swift reactionCtrl.send(ZoomSDKEmojiFeedbackType_Yes) ``` ```objectivec [reactionCtrl sendEmojiFeedback:ZoomSDKEmojiFeedbackType_Yes]; ``` These feedback types are supported. - `ZoomSDKEmojiFeedbackType_Yes` - `ZoomSDKEmojiFeedbackType_No` - `ZoomSDKEmojiFeedbackType_SpeedUp` - `ZoomSDKEmojiFeedbackType_SlowDown` - `ZoomSDKEmojiFeedbackType_Away` ## Get reaction and feedback updates To get updates related to emoji reaction and feedback, implement the `ZoomSDKReactionControllerDelegate` protocol and set the delegate in `ZoomSDKReactionController`. ```swift if let reactionCtrl = ZoomSDK.shared().getMeetingService()?.getReactionController() { reactionCtrl.delegate = self } extension ViewController: ZoomSDKReactionControllerDelegate { func onEmojiReactionReceived(_ userid: UInt32, reactionType type: ZoomSDKEmojiReactionType, reactionSkinTone skinTone: ZoomSDKEmojiReactionSkinTone) { } func onEmojiReactionReceived(inWebinar type: ZoomSDKEmojiReactionType) { } func onEmojiFeedbackReceived(_ userid: UInt32, emojiFeedbackType type: ZoomSDKEmojiFeedbackType) { } func onEmojiFeedbackCanceled(_ userid: UInt32) { } } ``` ```objectivec // In your .h file @interface ZMSDKTestWindow : NSWindowController { } // In your .m file ZoomSDKReactionController *reactionCtrl = [[[ZoomSDK sharedSDK] getMeetingService] getReactionController]; if (!reactionCtrl) { reactionCtrl.delegate = self; } } - (void) onEmojiReactionReceivedInWebinar:(ZoomSDKEmojiReactionType)type { } - (void) onEmojiReactionReceived:(unsigned int)userid reactionType:(ZoomSDKEmojiReactionType)type reactionSkinTone:(ZoomSDKEmojiReactionSkinTone)skinTone { } - (void) onEmojiFeedbackReceived:(unsigned int)userid emojiFeedbackType:(ZoomSDKEmojiFeedbackType)type { } - (void) onEmojiFeedbackCanceled:(unsigned int)userid { } ``` These callbacks are triggered when any participant sends a reaction or feedback in a meeting with the user ID of the participant who sent or canceled the reaction or feedback. Additionally, there is a dedicated callback for when reactions are sent by webinar attendees anonymously. ---