Я создаю интеграцию Swift с API Movesense, как показано здесь: https://bitbucket.org/suunto/movesense-mobile-lib/src/master/IOS/
Следуя примерам, приведенным в приложении Movesense Showcase, я подписался на частоту сердечных сокращений уведомления:
let request = MovesenseRequest(resourceType: .heartRate, method: .subscribe,
parameters: nil)
let operation = device.sendRequest(request, observer: self)
Я уверен, что мое устройство подключено и работает, потому что я могу без проблем получать информацию о температуре и энергии, используя методы .get.
Проблема в том, что я не получаю никаких ответов сердечного ритма от Movesense API. Пройдя через API, я застрял в методе запроса на отправку, где обратные вызовы onCompletion и onEvent имеют операцию nil, поэтому он умирает без отправки ответа моему приложению.
internal func sendRequest(_ request: MovesenseRequest, serial: String,
observer: Observer) -> MovesenseOperation? {
guard let mds = self.mdsWrapper,
let jsonDecoder = self.jsonDecoder else {
let error = MovesenseError.integrityError("MovesenseConnection::sendRequest error.")
delegate?.onConnectionError(error)
return nil
}
let resourcePath = "\(serial)/\(request.path)"
let onCancel = {
switch request.method {
case .subscribe: mds.doUnsubscribe(resourcePath)
default: return
}
}
let operation = MovesenseOperationFactory.create(request: request,
observer: observer,
jsonDecoder: jsonDecoder,
onCancel: onCancel)
// Decode response with the MovesenseOperation instance
let onCompletion = { [connectionQueue, weak operation] (_ response: MDSResponse) in
dump(response)
guard let operation = operation else { return }
connectionQueue.async {
operation.handleResponse(status: response.statusCode, header: response.header,
data: response.bodyData)
}
}
switch request.method {
case .get: mds.doGet(resourcePath, contract: request.contract, completion: onCompletion)
case .put: mds.doPut(resourcePath, contract: request.contract, completion: onCompletion)
case .post: mds.doPost(resourcePath, contract: request.contract, completion: onCompletion)
case .del: mds.doDelete(resourcePath, contract: request.contract, completion: onCompletion)
case .unsubscribe: mds.doUnsubscribe(resourcePath)
case .subscribe:
let onEvent = { [connectionQueue, weak operation] (_ event: MDSEvent) in
dump(event)
guard let operation = operation else {
mds.doUnsubscribe(resourcePath)
return
}
connectionQueue.async {
operation.handleEvent(header: event.header,
data: event.bodyData)
}
}
mds.doSubscribe(resourcePath, contract: request.contract,
response: onCompletion, onEvent: onEvent)
}
return operation
}
Я знаю API работает, потому что код Movesense Showcase в репозитории работает просто отлично, но я не знаю, что я упустил при настройке запроса, поэтому операция не будет равна нулю каждый раз. Что может вызвать эту ошибку?