2017-02-09 36 views
1

我试图从我的iOS应用斯威夫特对沃森会话服务会话的开始传递一个上下文变量。到目前为止,我已经发现你必须导入RestKit来创建所需的JSON对象并使用Context初始化器。下面是我要开始对话中的代码示例(我已经包含了尝试简洁!):沃森的iOS SDK(SWIFT)和传递上下文的变量对话

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

如何成功通过此上下文变量的任何例子将不胜感激!

回答

0

我会先向对话服务发送第一个空请求 - 您将返回响应JSON context并生成conversation_id。然后,您只需将其添加到现在填充的context字段中。

0

因为我没有足够的声誉上的Michal尔必达的回答进行评论,我会后另一个在这里解释为什么他就不行,然后我来解释我的解决方法:

在内部,“上下文'对象使用'let'作为它们的json属性,这使得json字典是一个常量,因此即使在从Watson对话服务(WCS)响应生成上下文对象之后也是不可修改的。

有GitHub上一个开放的问题,带来关注这个问题,它可以在这里找到:https://github.com/watson-developer-cloud/swift-sdk/issues/620。希望他们很快解决它,因为这个问题确实是一个麻烦。

现在我来解释我的团队的解决办法,这可能是我不适合你的项目。

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

总之,我的建议是写你在WCS接口的NodeJS逻辑,并从iOS的请求发送到上述服务器,生成节点范围内的有效载荷。