Как создать усложнение для Apple WatchOS5?

Я никогда не работал с WatchOS5 и хочу разработать горизонтальное усложнение (Modular large) для AppleWatch, например «Heart Rate». Идея в том, что я бы отображал данные о частоте пульса по-другому. Прямо сейчас я хочу развернуть усложнение в часы разработки.

Я создал новый проект с добавленным флажком "усложнение". Я вижу, что это добавил контроллер осложнений с заполнителями конфигурации временной шкалы.

Также есть раскадровка с кучей пустых экранов. Я не уверен, сколько усилий мне нужно вложить в приложение для часов Apple Watch, прежде чем я смогу его развернуть. Я вижу документ Apple это, но в нем не описывается, как расположить мое усложнение. В каком-то разделе отсутствуют ссылки.

  • Могу ли я предоставить только один стиль усложнения (большой горизонтальный - большой модульный)
  • Нужно ли мне предоставлять какой-либо контент приложения для iPhone помимо управления логика усложнения, или я могу обойтись без контроллера представления?
  • Могу ли я контролировать появление своего усложнения, добавляя что-нибудь в папку с ресурсами (в ней есть множество графических слотов)?

Извините за полноценный проект для начинающих, я не видел проекта, посвященного конкретно горизонтальному усложнению для часов OS 5.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
4 547
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы сможете развернуть его немедленно, хотя он ничего не сделает. Посмотрите видео wwdc, объясняющее, как создать усложнение: видео

Вы не можете разложить сложную схему самостоятельно, вы можете выбрать из набора шаблонов, которые вы заполняете данными. Экраны, которые вы видите, предназначены для приложения для часов, а не для усложнения.

Необязательно поддерживать все стили сложности.

Логика усложнения является частью вашего расширения WatchKit, поэтому технически вам ничего не нужно в сопутствующем приложении для iOS, хотя я не уверен, сколько функций вы должны предоставить, чтобы пройти проверку приложения.

Добавление вашей графики в каталог ресурсов ничего не даст, вы должны ссылаться на них при настройке шаблонов.

Ответ принят как подходящий

Вот пример от Apple того, как общаться с приложением Apple Watch. Вам нужно внимательно прочитать файл readme примерно 25 раз, чтобы изменить все идентификаторы группы приложений в этом проекте.

  • Основные ресурсы приложения на телефоне не видны приложению для часов.
  • Ресурсы раскадровки ваших часов помещаются в цель WatchKit
  • Ресурсы, к которым вы получили доступ к программно, попадают в цель расширения для просмотра

Оригинальные ответы:

  • Могу ли я предоставить только один стиль усложнения (большой горизонтальный - модульный большой) - ДА
  • Нужно ли мне предоставлять какой-либо контент приложения для iPhone помимо управлять логикой усложнения, или я могу уйти, не имея посмотреть контроллер? ДА - приложения для часов имеют ограничения вычислений
  • Контролирую ли я появление моего осложнения с помощью добавление чего-либо в папку с ресурсами (в ней много графики слоты)? См. Ниже - это и папка с активами, и заполнители.

Измените приведенный выше пример, чтобы создать изображение-заполнитель, отображаемое на часах (когда вы выбираете усложнение при изменении макета экрана)

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)")
}

Другие вопросы по теме