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

  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);
主播端接收礼物
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) {
    // 处理接收到的礼物
};