在集成AUI Kits后,如果您需要实现弹幕、送礼、电商购物车等个性化功能,需要自定义互动消息。本文通过观众给主播送礼物举例介绍自定义互动消息的全链路流程。
自定义消息体
自定义消息类型,取值必须大于10000,且与AUI已定义的消息类型不重复,可以定义为30001
自定义消息体,针对礼物场景,一般需要定义ID、名称、描述、渲染图片地址等字段,不需要携带发送者ID和昵称,互动消息SDK会在所有消息接收的回调中默认添加这些字段,不需要在此重复添加。
示例代码
Android示例代码
@MessageType(30001)
public class GiftModel implements Serializable {
public String id; //礼物ID
public String name; //礼物名称
public String description; //礼物描述
public String imageUrl; //礼物图片地址
}
当前AUI所有自定义消息类型和实体可以请参见com.aliyun.aliinteraction.roompaas.message.model包下的实体类
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);
getAnchorId是BaseComponent中的基类方法,所有子Component均可直接调用。
主播端,接收礼物
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) {
// 处理接收到的礼物
};