在集成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) {
// 處理接收到的禮物
};