Как проверить сценарий, когда Apple Watch не подключен к iPhone
Я разрабатываю расширение watchOS, которое использует WCSession
общаться с айфоном. Однако я не владею Apple Watch и поэтому вынужден полагаться на Watch Simulator для проверки моего кода.
Есть ли способ протестировать сценарий, когда часы отключены от телефона в симуляторе?
Если нет, есть ли какая-то документация или хорошо изученный пост в блоге, который дает некоторое представление о поведении WCSession
в этом случае?
5 ответов
Выход из симулятора iPhone должен позволить вам приблизиться к этому сценарию.
Я не думаю, что это возможно, потому что Apple Doc говорит,
Кроме того, приложения WatchKit имеют надежное соединение с имитируемым хост-устройством, поскольку они оба работают в симуляторе.
Apple упомянула об этом в разделе "Различия в оборудовании" в Руководстве пользователя Simulator
Вы должны использовать if-запрос, доступен ли iPhone до запуска запроса WC:
if (WCSession.defaultSession().reachable) {
//do your request here
} else {
//handle non-reachability
}
Если вы хотите проверить реакцию своего приложения на недоступность, просто замените WCSession.defaultSession().reachable
с false
,
Я понимаю, что вы действительно хотите испытательный сценарий.
Но какое направление для общения вы хотите проверить? Если вы проверите документацию WCSession
в нем всегда указывается поведение часов и устройства iOS.
Кроме того, что вы имеете в виду под "отключен"?
Вы можете проверить на WCSession.defaultSession().reachable
но документация гласит
В iOS значение YES, если парные Apple Watch находятся в зоне действия, а соответствующее приложение Watch запущено на переднем плане.
Вы можете проверить на paired
, но вы также должны проверить watchAppInstalled
,
Я считаю, что все общение является асинхронным. Хотите проверить свой errorHandler:
код как в
- (void)sendMessageData:(NSData *)data
replyHandler:(void (^)(NSData *replyMessageData))replyHandler
errorHandler:(void (^)(NSError *error))errorHandler
Я думаю, что это невозможно проверить на симуляторе. Вы можете только временно скопировать свой код errorHandler в replyHandler для тестирования.
Вот код, который я использую для проверки доступности:
if WCSession.isSupported() {
let session = WCSession.defaultSession()
session.delegate = _modelController
session.activateSession()
_modelController!.transferArrayToWatchWithSession()
}
и внутри _modelController
func transferArrayToWatchWithSession() {
let session = WCSession.defaultSession()
if WCSession.isSupported() && session.watchAppInstalled {
session.transferUserInfo([kWatchControlsDictKey:self.verifiedWatchArray])
} else {
log.info(....")
}
}
Выйдите из симулятора iPhone во время работы симулятора Apple Watch, и вы достигнете определенного состояния, которое вы описываете... Как и в случае с Apple Watch, симулятор Watch покажет значок отключенного телефона в верхней части экрана при выходе из симулятора iPhone. Смотрите изображение ниже.
Есть еще одно состояние, чтобы рассмотреть, что WCSession
может общаться только тогда, когда оба приложения находятся на переднем плане. Поэтому вам также следует протестировать сценарий, в котором часы и iPhone подключены (оба симулятора работают), но приложение iPhone не находится на переднем плане. (И аналогично, с приложением iPhone на переднем плане, когда часы подключены, но приложение Watch не на переднем плане.)
Вы можете смоделировать, что isReachable будет ложным, поместив приложение, которое находится на foregroundState, в backgroundState, нажав одну из этих двух кнопок на часах.
Это имеет тот же эффект, что и iPhone на два расстояния от часов, которые нужно подключить (вне зоны действия).
CF: https://developer.apple.com/documentation/watchconnectivity/wcsession/1615683-isreachable.
По сей день нет способа смоделировать отключение напрямую, или я не нашел его, isReachable все еще верен, если ваш выключите симулятор iPhone, чтобы имитировать отключение.
Просто поместите свою функцию, которую вы хотите протестировать, в sessionReachabilityDidChange(_ session: WCSession) делегата и предположите, что она имеет такой же эффект.