Watson iOS SDK(Swift)并将上下文变量传递给Conversation

时间:2017-02-09 03:33:19

标签: ios json swift watson-conversation

我试图在会话开始时将我的iOS Swift应用程序中的上下文变量传递给Watson Conversation服务。到目前为止,我已经发现你必须导入RestKit来创建所需的JSON对象并使用Context初始化器。下面是我开始对话的代码示例(为了简洁,我已经包含了try!):

func startWatsonConv(){

    var cvar = JSON(json: ["shotInfo":"Pneumovax"])

    context = try! Context(json: cvar)

    let failure = { (error: Error) in print(error) }
    conversation.message(withWorkspace: conWorkspace, failure: failure) { response in
        self.context = response.context
        print ("start of conversation", response.context)
    }
}

我在控制台中收到以下错误:

致命错误:'尝试!'表达式意外地引发了一个错误:RestKit.JSON.Error.keyNotFound(" conversation_id"):file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0.63/src/swift/ stdlib / public / core / ErrorType.swift,第178行

非常感谢有关如何成功传递此上下文变量的任何示例!

2 个答案:

答案 0 :(得分:0)

我会首先向会话服务发送第一个空请求 - 您将使用生成的context的{​​{1}}取回响应JSON。然后,您只需执行此操作,并将所需的var添加到现在填充的conversation_id字段。

答案 1 :(得分:0)

由于我没有足够的声誉来评论Michal Bida的答案,我将在这里发布另一个解释他为什么不会工作的原因,然后我会解释我的解决方法:

在内部,'背景'对象使用' let'因为它们的json属性,即使在从Watson Conversation Service(WCS)响应生成上下文对象之后,它也使json字典成为常量,因此不可修改。

GitHub上有一个未解决的问题引起了对这个问题的关注,可以在这里找到:https://github.com/watson-developer-cloud/swift-sdk/issues/620。希望他们能尽快解决,因为这个问题确实令人讨厌。

现在,我将解释我的团队的解决方法,这可能或不适用于您的项目。

我们有自己的服务器充当我们的iOS客户端和WCS之间的中介。此服务器有助于格式化我们的文本,以及对用户个人资料,第三方API等进行查询。特别是,我们希望发送一个' userId'在我们的上下文中的字段,因此WCS可以指示我们的服务器检索配置文件信息并生成欢迎消息。由于iOS并不好玩,我们选择在我们的服务器中创建另一个URL端点,该端点接受我们想要放在上下文中的属性。由于它非常容易在NodeJS中生成我们想要的上下文,因此该解决方案适用于我们。

总之,我的建议是在NodeJS中编写WCS接口逻辑,并将请求从iOS发送到所述服务器,在Node中生成上下文有效负载。