Я никогда не работал с WatchOS5 и хочу разработать горизонтальное усложнение (Modular large) для AppleWatch, например «Heart Rate». Идея в том, что я бы отображал данные о частоте пульса по-другому. Прямо сейчас я хочу развернуть усложнение в часы разработки.
Я создал новый проект с добавленным флажком "усложнение". Я вижу, что это добавил контроллер осложнений с заполнителями конфигурации временной шкалы.
Также есть раскадровка с кучей пустых экранов. Я не уверен, сколько усилий мне нужно вложить в приложение для часов Apple Watch, прежде чем я смогу его развернуть. Я вижу документ Apple это, но в нем не описывается, как расположить мое усложнение. В каком-то разделе отсутствуют ссылки.
Извините за полноценный проект для начинающих, я не видел проекта, посвященного конкретно горизонтальному усложнению для часов OS 5.
Вы сможете развернуть его немедленно, хотя он ничего не сделает. Посмотрите видео wwdc, объясняющее, как создать усложнение: видео
Вы не можете разложить сложную схему самостоятельно, вы можете выбрать из набора шаблонов, которые вы заполняете данными. Экраны, которые вы видите, предназначены для приложения для часов, а не для усложнения.
Необязательно поддерживать все стили сложности.
Логика усложнения является частью вашего расширения WatchKit, поэтому технически вам ничего не нужно в сопутствующем приложении для iOS, хотя я не уверен, сколько функций вы должны предоставить, чтобы пройти проверку приложения.
Добавление вашей графики в каталог ресурсов ничего не даст, вы должны ссылаться на них при настройке шаблонов.
Вот пример от Apple того, как общаться с приложением Apple Watch. Вам нужно внимательно прочитать файл readme примерно 25 раз, чтобы изменить все идентификаторы группы приложений в этом проекте.
Оригинальные ответы:
Измените приведенный выше пример, чтобы создать изображение-заполнитель, отображаемое на часах (когда вы выбираете усложнение при изменении макета экрана)
func getPlaceholderTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {
// Pass the template to ClockKit.
if complication.family == .graphicRectangular {
// Display a random number string on the body.
let template = CLKComplicationTemplateGraphicRectangularLargeImage()
template.textProvider = CLKSimpleTextProvider(text: "---")
let image = UIImage(named: "imageFromWatchExtensionAssets") ?? UIImage()
template.imageProvider = CLKFullColorImageProvider(fullColorImage: image)
// Pass the entry to ClockKit.
handler(template)
}else {
handler(nil);
return
}
}
отправка небольших пакетов на часы (не будет отправлять изображения!)
func updateHeartRate(with sample: HKQuantitySample){
let context: [String: Any] = ["title": "String from phone"]
do {
try WCSession.default.updateApplicationContext(context)
} catch {
print("Failed to transmit app context")
}
}
Передача изображений и файлов:
func uploadImage(_ image: UIImage, name: String, title: String = "") {
let data: Data? = UIImagePNGRepresentation(image)
do {
let fileManager = FileManager.default
let documentDirectory = try fileManager.url(for: .cachesDirectory,
in: .userDomainMask,
appropriateFor:nil,
create:true)
let fileURL = try FileManager.fileURL("\(name).png")
if fileManager.fileExists(atPath: fileURL.path) {
try fileManager.removeItem(at: fileURL)
try data?.write(to: fileURL, options: Data.WritingOptions.atomic)
} else {
try data?.write(to: fileURL, options: Data.WritingOptions.atomic)
}
if WCSession.default.activationState != .activated {
print("session not activated")
}
fileTransfer = WCSession.default.transferFile(fileURL, metadata: ["name":name, "title": title])
}
catch {
print(error)
}
print("Completed transfer \(name)")
}