2017-02-09 4 views
1

Я пытаюсь передать переменную контекста в начале разговора из моего приложения iOS Swift в службу Watson Conversation. До сих пор я понял, что вам нужно импортировать RestKit для создания требуемого объекта JSON и использовать инициализатор контекста. Ниже приведен пример кода, я должен начать разговор (я включил попробовать для краткости!):Watson iOS SDK (Swift) и передача переменной контекста в разговор

функ 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) 
    } 
} 

Я получаю следующее сообщение об ошибке в консоли:

фатальная ошибка: 'try!' выражение неожиданно вызвало ошибку: RestKit.JSON.Error.keyNotFound ("convers_id"): файл /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0.63/src/swift/stdlib/public/core /ErrorType.swift, строка 178

Любой пример успешной передачи этой переменной контекста будет очень благодарен!

ответ

0

Я бы сначала отправил первый пустой запрос в службу разговоров - вы получите ответ JSON с context сгенерированным conversation_id. Затем вы просто берете это и добавляете желаемый var в заполненное сейчас поле context.

0

Поскольку у меня нет достаточной репутации прокомментировать ответ Михала Бида, я выложу другие здесь объяснить, почему его не будет работать, а потом я объясню мой обходной путь:

Внутри " Контекстные объекты используют «let» для своего json-свойства, которые делают словарь json постоянным и, следовательно, не изменяемым, даже после того, как контекстный объект генерируется из ответа Watson Conversation Service (WCS).

Существует открытый вопрос о GitHub, который привлекает внимание к этой проблеме, и его можно найти здесь: https://github.com/watson-developer-cloud/swift-sdk/issues/620. Надеюсь, они скоро обратятся к нему, потому что эта проблема действительно является неприятностью.

Теперь я объясню обходное решение моей команды, которое может или мое не работает для вашего проекта.

У нас есть собственный сервер, действующий как посредник между нашим клиентом iOS и WCS. Этот сервер помогает отформатировать наш текст, а также делать запросы к профилям пользователей, сторонним API и т. Д. В частности, мы хотели отправить поле userId в нашем контексте, поэтому WCS может направить наш сервер для получения информации профиля и генерации приветственное сообщение. Поскольку iOS не играет хорошо, мы решили сделать еще одну конечную точку на нашем сервере, которая принимает свойства, которые мы хотели бы разместить в контексте. Поскольку для NodeJS очень удобно создавать желаемый контекст, это решение работает для нас.

Итак, моя рекомендация заключается в том, чтобы написать логику взаимодействия с WCS в NodeJS и отправить запросы от iOS на указанный сервер, генерируя контекстные полезные данные в узле.