用户状态订阅
更新时间: 2024/10/09 13:33:46
网易云信即时通讯 SDK(NetEase IM SDK,简称 NIM SDK)提供订阅用户状态功能,支持订阅/取消订阅用户状态,发布自定义的用户状态,查询用户状态订阅关系等。
支持平台
本文内容适用的开发平台或框架如下表所示:
Android | iOS | Windows/macOS | Web/uni-app/小程序 | HarmonyOS | Flutter |
---|---|---|---|---|---|
✔️️️ | ✔️️️ | ✔️️️ | ✔️️️ | ✔️️️ | - |
技术原理
用户可以通过事件发布以及订阅,来实现 发布-订阅 的设计模式应用于订阅指定用户的在线状态、用户个性化信息订阅等场景。
网易云信 IM 系统已内置在线状态事件,用户无需发布,由网易云信服务器管理。
如果内置的在线状态不满足业务需求,您可以按照以下流程发布自定义用户状态个性化实现业务场景。
flowchart LR
classDef default fill:#337EFF,stroke:#337EFF,stroke-width:0px,color:#FFFFFF;
A("用户 A 订阅 B<br><br> subscribeUserStatus")-->B("用户 B 发布自定义状态事件<br><br>publishCustomUserStatus")-->C("A 收到 B 状态变更的回调<br><br>onUserStatusChanged")-->D("按照自身业务逻辑解析处理<br><br>invite")
click A "https://doc.yunxin.163.com/messaging2/client-apis/zY2MzAxNjQ?platform=client#subscribeuserstatus"
click B "https://doc.yunxin.163.com/messaging2/client-apis/zY2MzAxNjQ?platform=client#publishcustomuserstatus"
click C "https://doc.yunxin.163.com/messaging2/client-apis/DAxNjk0Mzc?platform=client#v2nimsubscribelistener"
监听用户状态订阅相关事件
在进行用户状态订阅相关操作前,您可以提前注册相关事件。注册成功后,当相关事件发生时,SDK 会触发对应回调通知。
用户状态订阅相关回调:
onUserStatusChanged
:其他用户的用户状态变更回调,包括在线状态和自定义状态。同账号发布状态时,多端也会同步收到回调。
在线状态事件会受到推送的影响:
如果应用被清理,但厂商推送(APNS、小米、华为、OPPO、VIVO、魅族、FCM)可达,则默认不会触发该用户断开连接的事件。若您需要该种情况下视为离线,请 前往 网易云信控制台 > 选择应用 > IM 即时通讯 > 功能配置 > 全局功能 > 在线状态订阅 进行设置。
Android/iOS/Windows/macOS
调用 addSubscribeListener
方法注册用户状态订阅相关监听器,监听用户状态变更事件。
示例代码:
JavaV2NIMSubscribeListener listener = new V2NIMSubscribeListener() {
@Override
public void onUserStatusChanged(List<V2NIMUserStatus> userStatusList) {
//用户状态变更
}
};
NIMClient.getService(V2NIMSubscriptionService.class).addSubscribeListener(listener);
Objective-C[NIMSDK.sharedSDK.v2SubscriptionService addSubscribeListener:self];
- (void)onUserStatusChanged:(NSArray<V2NIMUserStatus *> *)data {
}
C++V2NIMSubscribeListener listener;
listener.onUserStatusChanged = [](nstd::vector<V2NIMUserStatusEvent> events) {
// handle user status changed event
};
subscriptionService.addSubscribeListener(listener);
如需移除用户相关监听器,可调用 removeSubscribeListener
方法。
JavaNIMClient.getService(V2NIMSubscriptionService.class).removeSubscribeListener(listener);
Objective-C[NIMSDK.sharedSDK.v2SubscriptionService removeSubscribeListener:self];
C++subscriptionService.removeSubscribeListener(listener);
Web/uni-app/小程序/Harmony
调用 on("EventName")
方法注册用户状态订阅相关监听器,监听用户状态变更事件。
示例代码:
TypeScriptnim.V2NIMSubscriptionService.on("onUserStatusChanged", function (userStatusList: Array<V2NIMUserStatus>) {})
如需移除用户相关监听器,可调用 off("EventName")
方法。
TypeScriptnim.V2NIMSubscriptionService.off("onUserStatusChanged", function (userStatusList: Array<V2NIMUserStatus>) {})
订阅用户状态
调用subscribeUserStatus
方法订阅用户状态,包括在线状态或用户自定义的状态。
成功订阅用户状态后,当订阅的用户状态有变更时,会触发 onUserStatusChanged
回调。
- 用户状态事件订阅时单向的,双方需要各自自行订阅。
- 单次最多订阅 100 个用户的状态,可多次调用该接口,订阅更多的用户状态,但是总订阅人数最多为 3000,若超限,则默认删除最老的订阅,即有效订阅最多为 3000 个。
- 若同一账号多端重复订阅,订阅有效期默认会覆盖(新的覆盖前一次时长)。
- 若传入的账号 ID 都不存在,则调用接口失败。若部分账号 ID 存在,则调用接口成功。调用结果只返回账号 ID 存在的用户状态,错误的账号 ID 不返回。
示例代码:
JavaList<String> accountIds = Arrays.asList("account1", "account2");
//订阅的有效期,时间范围为 60~2592000,单位:秒
long duration = 60L;
//订阅后是否立即同步事件状态值,默认为 false。为 true:表示立即同步当前状态值 但为了性能考虑,30S 内重复订阅,会忽略该参数
boolean immediateSync = false;
V2NIMSubscribeUserStatusOption option = new V2NIMSubscribeUserStatusOption(accountIds, duration, immediateSync);
NIMClient.getService(V2NIMSubscriptionService.class).subscribeUserStatus(option, new V2NIMSuccessCallback<List<String>>() {
@Override
public void onSuccess(List<String> failList) {
//订阅成功,返回订阅失败的 failList
}
}, new V2NIMFailureCallback() {
@Override
public void onFailure(V2NIMError error) {
//订阅失败
}
});
Objective-CV2NIMSubscribeUserStatusOption *option = [[V2NIMSubscribeUserStatusOption alloc] init];
option.accountIds = @[@"accId1",@"accId2"];
[NIMSDK.sharedSDK.v2SubscriptionService subscribeUserStatus:option success:^(NSArray<NSString *> *failedList) {
// 成功回调
} failure:^(V2NIMError * _Nonnull error) {
// 失败回调
}];
C++V2NIMSubscribeUserStatusOption option;
option.accountIds.push_back("account1");
subscriptionService.subscribeUserStatus(
option,
[](nstd::vector<nstd::string> failedAccounts) {
// subscribe user status succeeded
},
[](V2NIMError error) {
// subscribe user status failed, handle error
});
TypeScripttry {
const failedAccounts = await nim.V2NIMSubscriptionService.subscribeUserStatus({
accountIds: ['user1', 'user2'],
duration: 3600 * 24
})
if (failedAccounts.length > 0) {
console.error('subscribeUserStatus failed accounts', failedAccounts)
}
} catch(err) {
console.error('subscribeUserStatus err': err)
}
取消订阅用户状态
调用 unsubscribeUserStatus
方法取消用户状态的订阅。
示例代码:
JavaList<String> accountIds = Arrays.asList("account1", "account2");
V2NIMUnsubscribeUserStatusOption option = new V2NIMUnsubscribeUserStatusOption(accountIds);
NIMClient.getService(V2NIMSubscriptionService.class).unsubscribeUserStatus(option, new V2NIMSuccessCallback<List<String>>() {
@Override
public void onSuccess(List<String> failList) {
//取消订阅成功,返回取消订阅失败的 failList
}
}, new V2NIMFailureCallback() {
@Override
public void onFailure(V2NIMError error) {
//取消订阅失败
}
});
Objective-CV2NIMUnsubscribeUserStatusOption *option = [[V2NIMUnsubscribeUserStatusOption alloc] init];
option.accountIds = @[@"accId1",@"accId2"];
[NIMSDK.sharedSDK.v2SubscriptionService unsubscribeUserStatus:option success:^(NSArray<NSString *> *failedList) {
// 成功回调
} failure:^(V2NIMError * _Nonnull error) {
// 失败回调
}];
C++V2NIMUnsubscribeUserStatusOption option;
option.accountIds.push_back("account1");
subscriptionService.unsubscribeUserStatus(
option,
[](nstd::vector<nstd::string> failedAccounts) {
// unsubscribe user status succeeded
},
[](V2NIMError error) {
// unsubscribe user status failed, handle error
});
TypeScripttry {
const failedAccounts = await nim.V2NIMSubscriptionService.unsubscribeUserStatus({
accountIds: ['user1', 'user2']
})
if (failedAccounts.length > 0) {
console.error('unsubscribeUserStatus failed accounts', failedAccounts)
}
} catch(err) {
console.error('unsubscribeUserStatus err': err)
}
查询用户状态订阅关系
调用 queryUserStatusSubscriptions
方法查询用户状态订阅关系。
传入账号列表,查询自己订阅了其中哪些账号的状态,调用接口成功后,返回订阅的账号列表。
示例代码:
JavaList<String> accountIds = Arrays.asList("account1", "account2");
NIMClient.getService(V2NIMSubscriptionService.class).queryUserStatusSubscriptions(accountIds, new V2NIMSuccessCallback<List<V2NIMUserStatusSubscribeResult>>() {
@Override
public void onSuccess(List<V2NIMUserStatusSubscribeResult> v2NIMUserStatusSubscribeResults) {
//查询成功
}
}, new V2NIMFailureCallback() {
@Override
public void onFailure(V2NIMError error) {
//查询失败
}
});
Objective-C[NIMSDK.sharedSDK.v2SubscriptionService queryUserStatusSubscriptions:@[@"accId1",@"accId2"] success:^(NSArray<V2NIMUserStatusSubscribeResult *> *resultList) {
// 成功回调
} failure:^(V2NIMError * _Nonnull error) {
// 失败回调
}];
C++nstd::vector<nstd::string> accountIds;
accountIds.push_back("account1");
subscriptionService.queryUserStatusSubscriptions(
accountIds,
[](nstd::vector<nstd::string> subscribedAccounts) {
// query user status subscribe succeeded
},
[](V2NIMError error) {
// query user status subscribe failed, handle error
});
TypeScripttry {
const result = await nim.V2NIMSubscriptionService.queryUserStatusSubscriptions(['user1', 'user2'])
console.log('queryUserStatusSubscriptions result', result)
} catch(err) {
console.error('queryUserStatusSubscriptions err': err)
}
发布用户自定义状态
调用 publishCustomUserStatus
方法发布用户自定义状态。
如果默认在线状态不满足业务需求,可以发布自定义用户状态。
示例代码:
Java//自定义设置值:10000 以上,包括一万,一万以内为预定义值
int statusType = 10001;
//状态的有效期,单位秒,范围为 60s 到 7days
long duration = 60L;
//用户发布状态时设置的扩展字段
String extension = "{\"key\":\"value\"}";
//用户发布状态时是否只广播给在线的订阅者,默认值为 TRUE
boolean onlineOnly = true;
// 用户发布状态时是否需要多端同步,默认值为 FALSE
boolean multiSync = false;
//自定义用户状态参数
V2NIMCustomUserStatusParams params = new V2NIMCustomUserStatusParams.Builder(statusType,duration)
.extension(extension)
.onlineOnly(onlineOnly)
.multiSync(multiSync)
.build();
NIMClient.getService(V2NIMSubscriptionService.class).publishCustomUserStatus(params, new V2NIMSuccessCallback<V2NIMCustomUserStatusPublishResult>() {
@Override
public void onSuccess(V2NIMCustomUserStatusPublishResult v2NIMCustomUserStatusPublishResult) {
//发布自定义用户状态成功
}
}, new V2NIMFailureCallback() {
@Override
public void onFailure(V2NIMError error) {
//发布自定义用户状态失败
}
});
Objective-C V2NIMCustomUserStatusParams *params = [[V2NIMCustomUserStatusParams alloc] init];
params.statusType = 10001;
[NIMSDK.sharedSDK.v2SubscriptionService publishCustomUserStatus:params success:^(V2NIMCustomUserStatusPublishResult *resultList) {
// 成功回调
} failure:^(V2NIMError * _Nonnull error) {
// 失败回调
}];
C++V2NIMCustomUserStatusParams params;
params.statusType = 100001;
subscriptionService.publishCustomUserStatus(
params,
[]() {
// publish custom user status succeeded
},
[](V2NIMError error) {
// publish custom user status failed, handle error
});
TypeScripttry {
const result = await nim.V2NIMSubscriptionService.publishCustomUserStatus({
/**
* 自定义设置值:10000 以上,不包括一万,一万以内为预定义值。小于 1 万,返回参数错误
*/
statusType: 10001
/**
* 状态的有效期,单位秒,范围为 60s 到 7days
*/
duration: 3600 * 24
/**
* 用户发布状态时是否只广播给在线的订阅者。默认为 true
*/
onlineOnly: false
/**
* 用户发布状态时是否需要多端同步。默认为 false
*/
multiSync: true
})
console.log('publishCustomUserStatus result', result)
} catch(err) {
console.error('publishCustomUserStatus err': err)
}