Этот сценарий охватывает несколько вариантов использования. Пожалуйста, взгляните на эти шаги, они мне очень помогают.
1. Помните, что каждое устройство должно иметь собственный экземпляр WCSession и настроены соответствующие делегаты.
2 - реализовать WCSessionDelegate только в одном месте на каждом устройстве, например. в приложении iOS в AppDelegate, в watchOS на ExtensionDelegate. Это очень важно, потому что соответствующий WCSession настроен на watchOS, но на iPhone реализован в двух разных местах, например, ej. в делегате приложения, а затем в первом viewcontorllweer приложения (в моем случае) приводит к нестабильному поведению, и это основная причина, по которой иногда приложение iOS перестает отвечать при получении сообщения от часов.
3 - повторную активацию сеанса рекомендуется делать только в хост-приложении. Это пример моего приложения для iOS только с одним WCSessionDelegate. (AppDelegate)
#pragma mark - WCSessionDelegate
- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(NSError *)error{
if( activationState == WCSessionActivationStateActivated) {
NSLog(@"iPhone WKit session Activated");
}else if (activationState == WCSessionActivationStateInactive) {
NSLog(@"iPhone WKit Inactive");
}else if (activationState == WCSessionActivationStateNotActivated) {
NSLog(@"iPhone WKit NotActivated");
}
}
- (void)sessionDidBecomeInactive:(WCSession *)session{
/*
The session calls this method when it detects that the user has switched to a different Apple Watch. While in the inactive state, the session delivers any pending data to your delegate object and prevents you from initiating any new data transfers. After the last transfer finishes, the session moves to the deactivated state
*/
NSLog(@"sessionDidBecomeInactive");
if (session.hasContentPending) {
NSLog(@"inactive w/ pending content");
}
}
- (void)sessionDidDeactivate:(WCSession *)session{
// Begin the activation process for the new Apple Watch.
[[WCSession defaultSession] activateSession];
//perform any final cleanup tasks related to closing out the previous session.
}
- (void)sessionReachabilityDidChange:(WCSession *)session{
NSLog(@"sessionReachabilityDidChange");
}
последнее, напишите соответствующую подпись метода, если вам нужен ответ, отправляющий данные от часов, возьмите подпись метода, у которого есть ответ: ... Согласно Apple следующие методы
sendMessage:replyHandler:errorHandler:, sendMessageData:replyHandler:errorHandler:, and transferCurrentComplicationUserInfo:
имеет более высокий приоритет и передается сразу. Все сообщения, полученные вашим приложением, доставляются делегату сеанса последовательно в фоновом потоке.
Так что не тратьте время на отправку объекта ответа в mainQueue в iOS appDelegate, дождитесь, пока ответ на watchOS вернется, и измените его на основной поток, чтобы соответствующим образом обновить пользовательский интерфейс.
person
Boris Ch.F
schedule
04.08.2017
error.userInfo[NSUnderlyingErrorKey]
)? Было бы хорошо увидеть код, который отправляет сообщение, и реализацию метода делегата, который должен его получать! - person ccjensen   schedule 19.10.2015