Quickblox API iOS与Android不一致:Android订阅确认无对应回调咨询
QuickBlox 联系人订阅流程:iOS 与 Android 平台差异及 Android 端缺失回调的处理
我之前在对接QuickBlox的联系人功能时,也踩过这个跨平台回调不一致的坑,特意整理了两个平台的流程差异,以及Android端发起方收不到确认回调的应对方案:
iOS 端完整闭环流程
iOS的联系人订阅链路是完全闭环的,每个操作都有对应的回调响应:
- 发起订阅请求:调用
addUserToContactListRequest(222)(参数为被添加用户的ID) - 被请求方接收通知:通过
chatDidReceiveContactAddRequestFromUser(111)回调获取发起方ID - 被请求方确认订阅:调用
confirmAddContactRequest(111)(参数为发起方ID) - 发起方接收确认通知:通过
chatDidReceiveAcceptContactRequestFromUser(222)回调拿到被添加用户ID
Android 端流程及核心问题
Android端的订阅流程前半段正常,但确认后的回调存在明显缺失:
- 发起订阅请求:调用
chatRoster.subscribe(222)(参数为被添加用户的ID) - 被请求方接收通知:在
new QBSubscriptionListener()的subscriptionRequested(111)方法中获取发起方ID - 被请求方确认订阅:调用
chatRoster.confirmSubscription(111)(参数为发起方ID) - 关键问题:发起方此时没有官方提供的回调来接收确认通知,而且QuickBlox的官方文档里也完全没提及这个场景的处理方式
临时解决办法(亲测有效)
既然官方回调缺失,我们可以通过监听联系人列表(Roster)的变化来间接捕获确认事件:
- 在发起订阅后,给
chatRoster设置一个QBContactListListener - 当被请求方确认订阅后,发起方的联系人列表会更新,此时可以在
contactListChanged()方法中检查目标用户的订阅状态,判断是否已被确认
示例代码如下:
chatRoster.addContactListListener(new QBContactListListener() { @Override public void contactListChanged() { // 遍历联系人列表,检查目标用户的订阅状态 QBRosterEntry targetEntry = chatRoster.getRosterEntry(222); if (targetEntry != null && targetEntry.getType() == QBRosterSubscriptionType.BOTH) { // 此处判定对方已确认订阅请求,执行后续逻辑 handleSubscriptionConfirmed(222); } } });
这个方法虽然不是官方推荐的回调方式,但能有效弥补Android端的功能缺口,我之前项目里就是这么处理的,稳定性还不错。
内容的提问来源于stack exchange,提问作者Mens Rifles
相关产品推荐
相关产品推荐

