使用聊天SDK API提供程序

聊天SDK API提供程序封装了聊天SDK的所有功能,从设置访问者信息到更高级的功能,如观察聊天期间可能发生的某些事件。

如果您希望构建自己的UI,您可以使用这些提供程序来实现功能,例如代表访问者发送消息。

使用API提供程序和聊天SDK

请注意,聊天SDK有自己的连接管理,基于统一SDK提供的UIViewController的生命周期。如果您同时使用聊天SDK和聊天API提供程序,这一点非常重要。聊天屏幕之外的连接生命周期的所有权掌握在您自己手中。

重要的是:在使用API提供程序之前,请确保调用连接,并设置连接状态观察者来适当地处理连接状态。这是Chat正常工作所必需的。

             
chat.connectionProvider.connect ()

连接可以在API调用之前或之后调用。这是因为所有api请求都进入一个操作队列。一旦建立了连接,请求将按顺序发送。

如果你需要确定一个api调用被调用了,你可以把它包装在一个一次性的连接观察中,像这样:

             
函数fireChatAPICalls() {var token: ChatProvidersSDK.ObservationTokentoken = Chat.connectionProvider?observeConnectionStatus{状态保护状态。isConnected else {return}Chat.profileProvider ? .addTags((“标记”))Chat.profileProvider ?。setNote(”访客说”).cancel() //确保调用只发生一次}Chat.connectionProvider ? .connect ()}记得在任何将用户带回聊天屏幕的流之前调用disconnect。“迅速chat.connectionProvider.disconnect ()

这篇关于实现Chat v1消息计数器特性是一个很好的示例,说明如何在聊天屏幕之外利用聊天api。

访问提供程序

提供程序可以从闲谈,聊天单例模式:

斯威夫特

             
Chat.accountProviderChat.connectionProviderChat.chatProviderChat.profileProviderChat.pushNotificationsProviderChat.settingsProvider

objective - c

             
ZDKChataccountProviderZDKChatconnectionProviderZDKChatchatProviderZDKChatprofileProviderZDKChatpushNotificationsProviderZDKChatsettingsProvider

观察事件

提供程序允许您观察可能发生的某些事件。重要的是,如果你开始观察这些事件,你也要记得停止观察它们。

在您的设置中很可能会有多个ObservationToken对象。利用ObserveBehaviours集合将它们很好地分组。

斯威夫特

             
var token: ObservationToken?init () {let token = Chat.accountProvider?observeAccount {(account) in//帐户模型已更改}}deinit () {令牌? .cancel ()}

objective - c

             
@ property原子保留ZDKObservationToken*令牌-instancetype初始化ZDKObservationToken*令牌ZDKChataccountProvider observeAccountZDKChatAccount*账户//帐户模型已更改}]}-无效dealloc_token取消]}

正在检查正在进行的聊天的信息

你可以在开始聊天前检查是否已经有正在进行的对话。

请注意:此API主动连接到已认证用户的web套接字。这种连接保持活跃。你应该打电话断开()如果你不需要保持它的打开状态。

斯威夫特

             
Chat.chatProvider ?。getChatInfo{(result) in切换结果{case .success(let chatInfo):如果chatInfo。isChatting {//有一个正在进行的对话}Case .failure(let error)://出错了}}

objective - c

             
ZDKChatgetChatInfoZDKChatInfo*chatInfoNSError*错误如果chatInfoisChatting///有一个正在进行的对话}}]

获取代理的可用性

您可以查看座席和部门的可用性:

斯威夫特

             
Chat.accountProvider ?。getAccount {(result) in切换结果{成功案例(让账户):切换账户。accountStatus {案例.online://有可用的代理//然后您可以获得有可用代理的部门let onlineDepartments = account.departments?.map{$0。状态== .online}默认值://没有代理可用}Case .failure(let error)://出错了}}

objective - c

             
ZDKChataccountProvider getAccountZDKChatAccount*账户NSError*错误如果账户开关账户accountStatus情况下ZDKChatAccountStatusOnline//有可用的代理//然后您可以获得有可用代理的部门NSArray*部门账户部门NSArray*onlineDepartments部门objectsAtIndexes部门indexesOfObjectsPassingTest保龄球ZDKDepartment*部门了NSUInteger idx保龄球*停止返回部门departmentStatus==ZDKDepartmentStatusOnline}]]打破默认的打破}}}]

欲知有关账户类,参见参考文档

您还可以观察到代理可用性的变化:

斯威夫特

             
let token = Chat.accountProvider?observeAccount {(account) in切换账户。{状态案例.online://代理可用打破默认值://没有代理可用打破}}

objective - c

             
ZDKObservationToken*令牌闲谈,聊天accountProvider observeAccountZDKChatAccount*账户开关账户状态情况下ZDKChatAccountStatusOnline//代理可用打破默认的//没有代理可用打破}}]

观察聊天设置的更改

您可以在聊天仪表板中收到任何更改设置的通知:

斯威夫特

             
let token = Chat.settingsProvider?observeChatSettings{(设置)in开关设置。isFileSendingEnabled {案例真实://启用附件假://禁用附件}}

objective - c

             
ZDKObservationToken*令牌ZDKChatsettingsProvider observeChatSettingsZDKChatSettings*设置如果设置isFileSendingEnabled//启用附件}其他的//禁用附件}}]

欲知有关ChatSettings类,参见参考文档

观察连接状态

你可以监听连接状态的变化:

斯威夫特

             
let token = Chat.connectionProvider?observeConnectionStatus {(status) in开关状态{连接,连接:打破断开连接、重新连接、失败、不可达:打破}}

objective - c

             
ZDKObservationToken*令牌ZDKChatconnectionProvider observeConnectionStatus枚举ZDKConnectionStatus状态开关状态情况下ZDKConnectionStatusConnected打破情况下ZDKConnectionStatusDisconnected打破默认的打破}}]

观察聊天状态

您可以观察聊天的状态,并收集有关会话的信息:

斯威夫特

             
let token = Chat.chatProvider?{(chatState) in//处理chatState更新}

objective - c

             
ZDKObservationToken*令牌ZDKChatchatProvider observeChatStateZDKChatState*chatState//处理chatState更新}]

ChatState对象具有以下属性:

财产 描述
代理 聊天中的座席列表。
日志 ChatLog项的数组,表示对话中的消息。
queuePosition 访问者当前的队列位置。
isChatting 来访者是否已经开始与代理人聊天。
部门 由来访者要求的部门。
chatSessionStatus 当前聊天会话的阶段。看到参考文档
评级 访问者对当前会话的评分。
评论 访问者对当前会话的评价。

欲知有关ChatState类,参见参考文档

发送消息

斯威夫特

             
Chat.chatProvider ?。sendMessage(“帮助我。”)
             
Chat.chatProvider ?。sendMessage("Help me.") {(result) in切换结果{case .success(let messageId)://消息发送成功Case .failure(let error)://出错了//您可以轻松地检索messageId,以便在重试时使用let messageId = error.messageId}}

objective - c

             
ZDKChatchatProvider sendMessage@“嗨!”完成NSString*消息idNSError*错误如果消息id//消息发送成功}}]

您可以使用以下方法尝试重新发送或删除失败的消息,这些方法采用chatLogId作为论证:

斯威夫特

             
Chat.chatProvider ?。resendFailedMessage (withId:“消息id”)

objective - c

             
ZDKChatchatProvider resendFailedMessageWithId@“消息id”完成]

斯威夫特

             
Chat.chatProvider ? .deleteFailedMessage (withId:“消息id”)

objective - c

             
ZDKChatchatProvider deleteFailedMessageWithId@“消息id”完成]

发送附件

可以通过提供URL.有两个闭包,第一个将随着上传的进度而触发,第二个将在上传完成时触发。的结果传入将识别成功或失败。

斯威夫特

             
Chat.chatProvider ?。sendFile(url: fileURL, onProgress:{(进度)in//用进度做点什么}, completion: {result in切换结果{案例.success://发送附件Case .failure(let error)://出错了}})

objective - c

             
ZDKChatchatProvider sendFileWithUrlurlonProgress进步//用进度做点什么}完成NSString*标识符ZDKChatAttachmentMessage*附件NSError*错误如果附件//发送附件}}]

您可以使用以下方法重新发送文件,该方法接受chatLogId作为论证:

斯威夫特

             
Chat.chatProvider ?。resendFailedFile(withId: "Id", onProgress: {(progress) in//用进度做点什么}, completion: {(result) in//对结果执行操作})

objective - c

             
ZDKChatchatProvider sendFileWithUrlurlonProgress进步//用进度做点什么}完成NSString*标识符ZDKChatAttachmentMessage*附件NSError*错误如果附件//重新发送附件成功}}]

结束聊天

您可以在任何时候结束聊天,并使用闭包来验证它是否成功。

斯威夫特

             
Chat.chatProvider ? .endChat ()
             
Chat.chatProvider ?。endChat {(result) in切换结果{案例.success://聊天成功结束Case .failure(let error)://出错了}}

objective - c

             
ZDKChatchatProvider endChatBOOL didEndChatNSError*错误如果didEndChat//聊天成功结束}}]

添加和删除标记

附加一个特定的标签:

斯威夫特

             
Chat.profileProvider ? .addTags((“标记”))

objective - c

             
ZDKChatprofileProvider addTags@@“标签”]完成]

移除已添加的标签:

斯威夫特

             
Chat.profileProvider ? .removeTags((“标记”))

objective - c

             
ZDKChatprofileProvider removeTags@@“标签”]完成]

如果您需要清除已添加到聊天中的所有标签,则需要跟踪每个可能的标签:

下面是一个使用CaseIterable

斯威夫特

             
标签:String, CaseIterable {情况下产品情况下帮助情况下移动}函数clearTags() {let tags = tags . allcases .map{$0。rawValue}Chat.profileProvider ? .removeTags(标签)}

发送聊天评价

斯威夫特

             
Chat.chatProvider ? .sendChatRating(好)

objective - c

             
ZDKChatchatProvider sendChatRatingZDKRatingGood完成]

发送聊天评论

斯威夫特

             
Chat.chatProvider ?。sendChatComment(“非常有帮助,谢谢!”)

objective - c

             
ZDKChatchatProvider sendChatComment@“非常有帮助,谢谢!”完成]

发送脱机消息

此方法应仅用于将脱机消息发送到离线账户或部门。每次调用此方法时都会创建一个新的聊天。如果您的聊天帐户链接到一个支持帐户,每条消息将自动创建一个票证。

斯威夫特

             
let visitorInfo = visitorInfo (name: " name "),电子邮件:“电子邮件”,phoneNumber:“电话号码”)let offlineForm = offlineForm (visitorInfo: visitorInfo,departmentd:“部门ID”;信息:“消息”).sendOfflineForm(offlineForm) {(result) in切换结果{案例.success://发送表单Case .failure(let error)://出错了}}

objective - c

             
ZDKVisitorInfo*visitorInfoZDKVisitorInfo alloc]initWithName@“名称”电子邮件@“电子邮件”phoneNumber@“电话号码”]ZDKOfflineForm*形式ZDKOfflineForm alloc]initWithVisitorInfovisitorInfodepartmentId@“部门ID”消息@“消息”]ZDKChatchatProvider sendOfflineForm形式完成ZDKOfflineForm*offlineFormNSError*错误如果offlineForm//发送表单}}]

ObserveBehaviours

通常你会有多个订阅聊天观察器。存储引用和取消引用ObservationTokenS会使你的代码库膨胀。我们提供了ObserveBehaviours集合,以便以简洁的方式处理这些令牌。

斯威夫特

             
最终类ChatWrapper {var observebehaviors: observebehaviors ?聊天:聊天函数observeChat() {observebehavior =observeChatSettings (),observeChatState ()}函数observeChatSettings() -> ObservationBehaviour {chat_setingsprovider . observechatsettings{设置//处理设置更新} .asBehaviour ()}函数observeChatState() -> observationbehavior {observechatstate{状态在//处理chatState更新} .asBehaviour ()}函数观察echat () {observeBehaviours ? .unobserve ()}deinit {unobserveChat ()}}