XMPP roster能否添加无IM/presence仅含vCard的公共外部联系人?
嘿,这个需求刚好踩中了XMPP协议设计的灵活性点——完全可以实现只在roster里保留公共联系人、带vCard(存储电话号码),但禁用IM和presence功能。下面给你拆解具体的实现思路和协议依据:
核心可行性说明
XMPP的Roster(联系人列表,基于XEP-0016规范)和vCard(基于XEP-0054规范)是相对独立的模块,即使没有presence订阅关系或IM权限,依然可以给roster项绑定vCard信息。这刚好匹配你提到的合作经销商、ISP热线这类仅需存储联系方式的公共联系人场景。
具体实现步骤
设置订阅状态为
none
给这类联系人的roster项设置subscription='none',这是XMPP roster的标准状态之一:双方都不订阅彼此的presence,意味着你不会收到对方的在线状态更新,对方也不会收到你的。同时,默认情况下没有订阅关系的roster项无法发送IM消息(部分服务器会直接拒绝这类消息请求),刚好满足禁用IM的需求。绑定带电话号码的vCard
通过vCard-temp协议给这些roster项上传vCard数据,里面可以包含电话号码、商家名称、地址等信息。即使没有presence或IM功能,vCard依然可以正常存储在服务器上,客户端随时可以查询获取。可选:服务器端强化限制
如果需要更严格的控制,很多XMPP服务器支持通过插件或ACL规则进一步限制:- 禁止向这类联系人发送任何IM消息
- 隐藏roster项中的presence相关字段,避免客户端显示不必要的状态占位
示例XMPP命令
下面是添加这类联系人并绑定vCard的简单XML命令示例:
<!-- 添加roster项,订阅状态为none --> <iq type='set' id='add-pizza'> <query xmlns='jabber:iq:roster'> <item jid='pizza-shop@your-server.com' name='常订披萨店' subscription='none'/> </query> </iq> <!-- 上传对应vCard,包含电话号码 --> <iq type='set' id='vcard-pizza'> <vCard xmlns='vcard-temp'> <FN>常订披萨店</FN> <TEL> <VOICE/> <NUMBER>138-XXXX-XXXX</NUMBER> </TEL> </vCard> </iq>
效果验证
配置完成后,客户端的roster列表里会显示这些公共联系人,点击即可查看vCard中的电话号码等信息,但不会显示在线状态,也无法发起IM会话(如果服务器做了限制),完全符合你的需求。
内容的提问来源于stack exchange,提问作者Jippers

