{"id":18438238,"url":"https://github.com/easemob/livestream_demo_ios","last_synced_at":"2025-04-07T20:35:15.985Z","repository":{"id":42416699,"uuid":"61516918","full_name":"easemob/livestream_demo_ios","owner":"easemob","description":"直播demo iOS","archived":false,"fork":false,"pushed_at":"2023-02-09T04:03:32.000Z","size":101396,"stargazers_count":49,"open_issues_count":0,"forks_count":27,"subscribers_count":12,"default_branch":"main","last_synced_at":"2024-04-13T16:05:29.023Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/easemob.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-06-20T04:31:25.000Z","updated_at":"2022-01-06T07:13:25.000Z","dependencies_parsed_at":"2022-09-21T19:01:13.648Z","dependency_job_id":null,"html_url":"https://github.com/easemob/livestream_demo_ios","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easemob%2Flivestream_demo_ios","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easemob%2Flivestream_demo_ios/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easemob%2Flivestream_demo_ios/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easemob%2Flivestream_demo_ios/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/easemob","download_url":"https://codeload.github.com/easemob/livestream_demo_ios/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223292179,"owners_count":17121090,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-06T06:19:09.605Z","updated_at":"2024-11-06T06:19:12.862Z","avatar_url":"https://github.com/easemob.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 简介 #\n本demo演示了通过环信sdk以及环信appServer实现的直播聊天室\n\n## 怎么使用本demo ##\n- 首先在EaseMobLiveDemo文件夹下执行pod install,集成环信sdk\n- 初次进入app时会自动注册一个UUID游客账号，默认密码000000，注册成功自动登录，自动登录完成跳转到主页面\n- 点击主页底部“我要直播”蓝色按钮，可创建一个直播间，键入封面图以及本次直播主题后，点击“开始直播”开启一场直播，直播间即出现在“直播大厅”列表，其他游客即可从“直播大厅”进入直播间\n- 游客点击直播大厅任一直播间即可进入该直播间观看直播，直播间内目前可以发聊天消息、给主播点赞，给主播刷礼物，发弹幕消息等，当前直播间聊天室观众均可收到消息动画\n\n## 功能实现 ##\n\n\n### 创建直播聊天室\n**具体演示代码见EaseLiveTVListViewController,EaseCreateLiveViewController,EasePublishViewController,EaseHttpManager**\n\n1、创建直播聊天室\n```\n/*\n *  创建直播聊天室\n *\n *  @param aRoom            直播聊天室\n *  @param aCompletion      完成的回调block\n */\n- (void)createLiveRoomWithRoom:(EaseLiveRoom*)aRoom\n                    completion:(void (^)(EaseLiveRoom *room, BOOL success))aCompletion;\n```\n2、创建成功后设置当前将要直播的直播聊天室为“ongoing”正直播状态\n\n```\n/*\n*  更新直播间状态为ongoing\n*\n*  @param aRoom            直播间\n*  @param aCompletion      完成的回调block\n*/\n- (void)modifyLiveroomStatusWithOngoing:(EaseLiveRoom *)room\n                             completion:(void (^)(EaseLiveRoom *room, BOOL success))aCompletion;\n```\n\n3、加入聊天室\n\n```\n/*\n *  用户加入直播聊天室\n *\n *  @param aRoomId          直播聊天室ID\n *  @param aChatroomId      聊天室ID\n *  @param aIsCount         是否计数\n *  @param aCompletion      完成的回调block\n */\n- (void)joinLiveRoomWithRoomId:(NSString*)aRoomId\n                    chatroomId:(NSString*)aChatroomId\n                       isCount:(BOOL)aIsCount\n                       completion:(void (^)(BOOL success))aCompletion;\n```\n4、设置消息监听\n\n```\n\t [[EMClient sharedClient].chatManager addDelegate:self delegateQueue:nil];\n\t \n\t- (void)messagesDidReceive:(NSArray *)aMessages\n\t{\n\t//收到普通消息\n\t}\n\n\t- (void)cmdMessagesDidReceive:(NSArray *)aCmdMessages\n\t{\n\t//收到cmd消息\n\t}\n```\n5、发送消息\n\n```\nEMTextMessageBody *body = [[EMTextMessageBody alloc] initWithText:@\"发送内容\"];\nNSString *from = [[EMClient sharedClient] currentUsername];\nEMMessage *message = [[EMMessage alloc] initWithConversationID:aChatroomId from:from to:aChatroomId body:body ext:nil];\nmessage.chatType = EMChatTypeChatRoom;\n[[EMClient sharedClient].chatManager asyncSendMessage:message progress:nil completion:^(EMMessage *message, EMError *error) {\n\tif (!error) {\n\t//消息发送成功\n\t}\n}];   \n``` \n6、从appServer获取直播聊天室详情并获取成员列表\n\n```\n/*\n*  获取直播聊天室详情\n*\n*  @param aRoom            直播聊天室\n*  @param aCompletion      完成的回调block\n*/\n- (void)fetchLiveroomDetail:(NSString *)roomId completion:(void (^)(EaseLiveRoom *room, BOOL success))aCompletion;\n```\n7、获取直播聊天室禁言列表\n\n```\n/*!\n *  获取聊天室被禁言列表\n *\n *  @param aChatroomId      聊天室ID\n *  @param aPageNum         获取第几页\n *  @param aPageSize        获取多少条\n *  @param aCompletionBlock 完成的回调\n */\n- (void)getChatroomMuteListFromServerWithId:(NSString *)aChatroomId\n                                 pageNumber:(NSInteger)aPageNum\n                                   pageSize:(NSInteger)aPageSize\n                                   completion:(void (^)(NSArray *aList, EMError *aError))aCompletionBlock;\n```\n8、直播聊天室某观众解除禁言\n\n```\n/*!\n *  解除禁言，需要Owner / Admin权限\n *\n *  @param aMuteMembers     被解除的列表\u003cNSString\u003e\n *  @param aChatroomId      聊天室ID\n *  @param aCompletionBlock 完成的回调\n */\n- (void)unmuteMembers:(NSArray *)aMembers\n                 fromChatroom:(NSString *)aChatroomId\n                 completion:(void (^)(EMChatroom *aChatroom, EMError *aError))aCompletionBlock;\n```\n9、获取直播聊天室白名单列表\n\n```\n/*!\n *  获取聊天室白名单列表\n *\n *  @param aChatroomId      聊天室ID\n *  @param aCompletionBlock 完成的回调\n */\n- (void)getChatroomWhiteListFromServerWithId:(NSString *)aChatroomId\n        completion:(void (^)(NSArray *aList, EMError *aError))aCompletionBlock;\n```\n10、直播聊天室从白名单移除成员\n\n```\n/*!\n *  移除白名单，需要Owner / Admin权限\n *\n *  @param aMembers         被移除的列表\u003cNSString\u003e\n *  @param aChatroomId      聊天室ID\n *  @param aCompletionBlock 完成的回调\n */\n- (void)removeWhiteListMembers:(NSArray *)aMembers\n                  fromChatroom:(NSString *)aChatroomId\n                  completion:(void (^)(EMChatroom *aChatroom, EMError *aError))aCompletionBlock;\n```\n11、直播聊天室全体禁言\n\n```\n/*!\n *  设置全员禁言，需要Owner / Admin权限\n *\n *  @param aChatroomId      聊天室ID\n *  @param aCompletionBlock 完成的回调\n */\n- (void)muteAllMembersFromChatroom:(NSString *)aChatroomId\n                  completion:(void(^)(EMChatroom *aChatroom, EMError *aError))aCompletionBlock;\n```\n12、直播聊天室解除全体禁言\n\n```\n/*!\n *  解除全员禁言，需要Owner / Admin权限\n *\n *  同步方法，会阻塞当前线程\n *\n *  @param aChatroomId      聊天室ID\n *  @param pError           错误信息\n *\n *  @result    聊天室实例\n */\n- (EMChatroom *)unmuteAllMembersFromChatroom:(NSString *)aChatroomId\n                  error:(EMError **)pError;\n```\n- 直播聊天室全体禁言与观众禁言列表没有直接关系，互不影响\n\n13、离开聊天室并设置当前直播聊天室为“Offline”未直播状态，结束直播\n\n```\n/*\n *  用户离开直播聊天室\n *\n *  @param aRoomId          直播聊天室ID\n *  @param aChatroomId      聊天室ID\n *  @param aIsCount         是否计数\n *  @param aCompletion      完成的回调block\n */\n- (void)leaveLiveRoomWithRoomId:(NSString*)aRoomId\n                     chatroomId:(NSString*)aChatroomId\n                        isCount:(BOOL)aIsCount\n                        completion:(void (^)(BOOL success))aCompletion;\n                        \n- 更新直播聊天室状态为Offline\n/*\n*  更新直播间状态为offline\n*\n*  @param aRoom            直播间\n*  @param aCompletion      完成的回调block\n*/\n- (void)modifyLiveroomStatusWithOffline:(EaseLiveRoom *)room\n                             completion:(void (^)(EaseLiveRoom *room, BOOL success))aCompletion;\n```\n\n### 观看直播\n**具体代码参考demo EaseLiveViewController，EaseLiveTVListViewController**\n\n1、获取当前正直播的直播聊天室列表（包含点播房间和直播房间）\n\n```\n/*\n *  获取正在直播聊天室列表\n *\n *  @param aCursor          游标\n *  @param aLimit           预期获取的记录数\n *  @video_type             直播间类型（vod：点播 live：直播）\n *  @param aCompletion      完成的回调block\n */\n- (void)fetchLiveRoomsOngoingWithCursor:(NSString*)aCursor\n                                  limit:(NSInteger)aLimit\n                             video_type:(NSString*)video_type\n                             completion:(void (^)(EMCursorResult *result, BOOL success))aCompletion;\n```\n- 进入某个直播间加入聊天室并且设置消息监听接收消息通知，观看直播\n\n## 新特性：自定义消息体 ##\n\n- 本demo所实现的‘礼物’，‘弹幕’，‘点赞’等功能均通过“自定义消息体”构建传输消息\n\n**具体功能演示代码请参见 EaseCustomMessageHelper**\n\n1、实现自定义消息帮助类接口协议再创建该类实例\n\n```\n- 实现该接口并重写如下方法\n@protocol EaseCustomMessageHelperDelegate \u003cNSObject\u003e\n\n@optional\n\n//观众点赞消息\n- (void)didReceivePraiseMessage:(EMMessage *)message;\n//弹幕消息\n- (void)didSelectedBarrageSwitch:(EMMessage*)msg;\n//观众刷礼物\n- (void)userSendGifts:(EMMessage*)msg count:(NSInteger)count;//观众送礼物\n\n@end\n\n- 创建实例\n- (instancetype)initWithCustomMsgImp:(id\u003cEaseCustomMessageHelperDelegate\u003e)customMsgImp chatId:(NSString*)chatId;\n```\n2、发送包含自定义消息体的消息\n\n```\n/*\n 发送自定义消息 （礼物，点赞，弹幕）\n @param text                 消息内容\n @param num                  消息内容数量\n @param messageType          聊天类型\n @param customMsgType        自定义消息类型\n @param aCompletionBlock     发送完成回调block\n*/\n\n- (void)sendCustomMessage:(NSString*)text\n                      num:(NSInteger)num\n                       to:(NSString*)toUser\n              messageType:(EMChatType)messageType\n            customMsgType:(customMessageType)customMsgType\n               completion:(void (^)(EMMessage *message, EMError *error))aCompletionBlock;\n\n/*\n 发送自定义消息（礼物，点赞，弹幕）（有扩展参数）\n @param text             消息内容\n @param num              消息内容数量\n @param messageType      聊天类型\n @param customMsgType    自定义消息类型\n @param ext              消息扩展\n @param aCompletionBlock 发送完成回调block\n*/\n\n- (void)sendCustomMessage:(NSString*)text\n                              num:(NSInteger)num\n                               to:(NSString*)toUser\n                      messageType:(EMChatType)messageType\n                    customMsgType:(customMessageType)customMsgType\n                            ext:(NSDictionary*)ext\n                       completion:(void (^)(EMMessage *message, EMError *error))aCompletionBlock;\n```\n3、发送用户自定义消息体事件（其他自定义消息体事件）\n```\n/*\n发送用户自定义消息体事件（其他自定义消息体事件）\n@param event                自定义消息体事件\n@param customMsgBodyExt     自定义消息体事件参数\n@param to                   消息发送对象\n@param messageType          聊天类型\n@param aCompletionBlock     发送完成回调block\n*/\n- (void)sendUserCustomMessage:(NSString*)event\n                customMsgBodyExt:(NSDictionary*)customMsgBodyExt\n                            to:(NSString*)toUser\n                        messageType:(EMChatType)messageType\n                   completion:(void (^)(EMMessage *message, EMError *error))aCompletionBlock;\n                   \n/*\n发送用户自定义消息体事件（其他自定义消息体事件）\n@param event                自定义消息体事件\n@param customMsgBodyExt     自定义消息体事件参数\n@param to                   消息发送对象\n@param messageType          聊天类型\n@param aCompletionBlock     发送完成回调block\n*/\n- (void)sendUserCustomMessage:(NSString*)event\n               customMsgBodyExt:(NSDictionary*)customMsgBodyExt\n                           to:(NSString*)toUser\n                       messageType:(EMChatType)messageType\n                  completion:(void (^)(EMMessage *message, EMError *error))aCompletionBlock;\n```\n\n3、解析消息内容\n\n```\n//解析消息内容\n+ (NSString*)getMsgContent:(EMMessageBody*)messageBody;\n```\n4、直播聊天室礼物消息展示\n\n```\n/*\n @param msg             接收的消息\n @param count           礼物数量\n @param backView        展示在哪个页面\n */\n \n- (void)userSendGifts:(EMMessage*)msg count:(NSInteger)count backView:(UIView*)backView;\n```\n5、弹幕消息展示\n\n```\n/*\n @param msg             接收的消息\n @param backView        展示在哪个页面\n */\n \n- (void)barrageAction:(EMMessage*)msg backView:(UIView*)backView;\n```\n6、点赞消息展示\n\n```\n/*\n @param backView        展示在哪个页面\n */\n\n- (void)praiseAction:(UIView*)backView;\n```\n\n## 文档\n- 环信文档地址：[环信文档](http://docs-im.easemob.com/im/extensions/live/intro)\u003c/br\u003e\n- 集成视频直播SDK：[集成视频直播SDK](https://github.com/easemob/livestream_demo_ios/blob/master/EaseMobLiveDemo/直播聊天室集成第三方视频推拉流介绍.md)\u003c/br\u003e\n- 安卓直播聊天室：[安卓直播聊天室](https://github.com/easemob/livestream_demo_android)\n- 环信直播聊天室app-server：[app-sever](https://github.com/easemob/easemob-im-app-server)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feasemob%2Flivestream_demo_ios","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feasemob%2Flivestream_demo_ios","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feasemob%2Flivestream_demo_ios/lists"}