По моему опыту, часы ОС довольно привередливы, особенно при использовании старых моделей часов. При этом я думаю, что ответ на вопрос: «Не опасно ли предположить, что сессия готова принять сообщение в активацииDidCompleteWith?» это да, опасно предполагать это.
В моем собственном приложении мой случай очень похож на ваш, и я решил его, отправив сообщение до получения ответа.
// false until a response is received from the phone
let receivedResponse: Bool = false
// function that sends the message
func requestResponse() {
guard WCSession.default.isReachable else {
print("Phone not reachable")
return
}
// callback that handles response
let responseHandler: ([String: Any]) -> () = { response in
receivedResponse = true
callback(response)
}
WCSession.default.sendMessage(["Request": "Response"],
replyHandler: responseHandler) { error in
print(error.localizedDescription)
}
}
// timer that calls the request function repeatedly
let retryTimer = Timer.scheduledTimer(withTimeInterval: 1,
repeats: true) { timer in
if receivedResponse {
// we know we got a response so clean up timer
timer.invalidate()
}
requestResponse()
}