通过自定义互动消息实现送礼、弹商品卡片的互动

在集成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示例代码

  1. 在AUIMessageService接口中定义送礼物消息的方法。

    /**
     * 送礼物
     *
     * @param model    礼物消息体
     * @param anchorId 主播ID
     * @param callback 回调函数
     */
    void sendGift(GiftModel model, String anchorId, Callback<String> callback);
  2. 在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示例代码

  1. 在AUIMessageListener接口中定义接收礼物的回调函数。

    /**
     * 收到送礼物消息
     *
     * @param message 消息体
     */
    void onGiftReceived(Message<GiftModel> message);
  2. 在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) {
    // 处理接收到的礼物
};