在集成AUI Kits低代码集成工具后,如果您需要实现弹幕、送礼物、电商购物车等个性化功能,需要自定义互动消息。本文通过观众给主播送礼物功能介绍自定义互动消息的全链路流程。
步骤一、自定义消息体
自定义消息类型,取值必须大于10000,且与AUI已定义的消息类型不重复,可以定义为300001自定义消息体。针对礼物场景,一般需要定义ID、名称、描述、渲染图片地址等字段,不需要携带发送者ID和昵称。互动消息SDK会在所有消息接收的回调中默认添加这些字段,不需要在此重复添加。
Android示例代码
说明 当前AUI所有自定义消息类型和实体请参见
com.aliyun.aliinteraction.roompaas.message.model
包下的实体类。@MessageType(30001)
public class GiftModel implements Serializable {
public String id; //礼物ID
public String name; //礼物名称
public String description; //礼物描述
public String imageUrl; //礼物图片地址
}
iOS示例代码
typedef NS_ENUM(NSUInteger, AUIRoomMessageType) {
... // AUI已定义消息类型
AUIRoomMessageTypeGift = 30001,
};
// 定义与实现礼物model
@interface AUIRoomGiftModel : NSObject<AUIRoomMessageDataModel>
@property (nonatomic, copy) NSString *giftId;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *desc;
@property (nonatomic, copy) NSString *imageUrl;
@end
@implementation AUIRoomGiftModel
- (instancetype)initWithData:(NSDictionary *)data {
self = [super init];
if (self) {
_giftId = [data objectForKey:@"id"];
_name = [data objectForKey:@"name"];
_desc = [data objectForKey:@"description"];
_imageUrl = [data objectForKey:@"imageUrl"];
}
return self;
}
- (NSDictionary *)toData {
return @{
@"id":_giftId ?: @"",
@"name":_name ?: @"",
@"description":_desc ?: @"",
@"imageUrl":_imageUrl ?: @"",
};
}
@end
步骤二、发送消息
Android示例代码
- 在
AUIMessageService
接口中定义送礼物消息的方法。/** * 送礼物 * * @param model 礼物消息体 * @param anchorId 主播ID * @param callback 回调函数 */ void sendGift(GiftModel model, String anchorId, Callback<String> callback);
- 在
AUIMessageServiceImpl
类中实现上述送礼物消息的方法。@Override public void sendGift(GiftModel model, String anchorId, Callback<String> callback) { doSendMessage(model, anchorId, callback); }
说明 实现送礼物消息只需调用当前类中现有的doSendMessage
方法,对应参数含义如下:- 参数anchorId为directUserId时为私聊消息,表示只有当前Group下的指定用户才能收到消息;如果不指定该值,即传null时,表示为全员消息,此时当前Group下的全体成员均能收到消息。
- 参数callback为发送消息到服务端的本次RPC调用的回调函数,上层根据业务需要传递,不关注时可传null。
iOS示例代码
在
AUIRoomLiveService
类中新增送礼物消息的方法,并封装实现方式。
@interface AUIRoomLiveService : NSObject
// 给主播送礼物
- (void)sendGift:(AUIRoomGiftModel *)gift completed:(void(^)(BOOL))completed;
...
@end
@implementation AUIRoomLiveService
...
#pragma mark - Gift
- (void)sendGift:(AUIRoomGiftModel *)gift completed:(void(^)(BOOL))completed {
if (!self.isJoined || self.isAnchor) {
if (completed) {
completed(NO);
}
return;
}
[self sendData:gift type:AUIRoomMessageTypeGift uids:@[self.liveInfoModel.anchor_id] skipMuteCheck:YES skipAudit:YES completed:completed];
}
@end
说明 sendData对应参数含义如下:
- uids:这里指定为主播ID,也可以为空(表示全员都会收到消息)
- skipMuteCheck:为YES,表示不受禁言影响
- skipAudit:为YES,表示消息内容不经审核
步骤三、接收消息
Android示例代码
- 在
AUIMessageListener
接口中定义接收礼物的回调函数。/** * 收到送礼物消息 * * @param message 消息体 */ void onGiftReceived(Message<GiftModel> message);
- 在
SimpleOnMessageListener
类中添加上述接收礼物回调函数的空实现。@Override public void onGiftReceived(Message<GiftModel> message) { }
iOS示例代码
在AUIRoomLiveService
类中新增回调Block,并在收到IM消息时触发回调。
// 定义回调Block
@property (nonatomic, copy) void (^onReceivedGift)(AUIRoomUser *sender, AUIRoomGiftModel *gift);
- (void)onCustomMessageReceived:(AUIRoomMessageModel *)message {
AUIRoomUser *sender = message.sender;
NSDictionary *data = message.data;
if (message.msgType == AUIRoomMessageTypeGift) {
if (self.onReceivedGift) {
self.onReceivedGift(sender, [[AUIRoomGiftModel alloc] initWithData:data]);
}
return;
}
...
}
步骤四、上层调用
Android端示例代码
观众端送礼物GiftModel model = new GiftModel();
model.id = "<礼物ID>";
model.name = "<礼物名称>";
model.description = "<礼物描述>";
model.imageUrl = "<礼物图片地址>";
getMessageService().sendGift(model, getAnchorId(), null);
主播端接收礼物getMessageService().addMessageListener(new SimpleOnMessageListener() {
@Override
public void onGiftReceived(Message<GiftModel> message) {
String senderId = message.senderId;
String senderNick = message.senderInfo.userNick;
GiftModel giftModel = message.data;
showToast(String.format("%s给你送来了%s", senderNick, giftModel.name));
}
});
iOS端示例代码
观众端送礼物// AUILiveRoomAudienceViewController.m
AUIRoomGiftModel *gift = [AUIRoomGiftModel new];
gift.giftId = @"id";
gift.name = @"火箭";
gift.desc = @"送你一个大火箭,加油!";
gift.imageUrl = @"http://www.xxx.com";
[self.liveService sendGift:gift completed:^(BOOL result) {
}];
主播端接收礼物// AUILiveRoomAnchorViewController.m
// 在AUILiveRoomAnchorViewController初始化时,添加接收礼物的监听
_liveService.onReceivedGift = ^(AUIRoomUser * _Nonnull sender, AUIRoomGiftModel * _Nonnull gift) {
// 处理接收到的礼物
};