Skip to content

原生 iOS 接入

原生 iOS SDK 用于在 App 内打开完整的访客聊天页面。接入完整聊天页时使用交付包中的 Agent99VisitorUIKit

增值服务

原生 iOS 接入属于单独付费的项目。如需获取 iOS SDK 源码包或安排接入支持,请联系我们

接入准备

  • 支持 iOS 13 及以上版本。
  • 在商户后台准备 API 密钥,并由业务服务端为已登录用户签发访客令牌。请勿将 API 密钥写入 App。
  • 将交付的 iOS SDK 源码通过 Swift Package Manager 或 CocoaPods 添加到工程;需要完整聊天页时引入 Agent99VisitorUIKit

配置访客身份

建议在用户登录完成后配置。用户 ID 由业务服务端在访客令牌中确认;客户端配置昵称、头像,以及 attributes(即 visitor.attr 扩展信息)。下面示例中的 fetchVisitorToken() 应请求您的业务服务端,由服务端返回当前用户的访客令牌;令牌的签发方式请参阅用户基础信息对接

swift
import Agent99VisitorUIKit

let config = try VisitorConfig(
    baseUrl: "https://live.99kf.com",
    language: "zh-CN"
)

Visitor.configure(
    config: config,
    auth: .tokenProvider {
        try await appAPI.fetchVisitorToken()
    },
    visitor: VisitorProfile(
        nickname: "张三",
        avatar: "https://www.99kf.com/avatar/12.jpg",
        attributes: [
            VisitorAttribute(key: "phone", label: "电话", value: .string("13800138000")),
            VisitorAttribute(key: "name", label: "姓名", value: .string("张三"))
        ]
    )
)

其中 phonename 需与客服端的访客字段设置一致。配置仅保存本地信息;首次打开客服或需要刷新身份时,应用才会向业务服务端请求令牌。

打开聊天页

在需要咨询入口的按钮事件中调用:

swift
Visitor.openChat(
    from: self,
    options: VisitorChatOptions(groupId: 0)
)

groupId 用于指定客服分组。未填写时使用默认分组;分组对应的接待客服可在分组设置中维护。

传递业务上下文

支持在打开聊天页时一并传递商品、订单或其他业务资料,客服接待时可直接查看。字段格式和完整示例请参阅商品和订单对接

swift
Visitor.openChat(
    from: self,
    options: VisitorChatOptions(
        groupId: 0,
        contexts: [
            VisitorContext(
                key: "order:ORDER-1001",
                title: "最近订单",
                type: "order",
                fields: [
                    VisitorContextField(key: "status", label: "订单状态", value: "待发货")
                ]
            )
        ]
    )
)

未读计数

可用未读数更新 App 的 Tab 红点或数字。监听对象需要由页面、协调器等宿主对象持有:

swift
final class UnreadObserver: VisitorUnreadListener {
    func onUnreadCountChanged(_ count: Int) {
        // 例如:tabBarItem.badgeValue = count > 0 ? "\(count)" : nil
    }
}

let unreadObserver = UnreadObserver()
try Visitor.addUnreadListener(unreadObserver)

Visitor.unreadCount { result in
    if case let .success(count) = result {
        // 需要时立即使用当前未读数
    }
}

首次成功取得未读数和后续数值变化都会通知监听器。不再需要时调用 try Visitor.removeUnreadListener(unreadObserver)

媒体权限

如果应用启用了拍照、相册或语音功能,请在 Info.plist 中补充相机、相册和麦克风的用途说明,并在真机上完成授权测试。

智能客服源码手册-99客服